iter(g247): 表格支持整体换数据源,dataTable 可接信号数据

This commit is contained in:
HIsheR
2026-10-26 22:03:37 +08:00
parent 19741b52b6
commit 42ea31d5b5
11 changed files with 103 additions and 27 deletions
+6 -6
View File
@@ -4,8 +4,8 @@ import {
paginationPlugin,
selectionPlugin,
sortPlugin,
type RowKey,
} from '@ui-arch/table-core';
import type { RowKey } from '@ui-arch/table-core';
import { iconSearch } from './icons.js'; import { computed, effect, h, renderList, signal } from '@ui-arch/frame';
import { attachResize } from './columnResize.js';
import { exportButton } from './csv.js';
@@ -13,23 +13,23 @@ import { button } from './button.js';
import { skeleton } from './skeleton.js';
import { textField } from './textField.js';
import { emptyRow } from './tableEmpty.js';
import { attachDataSource, readRows } from './tableDataSource.js';
import type { DataTableProps, TableApi } from './types.js';
/*** 数据表格:粘性表头 + 行选择 + 排序 + 筛选 + 分页 + 空状态;状态由 table-core 持有,信号只做桥接渲染 ***/
export function dataTable<T extends { id: RowKey }>(props: DataTableProps<T>): HTMLElement {
// —— 状态集中声明 ——
const selectable = props.selectable ?? false; // 行选择开关
const selectable = props.selectable ?? false; // 状态集中声明:行选择开关
const keyword = signal(''); // 筛选框关键字:受控信号,空状态里的「清除筛选」靠它一键还原
const table = createTable({
data: props.data,
data: readRows(props.data), // 信号数据源先取当前值,后续靠 attachDataSource 换
columns: props.columns,
rowKey: 'id',
plugins: [filterPlugin<T>(), sortPlugin<T>(), paginationPlugin<T>(), selectionPlugin<T>()],
initialState: { pagination: { page: 1, pageSize: props.pageSize ?? 5 } },
});
const api = table as unknown as TableApi<T>; // 用到的两个取数方法在类型别名里声明
const version = signal(0); // 桥接信号:table-core 订阅通知 → 递增触发信号系统
table.subscribe(() => version(version() + 1));
const version = signal(0); // 桥接信号:table-core 订阅通知 → 递增 → 派生统一重算
table.subscribe(() => version(version() + 1)); attachDataSource(table, props.data); // 信号数据源变化即换源(静态数组直接返回)
// —— 派生:全部由 version 单一来源推导,语义与内核一致 ——
const visible = computed(() => {