跳到主要内容

Table 表格

成行成列的结构化数据:需要按列比较、排序或批量选择时用。只有两三个字段的条目用 List 更轻。

基本用法

传列定义和数据。第一列自动加粗作为行的主信息;numeric 的列右对齐并用等宽数字。指针移上去时,一块共享的浅灰底跟着在行之间滑动。

项目成员
城市状态
林小满设计上海128在线
周屿前端杭州342在线
Ada Chen产品深圳17离开
宋知远后端北京276离线
何田田测试成都64在线

排序

给列加 sortable 后表头变成按钮,点击在 升序 → 降序 → 不排序 之间循环。默认按 accessor(或 row[key])的值比较,数字、日期、字符串各有合理的顺序;也可以传 compare 自定义。服务端排序时加 manualSort,组件只发事件不动数据。

城市状态
周屿前端杭州342在线
宋知远后端北京276离线
林小满设计上海128在线
何田田测试成都64在线
Ada Chen产品深圳17离开
当前排序:commits 降序

行选择

selectable 在首列加复选框,表头是全选(部分选中时显示半选)。选中的 key 可受控。

已选 1 人
城市状态
林小满设计上海128在线
周屿前端杭州342在线
Ada Chen产品深圳17离开
宋知远后端北京276离线
何田田测试成都64在线
已选择 1 行

吸顶滚动

scroll 让表格限高(默认 320,可用 maxHeight 改)、表头固定在顶部。滚动完全是浏览器原生行为,只换了滚动条的外观;纵向滚动时悬停高亮直接对位,不做滑动动画。

城市状态
林小满 1设计上海0在线
周屿 2前端杭州37在线
Ada Chen 3产品深圳74离开
宋知远 4后端北京111离线
何田田 5测试成都148在线
林小满 6设计上海185在线
周屿 7前端杭州222在线
Ada Chen 8产品深圳259离开
宋知远 9后端北京296离线
何田田 10测试成都333在线
林小满 11设计上海370在线
周屿 12前端杭州7在线
Ada Chen 13产品深圳44离开
宋知远 14后端北京81离线
何田田 15测试成都118在线
林小满 16设计上海155在线
周屿 17前端杭州192在线
Ada Chen 18产品深圳229离开
宋知远 19后端北京266离线
何田田 20测试成都303在线
林小满 21设计上海340在线
周屿 22前端杭州377在线
Ada Chen 23产品深圳14离开
宋知远 24后端北京51离线

窄屏卡片式

默认情况下表格在窄屏会在容器内横向滚动。加 stackOnMobile 后,视口窄于 520px 时每一行变成一张卡片,单元格变成“列名 —— 值”;可排序的列留在上方排成一行按钮。把浏览器调窄,或在手机上看这个示例。

城市状态
林小满设计上海128在线
周屿前端杭州342在线
Ada Chen产品深圳17离开

空状态

没有数据时显示 empty(默认是“暂无数据”四个字),可以放一个 EmptyState。

城市状态

还没有成员

邀请同事加入后会出现在这里。

规格

单元格
内边距 12 × 20 · 首尾行到上下边补足到 20 · 行间发丝线
表头
12px / 600 · 三级色
悬停
共享浅灰底跟随指针 · 90ms ease-out
数字列
右对齐 · 等宽数字
窄屏
容器内横向滚动;stackOnMobile 时改成卡片
可滚动
限高 --ok-table-h · 表头固定 · 横纵双向
滚动条
原生滚动条换肤 · 6px,指向时 8px · 指针移入时淡入

接口

Table

属性类型默认值说明
columns*TableColumn<T>[]—列定义。
data*T[]—行数据。
rowKeykeyof T | ((row, index) => string)—行的唯一标识:字段名或函数。默认用下标。
labelstring—表格的名字(aria-label);可滚动时也是滚动区域的名字。
captionReactNode—可见的表格标题,渲染成 caption。
sort / defaultSort{ key: string; direction: 'asc' | 'desc' } | nullnull排序,受控 / 非受控。null 表示不排序。
onSortChange(sort: TableSort) => void—排序变化时。
manualSortboolean—只发出排序事件、不在内部排序(服务端排序)。
selectableboolean—行选择:首列出现复选框,表头是全选。
selectedKeys / defaultSelectedKeysstring[]—选中的行 key,受控 / 非受控。
onSelectionChange(keys: string[]) => void—选择变化时。
getRowLabel(row, index) => string—行的名字,用在复选框的 aria-label 里。默认取第一列的文字。
scrollboolean—可滚动变体:限高、表头吸顶。
maxHeightnumber | string320可滚动变体的最大高度。
stackOnMobileboolean—窄屏(< 520px)把每一行变成卡片式的键值对。
emptyReactNode'暂无数据'没有数据时显示的内容。
noHighlightboolean—关掉跟随指针的共享悬停高亮,退回普通的整行变色。

TableColumn

属性类型默认值说明
key*string—列标识;没有 accessor / render 时也用它从行数据里取值。
header*ReactNode—表头内容。
labelstring—表头不是纯文字时,给读屏和卡片式布局用的文字标签。
accessor(row: T) => unknown—取值,用于排序和默认渲染。
render(row: T, index: number) => ReactNode—自定义单元格。
sortableboolean—可排序。
compare(a: T, b: T) => number—自定义比较(升序);降序时自动取反。
numericboolean—数字列:右对齐、等宽数字。
align'start' | 'center' | 'end'—对齐方式。
widthnumber | string—列宽。

无障碍

  • 原生 table,表头是 th scope="col";名字来自 caption 或 label,两者至少给一个。
  • 可排序的表头里是真的按钮,Tab 聚焦、Enter / 空格切换;当前状态写在 aria-sort(ascending / descending / none)上。箭头只是视觉提示。
  • 行选择用原生复选框,名字是“选择 + 行名”,表头是“选择全部”;用 Tab 移动、Space 切换。选中的行带 aria-selected,选中数量通过 role="status" 播报。
  • 可滚动(或内容超宽)时容器成为 role="region" 且可聚焦,键盘用户用方向键、PageUp / PageDown 滚动。
  • stackOnMobile 把表格元素改成块级后会丢语义,组件已显式写回 table / row / cell 等角色;每个值前面的列名来自表头文字。
  • 悬停高亮只是指针反馈,不影响键盘和读屏;触屏上不出现。