DataTable 使用手册
v1.15.0 · @snowui-design-system/components
许可阅读:首次阅读组件文档、源码或 npm 使用流程,先读完整 LICENSE;同任务同版本去重。公开 API 配置与内部实现修改分别按许可处理;全部组件使用统一运行包,源码权益以许可为准。
组件介绍
统一管理数据的查询、排序与分页状态,可自由组合工具栏、表格和分页器,构建完整的数据浏览界面。
使用选择
文件或记录列表需要搜索、筛选、排序、分页、勾选或操作列时使用。DataTable 协调数据状态,内部组合 TableToolbar、Table 系列与 Pagination;纯展示用 Table。选择需显式启用 selection,并使用稳定 rowKey 与行 rowId;操作列通过 actions 配置。业务请求函数与数据格式化由页面提供。
client 模式在本地处理数据,server 模式由页面请求与提供结果;children 接收当前渲染状态。
显式启用 selection / actions;rowKey 默认是索引,排序或更新数据时应改用稳定业务 ID,并让 TableRow.rowId 与其一致。
页码从 1 开始;首次 loading、后台 refreshing 和追加 loadMore 是不同状态。
快速开始
以下示例展示推荐的基本组合。更多场景与组合限制见后文。
API
未重新声明的继承能力请查所属基础组件文档;本表只列本组件源码具名公开属性。
使用边界与详细说明
列标题通过 TableHead 的 children 插槽传入,支持文字、图标及非交互组件组合。纯图标标题需提供可访问名称;可排序列不要在标题内嵌套交互控件。详见 TableHead 图标与组件标题。
布局模型
主布局模型:复合管理布局。
结构:
Root Frame(column 状态与组合外壳)
使用方组合的 TableToolbar(可选固定操作区)
Table(语义表格区)
Pagination(可选分页区)
使用方声明的 loading / error / empty 等其他状态区
局部布局来源:Root Frame 使用 column + contentFill 管理直系区域;TableToolbar 保持自身的 row 槽位宿主布局,Table 保持原生表格布局,Pagination 保持内联外壳布局。DataTable 只协调区域排列和数据状态,不改写子组件的主布局模型。
padding 归属:DataTable 根层不制造 padding;工具栏、表格 Cell、分页和自定义状态区分别由各自组件负责。内部 Table 的表头与数据 Cell 左右 padding 按 Table 容器宽度在 4px 到 12px 之间响应,上下保持 8px,表格外缘最小 8px、相邻列内容间最小 8px;DataTable 不复制单元格 padding 实现。
gap 归属:Root Frame 统一控制直系区域间距,默认为 var(--gap-3)(12px);子组件内部 gap 由子组件自身控制。
滚动归属:DataTable 不另建滚动区,水平溢出直接继承内部 Table 的局部横向 viewport 与视口贴底轨道;纵向虚拟化或固定表头仍由上层业务区域明确提供。loadMoreMode="auto" 只在 DataTable 内部观察表尾哨兵:优先使用最近的纵向滚动祖先作为 root,找不到时使用页面视口,不改变纵向滚动容器归属。
columnId 与行对象字段同名时,DataTable 自动读取原始字段并使该 TableHead 可排序。因此日期列保存 Date、数字时间戳或带时区的 ISO 8601 日期时间即可,不需要声明 sortType: "date"。展示值来自计算结果时传 sorters。无同名字段且无 sorter 的 TableHead 保持静态。
未在任何 TableHead 或 DataTable 上声明 defaultSort,且当前 sort === undefined 时,DataTable 不推导第一列升序,也不施加任何其他隐式排序。客户端模式直接保留 rows prop 的输入顺序;页面传入 filteredRows 时,就恢复 / 保持 filteredRows 的原始相对顺序。
TableHead defaultSort 同时定义默认列与默认方向,优先于 DataTable 自身的兼容 prop。默认时该列按“默认 → 反向 → 默认”循环,仅反向显示激活视觉。TableHead 同时声明 defaultSortActive 时,默认方向也显示激活视觉,循环改为“默认 → 反向 → 无排序 → 默认”。其他列保持“无排序 → ascending → descending → 无排序”。
相对日期的正确写法是 formatDate(row.createdAt, { relative: true, now })。排序继续比较 row.createdAt,不会比较 Just now。
DataTable 的工具栏、Table 和 Pagination 默认区域间距为 12px。striped 从第一行开始使用 Surface/3 作为奇数行背景,不显示分割线,所有数据行始终保持 12px 外缘圆角;divided 的表头与静态数据行两端保持直角,表头下边线为 Black/20% 0.5px,数据行分割线为 Black/10% 0.5px,末行无分割线。分割线模式下,hover 行首尾形成 12px 圆角,且上下相邻分割线同时隐藏;鼠标移出时背景立即退场,不显示圆角恢复直角的背景残影。
响应式
与 Table 共用完整响应式规则:先角色列转浮层,再压缩间距,最后滚动或从右向左隐藏普通列。horizontalScroll 默认 true;设为 false 时允许隐藏,TableHead responsiveHide={false} 保护指定列,第一普通列始终保留。最终单列的纯文本可收缩,不换行内容省略并默认提供 Tooltip 全文;硬尺寸或不可压缩控件仍滚动兜底。Table 的显式配置优先;DataTable 不另建测量或滚动层。
选择列与操作列
默认 只读表:selection={false}、actions={false},不显示 checkbox 列与操作列。markup 中仍可声明 <TableHead as="selection" /> / <TableCell as="actions"> 等;DataTable 关闭时整列不渲染、不参与列注册。
只读默认态同时跳过行选择 Set 查询与全选集合扫描;TableRow 不读取选中状态、不注册 rowId。开启 selection 后再恢复完整选择路径,DOM 与交互协议不变。
actions={true} 保留原有显式组合:业务仍可在每个 <TableCell as="actions"> 中自行书写按钮。传入配置对象时,未声明 children 的 actions Cell 默认使用 OverflowActions;显式 children 始终替换默认内容。
配置模式的默认列宽为 160px;compact="auto"、overflow="all"、overflowFrom="end"。resizable 默认 false;仅 roleLayout="column" 支持 actions 列拖动,overlay 模式始终不提供列宽 Indicator。拖动结果由 Table 的 columnWidths.__actions 接管并实时下发到各行;每个 OverflowActions 接收数值 availableWidth,不会为每个 Cell 新建尺寸观察器。overlay 模式使用同一 actions 宽度作为浮层宽度。
当 More 菜单展开时,当前响应式分配被冻结,行 hover 显隐规则也把打开的 SelectButton 视为保持可见,避免列宽或指针离开行后触发器消失。Separator 只在两侧仍有操作时保留,不会独立留在可见区域或菜单首尾。
行预览
配置 onRowPreview 后,DataTable 通过 Table Context 向 TableRow 提供行预览处理器。TableRow 只在行内空白区域触发该处理器;点击链接、按钮、输入控件、选择列或 actions 列控件不会触发行预览。未配置 onRowPreview 时,行内空白点击不响应;selection={true} 时选择仍由 selection 角色列负责。
首次加载 Skeleton rows
loading && rows.length === 0 时,DataTable 通过 Table Context 向后代 TableBody 提供首次加载语义;TableBody 保留真实 TableHeader,并按已注册的 TableHead 列结构自动生成与当前 pageSize 相同数量的 40px Skeleton 数据行。Skeleton 行使用真实 tr / td 语义结构但整体 aria-hidden,DataTable 根继续输出 aria-busy="true"。
骨架行数直接跟随规范化后的
pageSize;默认pageSize=10,因此未设置分页行数时生成 10 行。不提供独立 Skeleton 行数属性,避免加载态与真实分页数据高度不一致,尽可能降低首次数据出现时的页面跳动。
Skeleton 只替代首次空数据加载;
loading或refreshing时若已有 rows,继续保留现有数据,并在 TableBody 末尾追加跨列居中的 Spinner 行,避免刷新时布局跳动且明确表达仍在加载。TableHead通过双方文档明确的 Table Context 注册列顺序、角色与列宽标识;DataTable / TableBody 不扫描子组件类名或内部 DOM。TableBody loading={false}可显式关闭从 DataTable Context 继承的 Skeleton rows;独立 Table 可用<TableBody loading>主动启用,此时无法读取分页行数,回退为 10 行。
操作组配置与视觉预算
actions配置新增maxVisible(缺省3)、buttonProps、parts和moreLabel,类型复用OverflowActions;单项支持target/rel/buttonProps/parts。缺省progressive从末端收纳,显式all、compact与方向保持。组级样式只作用于默认生成组,单项buttonProps优先于单项parts.Button。显式children替换默认内容;其中OverflowActions共享本表布局预算,不继承默认生成组的视觉。
操作区先按本表实际可见viewport的20%、14rem及显式/拖动列宽上限取小,并预留选择和受保护数据宽度;总预算包含padding、More及渐隐覆盖。More最小命中尺寸优先,极窄冲突时局部滚动,不缩小字体/控件或为保操作先隐藏数据。
DataTable 样式覆盖
先阅读 完整 LICENSE;同任务、同版本、同范围去重。
优先用组件公开 Props 匹配合适样式,尽可能保留原有视觉。确需改写时按 样式选择与改写顺序 使用自己的 class(含项目已有 Tailwind)或实例 style。以下名称来自源码实际消费的公开 override;先核对目标作用域,不修改私有 DOM。采用 SnowUI Token 时选择正确类别,外部应用不被要求安装一方 utilities。
本组件源文件没有直接消费已登记的专属 override。组合子组件的样式通过公开 parts 或显式 child 配置;不要凭名称猜测变量。
DataTable 类型与状态
必填属性:无具名必填属性。
可双向绑定:bind:sort、bind:query、bind:filters、bind:page、bind:pageSize、bind:state、bind:selectedRowIds。
继承声明:Omit<FrameProps, "children" | "variant">。继承能力以基类公开文档为准;Omit 中的字段已排除,不能按基类原样使用。
以下为公开属性实际引用的类型声明,来自源码;Svelte Snippet 表示内容片段,ComponentProps 表示对应组件的 Props。
DataTableMode
来源:components/src/components/DataTable.svelte
Sorter
来源:components/src/components/DataTable.svelte
Searcher
来源:components/src/components/DataTable.svelte
Filterer
来源:components/src/components/DataTable.svelte
TableSortState
来源:components/src/lib/table-context.svelte.ts
TableSortDirection
来源:components/src/lib/table-context.svelte.ts
DataTableLoadMore
来源:components/src/components/DataTable.svelte
DataTableLoadMoreRequest
来源:components/src/components/DataTable.svelte
DataTableLoadMoreSource
来源:components/src/components/DataTable.svelte
DataTableLoadMoreMode
来源:components/src/components/DataTable.svelte
DataTableRenderState
来源:components/src/components/DataTable.svelte
DataTableVariant
来源:components/src/components/DataTable.svelte
DataTableActionsConfig
来源:components/src/components/DataTable.svelte
DataTableActionsItem
来源:components/src/components/DataTable.svelte
DataTableActionItem
来源:components/src/components/DataTable.svelte
OverflowActionsActionItem
来源:components/src/components/OverflowActions.svelte
OverflowActionIcon
来源:components/src/logic/overflow-actions.svelte.ts
GlobalButtonProps
来源:components/src/components/OverflowActions.svelte
ButtonProps
来源:components/src/components/OverflowActions.svelte
ControlledGlobalButtonKeys
来源:components/src/components/OverflowActions.svelte
DataTableActionSeparatorItem
来源:components/src/components/DataTable.svelte
TableRoleLayout
来源:components/src/lib/table-context.svelte.ts
TableRoleOverlayBlurMode
来源:components/src/lib/table-context.svelte.ts