iter(g302): 表头接上多列排序(Shift 叠加)
This commit is contained in:
@@ -72,28 +72,31 @@ export function dataTable<T extends { id: RowKey }>(props: DataTableProps<T>): H
|
||||
headCheck.indeterminate = onPage > 0 && onPage < keys.length;
|
||||
});
|
||||
|
||||
/*** 排序标记:升 ↑ / 降 ↓ / 未排序 ↕(可点击提示) ***/
|
||||
/*** 排序标记:升 ↑ / 降 ↓ / 未排序 ↕;多列排序时追加优先级序号(↑1 / ↓2) ***/
|
||||
const sortMark = (key: string) =>
|
||||
h(
|
||||
'span',
|
||||
{ class: 'ua-sort-mark' },
|
||||
() => {
|
||||
const rule = state().sorting.find((r) => r.key === key);
|
||||
return rule ? (rule.dir === 'asc' ? '↑' : '↓') : '↕';
|
||||
const rules = state().sorting;
|
||||
const at = rules.findIndex((r) => r.key === key);
|
||||
if (at === -1) return '↕';
|
||||
const arrow = rules[at].dir === 'asc' ? '↑' : '↓';
|
||||
return rules.length > 1 ? `${arrow}${at + 1}` : arrow; // 只有多列参与排序时才显示序号,单列保持原样
|
||||
},
|
||||
);
|
||||
|
||||
const th = (col: (typeof props.columns)[number]) => {
|
||||
const toggle = () => col.sortable && table.dispatch({ type: 'toggleSort', key: col.key }); // 鼠标与键盘共用的排序入口
|
||||
const toggle = (multi: boolean) => col.sortable && table.dispatch({ type: 'toggleSort', key: col.key, multi }); // multi 由 Shift 决定:叠加 / 单列
|
||||
const el = h(
|
||||
'th',
|
||||
{
|
||||
class: `${col.sortable ? 'ua-sortable' : ''}${col.align ? ` ua-align-${col.align}` : ''}`.trim(),
|
||||
scope: 'col', // 表头单元格语义:读屏据此把列标题与数据格关联
|
||||
tabindex: col.sortable ? '0' : null, // 可排序表头进 Tab 序,不可排序的不抢焦点
|
||||
onClick: toggle,
|
||||
onClick: (e: MouseEvent) => toggle(e.shiftKey), // Shift+点击 = 多列叠加排序(内核按 rules 顺序逐列比较)
|
||||
onKeydown: (e: KeyboardEvent) => {
|
||||
if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggle(); } // Enter / 空格 等价鼠标点击
|
||||
if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggle(e.shiftKey); } // Enter / 空格 等价鼠标点击,Shift 同样生效
|
||||
},
|
||||
},
|
||||
col.header ?? col.key,
|
||||
|
||||
@@ -2005,6 +2005,7 @@
|
||||
"steps": [
|
||||
"准备行数据,确保每行有唯一 id(跨页选择与刷新不丢行靠它)",
|
||||
"定义 columns:sortable: true 的列表头可点击排序(升 → 降 → 取消循环),标记箭头 ↑↓↕",
|
||||
"多列排序:按住 Shift 点第二个可排序列即叠加——内核按 rules 顺序逐列比较,表头标记带优先级(↑1 / ↓2),不按 Shift 则回到单列语义",
|
||||
"列展示细节用皮肤字段:align 控制表头与单元格对齐,format(value, row) 返回纯文本(走 textContent,不需要转义)",
|
||||
"数据源可以给信号或 computed(如筛选结果):变化时内核整体换源,选择状态按 rowKey 剔除已消失的行,排序与页码不被打断",
|
||||
"列宽用内核字段 width:数字(像素)固定该列,'flex' 或不设则按内容自适应",
|
||||
|
||||
Reference in New Issue
Block a user