返回目录
组件详情入口
数据展示
@vean/ui
STable

Table

Table 属于 数据展示 分类。建议先看演示与用法,再对照 API 表格完成接入和样式调整。

先用快捷跳转面板找到概述、用法、演示和 API,再往下细读完整文档内容。

快速跳转

同分类组件

如果你在同一类交互里做组合,这些组件通常会一起出现。

表格

概述

用于展示行列数据的数据表格组件。STable 将 Aria 层 TableCompact 聚合组件(TableRoot 一族的 9 个基础原语,零样式)与 tableVariants 样式配方(29 个槽位,7 种尺寸 × 2 种视觉变体)组合。支持配置式 columns(分组表头、index/selection/expand 类型列)、排序、筛选、多选/单选、展开行与树形行、固定列/表头、列宽拖拽调整与键盘调整、虚拟滚动与空状态展示;default/simple 两种变体配合 bordered/rounded/striped 开关。所有交互文案与 aria-label(排序、筛选、选择、展开、列宽调整)均经 useLocaleMessages 本地化。

用法

特性

  • 📋 配置式列模型 — TanStack 优先的 columns: TableColumn<T>[](accessorKey/header/size/minSize + VeanUI 扩展 align/type/fixed/hidden),分组表头(columns)、index/selection/expand 类型列;rowKey 保证行身份稳定
  • 🔀 排序 — 列上 enableSorting: true(或 sortFn 自定义比较);受控 sorting / v-model:sorting(TanStack SortingState);aria-sort + 排序按钮 aria-label 本地化
  • 🔍 筛选 — 列上 enableColumnFilter: true(+ filterPlaceholder/filterOptions);{ keyword, values } 复合筛选值,弹层内关键字搜索、选项多选、汇总计数与清除操作全部本地化;状态为 TanStack ColumnFiltersState(v-model:columnFilters)
  • ✅ 选择 — 默认多选(multiple 默认 true,复选框 + 表头全选),multiple={false} 切换为单选(行内 radio);受控 selected / v-model:selected
  • 🧩 展开与树形 — expand 类型列或 expanded-row 插槽渲染展开行;children/getChildren 驱动树形行(引擎 getSubRows);expanded 遵循 TanStack ExpandedState
  • 📐 固定与调整 — fixed: 'start' | 'end' 播种 TanStack 列固定(pinning)+ 阴影渐变指示;resizable 列支持指针拖拽与方向键键盘调整,写入 TanStack columnSizing(aria-label 本地化)
  • ⚡ 性能 — virtual + height 启用虚拟滚动(自定义 estimateSize/virtualizerOptions),仅渲染可视行
  • 🎛️ 引擎逃生舱 — 插槽 props 携带 table/engineColumn 引擎实例;useTableEngine() 在表格子树任意位置注入引擎;模板 ref 暴露 table;tableOptions prop 透传原始 TanStack 选项(分页、行选择、manual 服务端模式、meta、initialState…)
  • 🌐 默认本地化 — 空状态、排序/筛选/选择/展开/列宽调整的 aria-label 与筛选弹层文案全部经 useLocaleMessages(21 条 table.* 消息,14 语言包)

组件家族

  • STable(styled)— 入口包装;tableVariants 配方(29 槽位 = 16 个 Aria 槽 + 11 个筛选/选择扩展槽 + 2 个内部 radio 槽);useOmitProps 转发 + useForwardListeners 事件合并 + 全插槽透传;注入默认 header-selection/selection/header-sort/header-filter/header-resize/tree-toggle/expand/empty 插槽内容
  • TableCompact(Aria)— 聚合状态所有者,构建在 @tanstack/vue-table 引擎之上:useTableCompactState(sorting/columnFilters/expanded/columnPinning/columnSizing 经 useControllableState,selected/multiple 经 useSelection)、useTableCompactTable(引擎实例接线)、useTableCompactData(表头分组/叶子列/行模型)、useTableCompactResize(指针 + 键盘列宽)、useTableCompactVirtual;provideTableCompactContext 桥接 9 个原语
  • TableRoot(Aria)— 根元素,dir 方向,渲染 data-vean-table-root 与表语义容器
  • TableScroll / TableContent / TableHeader / TableBody / TableFooter / TableRow / TableHead / TableCell(Aria)— 9 个基础原语,全部零样式,渲染 data-vean-table-* 数据属性
  • TableCompactHead / TableCompactRow / TableCompactCell / TableCompactExpandedRow / TableVirtualSpacerRow(Aria 内部)— Compact 聚合内部的组合与渲染组件(不对外导出)
  • STableFilterPopover(styled 内部)— 筛选弹层(SPopover + SInput + SCheckbox + SButton),本地化搜索/选项/汇总/清除
  • STableRadio(styled 内部)— 单选模式的行内 radio 按钮(aria-pressed 语义),直接消费 tableVariants 的 radioRoot/radioIndicator 槽
  • useTable / usePaginatedTable(UI hooks)— 客户端排序/筛选/分页组合钩子

演示

基础

#NameAgeHeader AddressDetails
1John Doe30123 Main St
2Jane Smith25456 Elm St
3Bob Johnson40789 Oak St
4Alice Brown35321 Pine St
5Charlie Davis28654 MapleDetail for Charlie Davis
6Eve White32987 Cedar St
7Frank Green45246 Birch St
8Grace Lee27135 Spruce St
9Hank Miller38864 Willow St
10Ivy Wilson29753 Aspen St

空状态

#NameAgeAddress

暂无数据

当前没有可显示的数据。

#NameAgeAddress

No matching records

Try adjusting filters or create the first record from here.

分组

ProfileMetrics
NameCityAgeScore
Ada LovelaceLondon3696
Linus TorvaldsHelsinki2888
Grace HopperNew York4192

排序

NameAgeScore
Ada Lovelace3696
Linus Torvalds2888
Grace Hopper4192

过滤

NameCityScore
Ada LovelaceLondon96
Linus TorvaldsHelsinki88
Grace HopperNew York92

固定

Two columns stay pinned on the left and the score stays pinned on the right while the table scrolls horizontally.

Employee IDNameRoleTeamStatusLocationTimezoneEmailPhoneProjectsUtilizationLast UpdatedScore
ENG-001Ada LovelaceArchitectCore PlatformActiveLondonUTC+0[email protected]+44 20 7946 001491%2026-04-1096
ENG-014Linus TorvaldsMaintainerKernel SystemsReviewingHelsinkiUTC+2[email protected]+358 9 1234 014684%2026-04-1288
ENG-021Grace HopperScientistDeveloper ExperienceActiveNew YorkUTC-4[email protected]+1 212 555 0021589%2026-04-1492
ENG-037Margaret HamiltonTech LeadDesign SystemsPlanningBostonUTC-4[email protected]+1 617 555 0037376%2026-04-0994
ENG-052Katherine JohnsonAnalystData IntelligenceActiveHamptonUTC-4[email protected]+1 757 555 0052793%2026-04-1398

可调整列宽

Drag any header handle to adjust the column width.

Employee IDNameRoleTeamStatusLocationTimezoneEmailPhoneProjectsUtilizationLast UpdatedScore
ENG-001Ada LovelaceArchitectCore PlatformActiveLondonUTC+0[email protected]+44 20 7946 001491%2026-04-1096
ENG-014Linus TorvaldsMaintainerKernel SystemsReviewingHelsinkiUTC+2[email protected]+358 9 1234 014684%2026-04-1288
ENG-021Grace HopperScientistDeveloper ExperienceActiveNew YorkUTC-4[email protected]+1 212 555 0021589%2026-04-1492
ENG-037Margaret HamiltonTech LeadDesign SystemsPlanningBostonUTC-4[email protected]+1 617 555 0037376%2026-04-0994
ENG-052Katherine JohnsonAnalystData IntelligenceActiveHamptonUTC-4[email protected]+1 757 555 0052793%2026-04-1398

树形

NameAgeRole
Engineering
12Department
Platform Team
6Team
Design Team
4Team
Operations
8Department

虚拟滚动

#NameAgeAddress
1User 120Block 1, Soybean Street
2User 221Block 2, Soybean Street
3User 322Block 3, Soybean Street
4User 423Block 4, Soybean Street
5User 524Block 5, Soybean Street
6User 625Block 6, Soybean Street
7User 726Block 7, Soybean Street
8User 827Block 8, Soybean Street
9User 928Block 9, Soybean Street
10User 1029Block 10, Soybean Street
11User 1130Block 11, Soybean Street
12User 1231Block 12, Soybean Street
13User 1332Block 13, Soybean Street
14User 1433Block 14, Soybean Street
15User 1534Block 15, Soybean Street
16User 1635Block 16, Soybean Street

可展开

NameAgeAddress
John Doe30123 Main St
Jane Smith25456 Elm St
Bob Johnson40789 Oak St

底部

#NameAgeAddress
1John Doe30123 Main St
2Jane Smith25456 Elm St
3Bob Johnson40789 Oak St
Total: 3 items

底部

#NameAgeAddress
1John Doe30123 Main St
2Jane Smith25456 Elm St
3Bob Johnson40789 Oak St
This is the bottom slot content

多选

NameAgeAddress
John Doe30123 Main St
Jane Smith25456 Elm St
Bob Johnson40789 Oak St
Selected IDs: [ 1, 2 ]

单选

NameAgeAddress
John Doe30123 Main St
Jane Smith25456 Elm St
Bob Johnson40789 Oak St
Selected: 1

行事件

NameRoleRegion
Ada LovelaceArchitectLondon
Linus TorvaldsMaintainerHelsinki
Grace HopperCompiler LeadNew York

Latest row event

Click, double click, or right click a row to inspect the emitted payload.

rowKey
-
index
-
level
-

rowData

{
  "rowData": null
}

rowMouseenter and rowMouseleave use the same payload shape when you need hover-driven behavior.

  • 01 Basic — 基础 columns + data 渲染
  • 02 Variant — default / simple 视觉变体
  • 03 Bordered — bordered 边框开关
  • 04 Rounded — rounded 圆角开关
  • 05 Striped — striped 斑马纹
  • 06 Empty — 空状态(默认 SEmpty 与自定义 empty 插槽)
  • 07 Grouped — 分组表头(columns)
  • 08 Sorting — enableSorting + sortFn + 受控/非受控排序
  • 09 Filtering — enableColumnFilter 选项与关键字筛选弹层
  • 10 Fixed — fixed: 'start' | 'end' 固定列
  • 11 Resizable — resizable 列宽拖拽/键盘调整
  • 12 Tree — 树形行(数据 children + tree-toggle)
  • 13 Virtualized — virtual + height 虚拟滚动
  • 14 Expandable — expand 列与 expanded-row 插槽
  • 15 Footer — footer 汇总插槽
  • 16 Bottom — bottom 底部插槽
  • 17 Multiple Selection — 多选(复选框 + 全选)
  • 18 Single Selection — multiple={false} 单选(radio)
  • 19 Row Events — rowClick/rowDblclick/rowContextmenu 等行事件
  • 20 Sizes — 7 种尺寸(xs–2xl)

API

Aria 层

29

Table<T, R, M>

39 属性11 事件15 插槽
属性
属性名类型默认值描述
class
ClassValue
—
需应用于表格的其他类名。
size
ThemeSize
—
组件的视觉尺寸。
ui
Partial<TableExtendedUi>
—
该组件的按槽类重写。
variant
TableVariant
—
该组件的视觉变体。
bordered
boolean
—
是否带边框。
rounded
boolean
—
是否四舍五入。
striped
boolean
—
是否采用条纹样式。
columns
TableColumn<T>[]
—
列定义。TanStack 的列定义具有最高优先级。
data
T[]
—
数据。
rowKey
(row: T) => R
—
行键。
getChildren
((row: T) => T[])
—
嵌套子节点解析器用作引擎的 `getSubRows`。
sorting
SortingState
—
排序状态(TanStack `SortingState`)。
defaultSorting
SortingState
—
默认排序状态。
tableOptions
TableEngineOptions
—
通过 TanStack `useTable` 调用传递的引擎选项。该 组件拥有的键(data、columns、state wiring、owned change handlers)将 被该组件覆盖;其余所有选项将解锁引擎的 全部功能(分页、行选择、手动模式、meta、initialState...)。
columnFilters
ColumnFiltersState
—
列过滤器状态(TanStack `ColumnFiltersState`)。过滤器值接受 由内置过滤器处理的复合格式 `{ 关键字, 值 }`。
defaultColumnFilters
ColumnFiltersState
—
默认列过滤器状态。
expanded
ExpandedState
—
展开状态(TanStack `ExpandedState`)。
defaultExpanded
ExpandedState
—
默认展开状态。
defaultExpandAll
boolean
—
是否默认展开所有行。
columnPinning
ColumnPinningState
—
列固定状态(TanStack `ColumnPinningState`)。当此属性缺失时,列的 `fixed` 字段将作为默认状态的初始值。
defaultColumnPinning
ColumnPinningState
—
默认列固定状态。
columnSizing
ColumnSizingState
—
列尺寸状态(TanStack `ColumnSizingState`,以列 ID 为键的 px 值)。
defaultColumnSizing
ColumnSizingState
—
默认列宽设置状态。
indent
number
—
对嵌套项应用缩进宽度。
virtual
boolean
—
是否为虚拟。
height
string | number
—
高度。
estimateSize
number | ((index: number, row: T) => number)
—
估算文档篇幅。
virtualizerOptions
VirtualizerOptions
—
Virtualizer 选项。
contentProps
TableContentProps
—
转发给内容元素的属性。
headerProps
TableHeaderProps
—
转发至 header 元素的属性。
bodyProps
TableBodyProps
—
转发至 body 元素的属性。
footerProps
TableFooterProps
—
转发至页脚元素的属性。
headProps
TableHeadProps
—
转发至 head 元素的属性。
rowProps
TableRowProps
—
转发给 row 元素的属性。
cellProps
TableCellProps
—
转发给 cell 元素的属性。
dir
Direction
—
组件的阅读方向。
defaultSelected
(M extends true ? R[] : R)
—
默认选中。
selected
(M extends true ? R[] : R)
—
该项是否已被选中。
multiple
M
—
是否支持多个值。
事件
事件名参数描述
update:sorting
SortingState
在排序状态值发生变化时触发。
update:columnFilters
ColumnFiltersState
当列过滤器状态值发生变化时触发。
update:expanded
ExpandedState
当展开后的状态值发生变化时触发。
update:columnPinning
ColumnPinningState
当列固定状态值发生变化时触发。
update:columnSizing
ColumnSizingState
当列宽调整状态值发生变化时触发。
update:selected
M extends true ? R[] : R | undefined
在选定状态发生变化时触发。
rowClick
MouseEvent, payload: TableRowEventPayload<T, R>
在点击行时触发。
rowDblclick
MouseEvent, payload: TableRowEventPayload<T, R>
当双击某行时触发。
rowContextmenu
MouseEvent, payload: TableRowEventPayload<T, R>
在触发行上下文菜单时触发。
rowMouseenter
MouseEvent, payload: TableRowEventPayload<T, R>
当指针进入一行时触发。
rowMouseleave
MouseEvent, payload: TableRowEventPayload<T, R>
当指针离开一行时触发。
插槽
插槽名参数描述
bottom
—
底部区域的自定义内容。
header
TableHeaderSlotProps<T>
用于页眉插槽的自定义内容。
header-index
{ column: TableColumn<T>; }
用于页眉索引位置的自定义内容。
header-selection
TableHeaderSelectionSlotProps<T>
用于页眉选择槽位的自定义内容。
header-expand
{ column: TableColumn<T>; }
用于页眉展开区域的自定义内容。
header-filter
TableHeaderFilterSlotProps<T>
用于标题过滤器插槽的自定义内容。
header-sort
TableHeaderSortSlotProps<T>
用于页眉排序槽位的自定义内容。
header-resize
TableHeaderResizeSlotProps<T>
用于页眉调整大小插槽的自定义内容。
index
TableIndexSlotProps<T>
索引槽位的自定义内容。
selection
TableSelectionSlotProps<T>
用于选择槽位的自定义内容。
expand
TableExpandSlotProps<T>
“展开”区域的自定义内容。
expanded-row
TableExpandedRowSlotProps<T>
用于展开行插槽的自定义内容。
tree-toggle
TableTreeToggleSlotProps<T>
树状结构切换按钮的自定义内容。
empty
TableEmptySlotProps
为空槽位添加自定义内容。
footer
{ columnSize: number; }
页脚位置的自定义内容。

TableBody

TableCell

TableCompact<T, R, M>

32 属性11 事件15 插槽
属性
属性名类型默认值描述
columns
TableColumn<T>[]
—
列定义。TanStack 的列定义具有最高优先级。
data
T[]
—
数据。
rowKey
(row: T) => R
—
行键。
getChildren
((row: T) => T[])
—
嵌套子节点解析器用作引擎的 `getSubRows`。
sorting
SortingState
—
排序状态(TanStack `SortingState`)。
defaultSorting
SortingState
—
默认排序状态。
tableOptions
TableEngineOptions
—
通过 TanStack `useTable` 调用传递的引擎选项。该 组件拥有的键(data、columns、state wiring、owned change handlers)将 被该组件覆盖;其余所有选项将解锁引擎的 全部功能(分页、行选择、手动模式、meta、initialState...)。
columnFilters
ColumnFiltersState
—
列过滤器状态(TanStack `ColumnFiltersState`)。过滤器值接受 由内置过滤器处理的复合格式 `{ 关键字, 值 }`。
defaultColumnFilters
ColumnFiltersState
—
默认列过滤器状态。
expanded
ExpandedState
—
展开状态(TanStack `ExpandedState`)。
defaultExpanded
ExpandedState
—
默认展开状态。
defaultExpandAll
boolean
—
是否默认展开所有行。
columnPinning
ColumnPinningState
—
列固定状态(TanStack `ColumnPinningState`)。当此属性缺失时,列的 `fixed` 字段将作为默认状态的初始值。
defaultColumnPinning
ColumnPinningState
—
默认列固定状态。
columnSizing
ColumnSizingState
—
列尺寸状态(TanStack `ColumnSizingState`,以列 ID 为键的 px 值)。
defaultColumnSizing
ColumnSizingState
—
默认列宽设置状态。
indent
number
—
对嵌套项应用缩进宽度。
virtual
boolean
—
是否为虚拟。
height
string | number
—
高度。
estimateSize
number | ((index: number, row: T) => number)
—
估算文档篇幅。
virtualizerOptions
VirtualizerOptions
—
Virtualizer 选项。
contentProps
TableContentProps
—
转发给内容元素的属性。
headerProps
TableHeaderProps
—
转发至 header 元素的属性。
bodyProps
TableBodyProps
—
转发至 body 元素的属性。
footerProps
TableFooterProps
—
转发至页脚元素的属性。
headProps
TableHeadProps
—
转发至 head 元素的属性。
rowProps
TableRowProps
—
转发给 row 元素的属性。
cellProps
TableCellProps
—
转发给 cell 元素的属性。
dir
Direction
—
组件的阅读方向。
defaultSelected
(M extends true ? R[] : R)
—
默认选中。
selected
(M extends true ? R[] : R)
—
该项是否已被选中。
multiple
M
—
是否支持多个值。
事件
事件名参数描述
update:sorting
SortingState
在排序状态值发生变化时触发。
update:columnFilters
ColumnFiltersState
当列过滤器状态值发生变化时触发。
update:expanded
ExpandedState
当展开后的状态值发生变化时触发。
update:columnPinning
ColumnPinningState
当列固定状态值发生变化时触发。
update:columnSizing
ColumnSizingState
当列宽调整状态值发生变化时触发。
update:selected
M extends true ? R[] : R | undefined
在选定状态发生变化时触发。
rowClick
MouseEvent, payload: TableRowEventPayload<T, R>
在点击行时触发。
rowDblclick
MouseEvent, payload: TableRowEventPayload<T, R>
当双击某行时触发。
rowContextmenu
MouseEvent, payload: TableRowEventPayload<T, R>
在触发行上下文菜单时触发。
rowMouseenter
MouseEvent, payload: TableRowEventPayload<T, R>
当指针进入一行时触发。
rowMouseleave
MouseEvent, payload: TableRowEventPayload<T, R>
当指针离开一行时触发。
插槽
插槽名参数描述
bottom
—
底部区域的自定义内容。
header
TableHeaderSlotProps<T>
用于页眉插槽的自定义内容。
header-index
{ column: TableColumn<T>; }
用于页眉索引位置的自定义内容。
header-selection
TableHeaderSelectionSlotProps<T>
用于页眉选择槽位的自定义内容。
header-expand
{ column: TableColumn<T>; }
用于页眉展开区域的自定义内容。
header-filter
TableHeaderFilterSlotProps<T>
用于标题过滤器插槽的自定义内容。
header-sort
TableHeaderSortSlotProps<T>
用于页眉排序槽位的自定义内容。
header-resize
TableHeaderResizeSlotProps<T>
用于页眉调整大小插槽的自定义内容。
index
TableIndexSlotProps<T>
索引槽位的自定义内容。
selection
TableSelectionSlotProps<T>
用于选择槽位的自定义内容。
expand
TableExpandSlotProps<T>
“展开”区域的自定义内容。
expanded-row
TableExpandedRowSlotProps<T>
用于展开行插槽的自定义内容。
tree-toggle
TableTreeToggleSlotProps<T>
树状结构切换按钮的自定义内容。
empty
TableEmptySlotProps
为空槽位添加自定义内容。
footer
{ columnSize: number; }
页脚位置的自定义内容。

TableCompactCell

3 属性4 插槽
属性
属性名类型默认值描述
column
TableColumn<T extends TableBaseData = TableBaseData>
—
列定义。
row
TableTreeRow<T extends TableBaseData = TableBaseData, R extends TableUnifiedKey = TableUnifiedKey>
—
行。
index
number
—
当前条目的索引。
插槽
插槽名参数描述
index
TableIndexSlotProps<T>
索引槽位的自定义内容。
selection
TableSelectionSlotProps<T>
用于选择槽位的自定义内容。
expand
TableExpandSlotProps<T>
“展开”区域的自定义内容。
tree-toggle
TableTreeToggleSlotProps<T>
树状结构切换按钮的自定义内容。

TableCompactExpandedRow

3 属性
属性
属性名类型默认值描述
row
TableTreeRow<T extends TableBaseData = TableBaseData, R extends TableUnifiedKey = TableUnifiedKey>
—
行。
index
number
—
当前条目的索引。
colspan
number
—
Colspan。

TableCompactHead

1 属性
属性
属性名类型默认值描述
header
TableEngineHeader<T extends TableBaseData = TableBaseData>
—
引擎头文件实例。

TableCompactRow

3 属性
属性
属性名类型默认值描述
row
TableTreeRow<T extends TableBaseData = TableBaseData, R extends TableUnifiedKey = TableUnifiedKey>
—
行。
index
number
—
当前条目的索引。
leafColumns
TableColumn<TableBaseData>[]
—
叶子列。

TableContent

TableDataCell

TableEmpty

TableExpand

TableExpandedRow

TableFilterPopover<T>

14 属性
属性
属性名类型默认值描述
size
ThemeSize
—
组件的视觉尺寸。
ui
TableExtendedUi
—
该组件的按槽类重写。
column
TableColumn<T extends TableBaseData = TableBaseData>
—
在插槽作用域中暴露的列定义。
filterValue
string
—
过滤在插槽作用域中暴露的值。
filterValues
string[]
—
过滤在插槽作用域中暴露的值。
filterState
TableFilterValue
—
过滤在插槽作用域中暴露的状态。
filtered
boolean
—
是否经过过滤。
filterOptions
TableColumnFilterOption[]
—
过滤在插槽作用域中暴露的选项。
setFilterValue
(value: string) => void
—
设置在插槽作用域中暴露的过滤器值。
setFilterValues
(values: string[]) => void
—
设置在插槽作用域中暴露的过滤器值。
setFilterState
(value: TableFilterValue | undefined) => void
—
在插槽作用域中设置暴露的过滤器状态。
toggleFilterOption
(value: string) => void
—
在插槽作用域中显示过滤器选项。
isFilterOptionSelected
(value: string) => boolean
—
是否选中了过滤选项。
clearFilter
() => void
—
清除在插槽作用域中暴露的过滤器。

TableFooter

TableHead

TableHeader

TableHeaderFilter

TableHeaderResize

TableHeaderSelection

TableHeaderSort

TableIndex

TableRadio

2 属性
属性
属性名类型默认值描述
size
ThemeSize
—
组件的视觉尺寸。
checked
boolean
—
该项是否已勾选。

TableRoot

1 属性
属性
属性名类型默认值描述
dir
Direction
—
组件的阅读方向。

TableRow

TableScroll

TableSelection<R, M>

3 属性
属性
属性名类型默认值描述
defaultSelected
(M extends true ? R[] : R)
—
默认选中。
selected
(M extends true ? R[] : R)
—
该项是否已被选中。
multiple
M
—
是否支持多个值。

TableTreeToggle

TableVirtualSpacerRow

4 属性
属性
属性名类型默认值描述
isVirtual
boolean
—
是否启用了虚拟滚动。
colspan
number
—
分隔符所占的列数。
paddingStart
number
—
在行首添加了填充。
paddingEnd
number
—
在行尾添加填充。

说明

架构与对标差异

表格引擎为 @tanstack/vue-table(v9):列定义、排序、筛选、展开、固定、列宽均遵循 TanStack 状态契约(SortingState、ColumnFiltersState、ExpandedState、ColumnPinningState、ColumnSizingState),且全部经 useControllableState + useSelection 提供受控/非受控双通道;所有基础原语保持零样式,仅 UI 包装注入 tableVariants 类名。筛选弹层与单选 radio 作为 UI 内部组件被默认插槽消费,但消费者可用同名插槽(header-filter/selection 等)整体替换。排序按钮与筛选触发器为绝对定位图标按钮,配合本地化 aria-label 保持可访问;列宽调整同时支持指针(PointerEvent)与键盘(方向键)两种通道。虚拟滚动基于 @vean/aria 内置 virtualizer,仅渲染可视行并同步测量列宽。而 Ant Design / Element Plus 的表格为声明式组件实例(el-table-column),固定列依赖配置类名;VeanUI 的受控状态与 aria-sort 语义、以及全链路本地化(含筛选弹层)超出多数主流库。

能力VeanUIAnt DesignElement PlusNaive UIMantine Table
Aria/样式分离✅————
配置式 columns + 分组表头✅✅✅✅✅
排序(aria-sort + 受控/非受控)✅✅✅✅⚠️
筛选(关键字 + 选项多选)✅✅✅✅⚠️
选择(多选/单选 + 全选)✅✅✅✅⚠️
展开行 + 树形行✅✅✅✅⚠️
固定列 / 固定表头✅✅✅✅⚠️
列宽拖拽 + 键盘调整✅✅⚠️✅—
虚拟滚动✅✅⚠️✅⚠️

⚠️ = 部分支持(Mantine Table 的排序/筛选/选择为手动实现;Element Plus 虚拟滚动仅存在于独立的 el-table-v2;Element Plus 列宽拖拽仅限 border 模式)。

注意事项

  • 列定义为 TanStack ColumnDef 优先:数据列用 accessorKey(或 accessorFn),header 为标题,size/minSize 为像素列宽。旧 dataIndex/title 字段已移除,需重命名为 accessorKey/header。
  • 排序、筛选、调整列宽均为列级 opt-in:enableSorting、enableColumnFilter、resizable(默认全为 false)。
  • 分组列经 columns 嵌套(TanStack 形状);树形行经行数据 children 字段或 getChildren 嵌套——二者是不同概念、不同字段。
  • multiple 默认 true(多选);设置为 false 后行内渲染 radio,此时 selected 为单值(R | undefined),表头全选复选框不渲染。
  • 排序/筛选/展开/固定/列宽均为受控/非受控双通道:传入 sorting 等值时必须同时监听对应的 update:sorting(或使用 v-model:sorting)完成回写,否则状态不会更新。
  • expanded 受控状态为 TanStack ExpandedState,以 String(rowKey(row)) 为键({ '1': true },或 true 表示全部);defaultExpandAll 仅在非受控展开(无 expanded)时生效。
  • 列筛选生效期间树形行强制展开,保证被筛中的祖先行可见。
  • 虚拟滚动需要设置 height;未设置高度时 virtual 不生效(回退为普通渲染)。
  • 固定列在 data-fixed 单元格上注入背景色,fixed 列阴影通过 data-fixed-last-start/data-fixed-first-end 数据属性绘制渐变;自定义 cell/row 插槽时请保留这些数据属性以维持视觉一致性。
  • 筛选弹层文案(汇总、关键字、选项、清除)与空状态跟随 ConfigProvider 语言环境;列名取自 header → id/accessorKey 回退链。

常见问题

如何实现行选择并获取选中行数据?

使用 multiple(默认多选)配合 v-model:selected 与 rowKey:

<STable :columns="columns" :data="data" :row-key="row => row.id" v-model:selected="selected" />

selected 为选中行的 rowKey 数组;需要完整行数据时用 rowKey 反查 data。

如何做单选表格?

设置 multiple={false}——行内渲染 radio 按钮,selected 变为单值:

<STable :columns="columns" :data="data" :row-key="row => row.id" :multiple="false" v-model:selected="selected" />

如何自定义筛选弹层?

使用 header-filter 插槽整体替换默认的 STableFilterPopover,或在列上配置 enableColumnFilter(filterOptions/filterPlaceholder):

<STable :columns="columns" :data="data" :row-key="row => row.id">
  <template #header-filter="{ column, filtered, filterValues, setFilterValues, clearFilter }">
    <!-- 自定义筛选控件 -->
  </template>
</STable>

如何控制排序/筛选的初始值?

用非受控 defaultSorting/defaultColumnFilters 初始化,之后由组件内部维护;需要外部同步时改用受控通道并监听 update:sorting/update:columnFilters:

<STable :columns="columns" :data="data" :row-key="row => row.id" :default-sorting="[{ id: 'age', desc: false }]" />

大数据量如何优化?

启用虚拟滚动(virtual + height)并按需自定义 estimateSize;引擎行模型自带 memoization,1000 行规模下无需额外处理。

如何实现表格汇总行?

使用 footer 插槽——它接收 columnSize,配合 columns 逐列渲染汇总单元格:

<STable :columns="columns" :data="data" :row-key="row => row.id">
  <template #footer="{ columnSize }">
    <STableRow>
      <STableCell>合计</STableCell>
      <!-- 按需渲染汇总值 -->
    </STableRow>
  </template>
</STable>

如何本地化表格文案?

空状态与所有交互 aria-label(排序/筛选/选择/展开/列宽)跟随 ConfigProvider 的 locale(table.* 消息,14 语言包);需要按实例覆盖时通过 ConfigProvider 的 messages 覆盖对应键,或使用同名插槽自定义内容。

引擎逃生舱

STable 是组件驱动的封装,但 TanStack 引擎从不锁死——提供四级逃生舱:

  1. 插槽 props — 每个表头/数据单元格插槽都接收 table(引擎表实例)与 engineColumn(引擎列实例),连同 column/row/value:
<STable :columns="columns" :data="data" :row-key="row => row.id">
  <template #age="{ value, table }">
    {{ value }}(共 {{ table.getPreFilteredRowModel().flatRows.length }} 行)
  </template>
</STable>
  1. useTableEngine() — 在表格子树内渲染的任意组件中注入引擎(深层自定义单元格、工具栏组件):
import { useTableEngine } from '@vean/aria/table';

const table = useTableEngine();

table.value.setGrouping([{ id: 'city' }]);
  1. 模板 ref — 引擎实例即暴露根对象,从组件外部直接控制:
const tableRef = useTemplateRef<TableEngineTable>('tableRef');

tableRef.value.previousPage();
  1. tableOptions prop — 透传原始 TanStack 表选项,解锁组件未显式接线的能力(分页、行选择模型、manual 服务端模式、meta、initialState、faceted 值…)。组件自有的键(状态接线、变更处理器)优先:
<STable
  :columns="columns"
  :data="data"
  :row-key="row => row.id"
  :table-options="{
    enableRowSelection: true,
    getFilteredSelectedRowModel: createFilteredSelectedRowModel()
  }"
/>

单元格定制优先级:具名插槽 > columnDef.cell 渲染函数(TanStack 原生方式,经 FlexRender 渲染)> 纯文本值。表头遵循同样的链(columnDef.header)。

从 v0.4x 迁移

v0.50.0 将自研列模型更换为 @tanstack/vue-table。TanStack 命名为第一公民,旧字段不保留别名(dataIndex / sortState 等需按下表手动重命名),最高频的旧字段映射如下:

v0.4x(旧)v0.50.0(TanStack 优先)
{ title, dataIndex }{ header, accessorKey }(dataIndex 别名已移除)
sorter: true / sorter(a, b)enableSorting: true / sortFn: (rowA, rowB) => number
filter: true / filter: { ... }enableColumnFilter: true / filterPlaceholder / filterOptions
width: '140px' / minWidthsize: 140 / minSize(px 数值)
分组列 { key, children }{ id, columns }(TanStack 分组形状)
sortState / defaultSortStatesorting / defaultSorting(SortingState)—— 别名已移除
filterState / defaultFilterStatecolumnFilters / defaultColumnFilters(ColumnFiltersState)
columnWidths / defaultColumnWidthscolumnSizing / defaultColumnSizing(Record<string, number>)
expanded: R[]expanded: ExpandedState({ '1': true } 或 true)
update:sortState / update:filterStateupdate:sorting / update:columnFilters

迁移前后对照

<!-- v0.4x -->
<script setup>
const columns = [
  { title: 'Name', dataIndex: 'name', sorter: true, width: '180px' },
  { title: 'Age', dataIndex: 'age', align: 'center', filter: true }
];
const expanded = ref([1]);
</script>

<!-- v0.50.0 -->
<script setup>
const columns = [
  { header: 'Name', accessorKey: 'name', enableSorting: true, size: 180 },
  { header: 'Age', accessorKey: 'age', align: 'center', enableColumnFilter: true }
];
const expanded = ref({ 1: true });
</script>

更新日志

版本记录按发布版本分组,便于快速查看这个组件在不同版本里的实际变更。

v0.50.1

2026-10-09

对比版本

样式

阻止 TanStack 默认列大小强制溢出

范围: table作者: soybeanjs查看提交e3746

v0.50.0

2026-10-02

对比版本

样式

修复空行的悬停样式

范围: table作者: soybeanjs查看提交fba7c

重构

在 @tanstack/vue-table 中重建表格引擎

范围: table作者: soybeanjs查看提交19b7d

修复

修复空行的悬停样式

范围: table作者: soybeanjs查看提交fba7c

重构

在 @tanstack/vue-table 中重建表格引擎

范围: table作者: soybeanjs查看提交19b7d

v0.40.0

2026-09-14

对比版本

样式

在表格样式和组件中将 rounded 属性更新为 false

范围: table作者: soybeanfe查看提交6c496

样式

在表格样式和组件中将 rounded 属性更新为 false

范围: table作者: soybeanfe查看提交6c496

v0.27.0

2026-05-28

对比版本

新功能

添加带元数据的行交互事件并更新相关类型

范围: table作者: soybeanfe查看提交93440

v0.15.3

2026-04-27

对比版本

新功能

添加空状态支持并更新文档

范围: table作者: soybeanfe, Copilot查看提交38ca1

修复

添加缺失的 TableScroll 组件导出

范围: table作者: soybeanfe查看提交5bbd4

文档

更新表格 api

范围: table作者: soybeanfe查看提交a130d

v0.15.2

2026-04-27

对比版本

新功能

添加最后开始和最先结束的固定列指标

范围: table作者: soybeanfe, Copilot查看提交e390d

新功能

添加表格滚动组件,增强表格风格

范围: table作者: soybeanfe, Copilot查看提交9997c

修复

为 STable 组件中的多个道具设置默认值

范围: table作者: soybeanfe查看提交1964c

v0.15.0

2026-04-26

对比版本

新功能

使用新的 TableCompact 实现,支持分组标题、排序/过滤、固定列、列大小调整、树状行和虚拟化。 已关闭 #97。

范围: table作者: CopilotKit in https://github.com/soybeanjs/soybean-ui/issues/97查看提交72a94

新功能

实现逻辑固定列和文本对齐,以支持 RTL

范围: table作者: soybeanjs查看提交c0fd5

修复

删除表格组件中多余的边框道具

范围: table作者: soybeanjs查看提交e2387

修复

改进 getColumns 函数中的列排序逻辑

范围: table作者: soybeanfe, Copilot查看提交4de50

优化

删除未使用的数据表组件和类型

范围: table作者: soybeanjs查看提交e5683

优化

通过改进列宽处理和增加属性来增强表格组件

范围: table作者: soybeanjs查看提交b31ff

优化

简化边框道具并更新表格样式

范围: table作者: soybeanjs查看提交6d8cb

优化

移除未使用的 useSlots 导入并简化插槽定义

范围: table作者: soybeanjs查看提交434ae

重构

将 `STable` 聚合重构为无头 `Table` 聚合

范围: table作者: CopilotKit查看提交53678

文档

将边框道具类型更新为布尔型

范围: table作者: soybeanjs查看提交c2a23

样式

从列定义中移除固定属性

范围: table作者: soybeanfe查看提交dd475

修复

改进 getColumns 函数中的列排序逻辑

范围: table作者: soybeanfe, Copilot查看提交4de50

样式

从列定义中移除固定属性

范围: table作者: soybeanfe查看提交dd475

新功能

使用新的 TableCompact 实现,支持分组标题、排序/过滤、固定列、列大小调整、树状行和虚拟化。 已关闭 #97。

范围: table作者: CopilotKit in https://github.com/soybeanjs/soybean-ui/issues/97查看提交72a94

新功能

实现逻辑固定列和文本对齐,以支持 RTL

范围: table作者: soybeanjs查看提交c0fd5

修复

删除表格组件中多余的边框道具

范围: table作者: soybeanjs查看提交e2387

优化

删除未使用的数据表组件和类型

范围: table作者: soybeanjs查看提交e5683

优化

通过改进列宽处理和增加属性来增强表格组件

范围: table作者: soybeanjs查看提交b31ff

优化

简化边框道具并更新表格样式

范围: table作者: soybeanjs查看提交6d8cb

优化

移除未使用的 useSlots 导入并简化插槽定义

范围: table作者: soybeanjs查看提交434ae

重构

将 `STable` 聚合重构为无头 `Table` 聚合

范围: table作者: CopilotKit查看提交53678

文档

将边框道具类型更新为布尔型

范围: table作者: soybeanjs查看提交c2a23

v0.13.6

2026-03-22

对比版本

修复

增强 getColumns 函数中的列处理,以改进类型支持

范围: table作者: soybeanjs查看提交7c72b

v0.13.5

2026-03-22

对比版本

修复

确保默认情况下检查列,并进行相应的过滤检查

范围: table作者: soybeanjs查看提交945b5

v0.13.4

2026-03-22

对比版本

修复

重新排序出口,以保持一致性和清晰度

范围: table作者: soybeanjs查看提交25840

v0.13.1

2026-03-20

对比版本

新功能

为 usePaginatedTable 添加 onFetched 回调,以处理获取的数据

范围: table作者: soybeanjs查看提交22928

v0.13.0

2026-03-20

对比版本

新功能

实现支持分页的 useTable 和 usePaginatedTable 钩子

范围: table作者: soybeanjs查看提交1ae61

修复

更新 usePaginatedTable 钩子中的 fetch 方法

范围: table作者: soybeanjs查看提交c54b9

新功能

实现支持分页的 useTable 和 usePaginatedTable 钩子

范围: table作者: soybeanjs查看提交1ae61

v0.10.6

2026-03-06

对比版本

修复

调整页眉的 z-index 并将多重默认值设为 true

范围: table作者: soybeanjs查看提交f56cf

v0.9.1

2026-03-03

对比版本

文档

添加表格文档和示例

范围: table作者: soybeanjs查看提交43882

v0.9.0

2026-03-01

对比版本

新功能

添加表格组件,包括上下文、变体和使用示例

范围: table作者: soybeanjs查看提交0fdfd

修复

从类型中移除未使用的 TableCaptionProps

范围: table作者: soybeanjs查看提交8dde2