Table

展示行列数据。

何时使用 #

  • Table 负责将数据呈现为高度可定制和具备可访问性的 HTML 表格,其核心功能为将结构化的数据使用表格的方式展现;
  • 可以使用各种参数来向表格中加入一些特性,比如排序,过滤,滚动,锁列等。

Table.StickyLock #

这是 1.21 版本推出的子组件,它与 Table 用法、API完全一样,只是优化了锁列的实现,推荐升级。

区分如下:

  • 旧版本锁列通过两层dom来模拟左、右锁列的列,因此滚动、行高的同步等都需要额外逻辑的,逻辑较重;
  • 新版本 Table.StickyLock 通过 position: sticky 来实现锁列,滚动、行高等行为都通过浏览器实现,逻辑轻量;

建议用户在新的页面中使用 Table.StickyLock,如果没有深度的样式定制(例如选择到 .next-table-lock-left 这一层级),也可以把现有的 Table 升级到 Table.StickyLock

FAQ #

rowSelection 模式,选择任意一个都是全选? #

给定的数据源中的属性需要有一个唯一标示该条数据的主键,默认值为id,可通过 primaryKey 更改 e.g.<Table primaryKey='myId'></Table>

rowSelection 模式,如何设置默认选中/禁用? #

通过受控模式,设置 rowSelection.selectedRowKeys 可以默认选中选中;通过 rowSelection.getProps 可以自定义每一行checkbox的props,具体可搜索demo选择可控

rowSelection 模式,如何屏蔽全选按钮/自定义全选按钮? #

通过rowSelection.titleProps 可以自定义选择列的表头的props,可通过 style: {display: 'none'} 屏蔽全选按钮;此外还有 rowSelection.titleAddons rowSelection.columnProps等属性,具体用法可搜索demo 可选择

支持行的双击事件/设置每一行的样式?处理整行点击? #

通过 rowProps 属性,重写行支持的原生属性,比如className style onDoubleClick等;通过 onRowClick 处理整行点击。

已知问题 #

  • 分组 Table 不支持在 Hover 状态和选中状态下显示背景色,无法合并单元格;
  • 分组 Table ,<Table fixedHeader/> 没有效果,header不会固定, <Table fixedHeader stickyHeader /> 才有效果,header可以sticky到页面上

如何使用 #

基本的 Table 包含行和列,使用 Table.Column 来定义列的信息,使用传入的 dataSource 属性数据来创建行。

下面的代码将会创建一行两列的数据表:

import { Table } from '@alifd/next';

const dataSource = [{id: 1, time: '2016'}];
ReactDOM.render(
    <Table.StickyLock dataSource={dataSource}>
        <Table.Column title="Id" dataIndex="id"/>
        <Table.Column title="Time" dataIndex="time"/>
    </Table.StickyLock>, mountNode);

列配置 #

Table.Column 提供了非常多的配置属性用于自定义列,最常见的就是使用cell自定义单元格的渲染逻辑. 其他的配置选项可以参考下面的 Table.Column 的 API。

下面的代码会让cell根据值渲染不同的视图:

import { Table } from '@alifd/next';

const dataSource = [{id: 1, time: '2016'}];
const renderTime = value => {
    if (value === '2016') {
        return '今年';
    }
    return value;
};
ReactDOM.render(
    <Table dataSource={dataSource}>
        <Table.Column title="Id" dataIndex="id"/>
        <Table.Column title="Time" dataIndex="time" cell={renderTime}/>
    </Table>, mountNode);

多表头 #

使用 Table.ColumnGroup 包裹 Table.Column 来创建有多个表头的表格。

import { Table } from '@alifd/next';

const dataSource = [{id: 1, time: '2016'}];
ReactDOM.render(
    <Table dataSource={dataSource}>
        <Table.ColumnGroup>
            <Table.Column title="Id" dataIndex="id"/>
            <Table.Column title="Time" dataIndex="time"/>
        </Table.ColumnGroup>
        <Table.ColumnGroup>
            <Table.Column title="Id" dataIndex="id"/>
        </Table.ColumnGroup>
    </Table>, mountNode);

代码演示 #

通过columns设置列 #

通过 columns 参数设置列

简单 #

简单的表格渲染

可选择 #

表格可选择功能

选择可控 #

演示全选和单选受控的功能

排序与过滤 #

示例演示了排序和过滤的特性。你可以通过给 Table.Column 设置 sortDirections={['desc', 'asc', 'default']} 来实现升序、降序、默认,三种状态的循环;

还可以通过给 Table 设置 sort 属性,用受控的方式,默认设置初始值

选择框属性 #

通过 rowSelection.getProps 来控制选择框属性

可展开 #

可以通过 expandedRowRender 额外渲染行

可展开-复杂 #

可以通过 expandedRowRender 额外渲染行,但是会包含复杂的组件, 可通过 expandedIndexSimulate 设置 index 类型

可展开-锁列 #

Table.StickyLock 模式下(IE不支持,会fallback到旧有逻辑),展开行的可视区域宽度与 Table 占屏幕宽度保持一致, 本模式下 expandedRowIndent[0, 0],不可修改。

行列合并与锁列 #

锁列会可能会影响行列合并的 colIndexlock='left'的列会被提升到第0列,多个左锁列按照出现的先后顺序,从0到1标记列索引; lock='right'的列会被提升到最后一列,多个右锁列按照出现顺序,从 lastIndex - nlastIndex 标记列索引。

行列合并 #

通过 cellProps 进行列合并。

增删改查 #

演示对表格的增删改查

固定表头 #

表格可以固定表头,支持sticky方式

分组列表 #

分组列表展现

分页 #

与分页结合

多表头 #

多个表头

虚拟滚动 #

使用 useVirtual 开启虚拟滚动,scrollToRow 滚动到指定行

锁列 #

演示表格锁列的功能。锁列不生效?点击 https://fusion.design/help.html#/faq 查看常见原因及有效解决方案

定制列 #

定制显示的表格列数

样式 #

自定义表格样式:

  • Table上,你可以通过API来设置斑马线、是否显示边框等;
  • Table.Column 上,你可以通过 align 设置内容居左中右,wordBreak 设置内容换行模式(默认是任意位置均可换行,可以为英文句子类设置值word

扩展 #

通过Table暴露的子组件进行扩展

重设列的尺寸 #

推荐使用 asyncResizableonResizeChange 调整列宽。如果左右锁列的列宽需要调整,请使用 Table.StickyLock.

混合模式 #

演示了tree模式和rowSelection模式混合

自定义 Loading 组件 #

自定义Row/Cell #

可以重写部分原生属性,比如className style onDoubleClick等。

无障碍支持 #

通过键盘方向键浏览表格。

可编辑的表格 #

单元格可编辑的表格

拖拽排序 #

可拖拽的表格。拖拽功能的实现依赖 react-dnd@7.x 及 react-dnd-html5-backend@7.x, 它要求 react react-dom 版本高于 16.3.x。在线 Demo 可以参考 https://codesandbox.io/s/draggable-table-drt4m

十字参考轴 #

适用于表头比较复杂,需要做表头分类的场景。

树表格逐级加载 #

演示 TreeTable 如何进行逐级加载

虚拟滚动与行合并 #

虚拟滚动会卸载滚动到视区之外的行,行合并利用 td 元素的 rowSpan 属性,需要在合并的第一行设置 rowSpan 属性,若因滚动视区外卸载了该行,则会导致行合并失效,可以使用 keepForwardRenderRows 设置向前保留一定行数不被卸载,从而使行合并始终生效(设置 keepForwardRenderRows 大于 max rowSpan 即可)

API #

Table #

参数 说明 类型 默认值 版本支持
tableLayout 表格元素的 table-layout 属性,设为 fixed 表示内容不会影响列的布局

可选值:
'fixed', 'auto'
Enum -
size 尺寸 small为紧凑模式

可选值:
'small', 'medium'
Enum 'medium'
tableWidth 表格的总长度,可以这么用:设置表格总长度 、设置部分列的宽度,这样表格会按照剩余空间大小,自动其他列分配宽度 Number -
dataSource 表格展示的数据源 Array []
onRowClick 点击表格每一行触发的事件

签名:
Function(record: Object, index: Number, e: Event) => void
参数:
record: {Object} 该行所对应的数据
index: {Number} 该行所对应的序列
e: {Event} DOM事件对象
Function () => {}
onRowMouseEnter 悬浮在表格每一行的时候触发的事件

签名:
Function(record: Object, index: Number, e: Event) => void
参数:
record: {Object} 该行所对应的数据
index: {Number} 该行所对应的序列
e: {Event} DOM事件对象
Function () => {}
onRowMouseLeave 离开表格每一行的时候触发的事件

签名:
Function(record: Object, index: Number, e: Event) => void
参数:
record: {Object} 该行所对应的数据
index: {Number} 该行所对应的序列
e: {Event} DOM事件对象
Function () => {}
onSort 点击列排序触发的事件

签名:
Function(dataIndex: String, order: String) => void
参数:
dataIndex: {String} 指定的排序的字段
order: {String} 排序对应的顺序, 有descasc两种
Function () => {}
onFilter 点击过滤确认按钮触发的事件

签名:
Function(filterParams: Object) => void
参数:
filterParams: {Object} 过滤的字段信息
Function () => {}
onResizeChange 重设列尺寸的时候触发的事件

签名:
Function(dataIndex: String, value: Number) => void
参数:
dataIndex: {String} 指定重设的字段
value: {Number} 列宽变动的数值
Function () => {}
rowProps 设置每一行的属性,如果返回值和其他针对行操作的属性冲突则无效。

签名:
Function(record: Object, index: Number) => Object
参数:
record: {Object} 该行所对应的数据
index: {Number} 该行所对应的序列
返回值:
{Object} 需要设置的行属性
Function () => {}
cellProps 设置单元格的属性,通过该属性可以进行合并单元格

签名:
Function(rowIndex: Number, colIndex: Number, dataIndex: String, record: Object) => Object
参数:
rowIndex: {Number} 该行所对应的序列
colIndex: {Number} 该列所对应的序列
dataIndex: {String} 该列所对应的字段名称
record: {Object} 该行对应的记录
返回值:
{Object} 返回td元素的所支持的属性对象
Function () => {}
keepForwardRenderRows 虚拟滚动时向前保留渲染的行数 Number 10
hasBorder 表格是否具有边框 Boolean true
hasHeader 表格是否具有头部 Boolean true
isZebra 表格是否是斑马线 Boolean false
loading 表格是否在加载中 Boolean false
loadingComponent 自定义 Loading 组件
请务必传递 props, 使用方式: loadingComponent={props => <Loading {...props}/>}

签名:
Function(props: LoadingProps) => React.ReactNode
参数:
props: {LoadingProps} 需要透传给组件的参数
返回值:
{React.ReactNode} 展示的组件
Function -
filterParams 当前过滤的的keys,使用此属性可以控制表格的头部的过滤选项中哪个菜单被选中,格式为 {dataIndex: {selectedKeys:[]}}
示例:
假设要控制dataIndex为id的列的过滤菜单中key为one的菜单项选中
<Table filterParams={{id: {selectedKeys: ['one']}}}/>
Object -
sort 当前排序的字段,使用此属性可以控制表格的字段的排序,格式为{[dataIndex]: 'asc' 'desc' } , 例如 {id: 'desc'} Object -
sortIcons 自定义排序按钮,例如上下排布的: {desc: <Icon style={{top: '6px', left: '4px'}} type={'arrow-down'} size="small" />, asc: <Icon style={{top: '-6px', left: '4px'}} type={'arrow-up'} size="small" />} Object -
columns 等同于写子组件 Table.Column ,子组件优先级更高 Array -
emptyContent 设置数据为空的时候的表格内容展现 ReactNode -
primaryKey dataSource当中数据的主键,如果给定的数据源中的属性不包含该主键,会造成选择状态全部选中 Symbol/String 'id'
expandedRowRender 额外渲染行的渲染函数

签名:
Function(record: Object, index: Number) => Element
参数:
record: {Object} 该行所对应的数据
index: {Number} 该行所对应的序列
返回值:
{Element} 渲染内容
Function -
rowExpandable 设置行是否可展开,设置 false 为不可展开

签名:
Function(record: Object, index: Number) => Boolean
参数:
record: {Object} 该行所对应的数据
index: {Number} 该行所对应的序列
返回值:
{Boolean} 是否可展开
Function -
expandedRowIndent 额外渲染行的缩进, 是个二维数组(eg:[1,1]) 分别表示左右两边的缩进 Array -
hasExpandedRowCtrl 是否显示点击展开额外渲染行的+号按钮 Boolean -
getExpandedColProps 设置额外渲染行的属性

签名:
Function(record: Object, index: Number) => Object
参数:
record: {Object} 该行所对应的数据
index: {Number} 该行所对应的序列
返回值:
{Object} 额外渲染行的属性
Function -
openRowKeys 当前展开的 Expand行 或者 Tree行 , 传入此属性为受控状态,一般配合 onRowOpen 使用 Array -
defaultOpenRowKeys 默认情况下展开的 Expand行 或者 Tree行,非受控模式 Array - 1.23.22
onRowOpen 在 Expand行 或者 Tree行 展开或者收起的时候触发的事件

签名:
Function(openRowKeys: Array, currentRowKey: String, expanded: Boolean, currentRecord: Object) => void
参数:
openRowKeys: {Array} 展开的渲染行的key
currentRowKey: {String} 当前点击的渲染行的key
expanded: {Boolean} 当前点击是展开还是收起
currentRecord: {Object} 当前点击额外渲染行的记录
Function -
fixedHeader 表头是否固定,该属性配合maxBodyHeight使用,当内容区域的高度超过maxBodyHeight的时候,在内容区域会出现滚动条 Boolean -
maxBodyHeight 最大内容区域的高度,在fixedHeadertrue的时候,超过这个高度会出现滚动条 Number/String -
rowSelection 是否启用选择模式

属性:
getProps: {Function} Function(record, index)=>Object 获取selection的默认属性
onChange: {Function} Function(selectedRowKeys:Array, records:Array) 选择改变的时候触发的事件,注意: 其中records只会包含当前dataSource的数据,很可能会小于selectedRowKeys的长度。
onSelect: {Function} Function(selected:Boolean, record:Object, records:Array) 用户手动选择/取消选择某行的回调
onSelectAll: {Function} Function(selected:Boolean, records:Array) 用户手动选择/取消选择所有行的回调
selectedRowKeys: {Array} 设置了此属性,将rowSelection变为受控状态,接收值为该行数据的primaryKey的值
mode: {String} 选择selection的模式, 可选值为single, multiple,默认为multiple
columnProps: {Function} Function()=>Object 选择列 的props,例如锁列、对齐等,可使用Table.Column 的所有参数
titleProps: {Function} Function()=>Object 选择列 表头的props,仅在 multiple 模式下生效
titleAddons: {Function} Function()=>Node 选择列 表头添加的元素,在single multiple 下都生效
Object -
stickyHeader 表头是否是sticky Boolean -
offsetTop 距离窗口顶部达到指定偏移量后触发 Number -
affixProps affix组件的的属性 Object -
indent 在tree模式下的缩进尺寸, 仅在isTree为true时候有效 Number -
isTree 开启Table的tree模式, 接收的数据格式中包含children则渲染成tree table Boolean -
useVirtual 是否开启虚拟滚动 Boolean -
scrollToRow 滚动到第几行,需要保证行高相同。1.22.15 版本之前仅在虚拟滚动场景下生效,之后在所有情况下生效 Number - 1.22.15
onBodyScroll 在内容区域滚动的时候触发的函数

签名:
Function() => void
Function -
expandedIndexSimulate 开启时,getExpandedColProps() / rowProps() / expandedRowRender() 的第二个参数 index (该行所对应的序列) 将按照01,2,3,4...的顺序返回,否则返回真实index(0,2,4,6... / 1,3,5,7...) Boolean false
crossline 在 hover 时出现十字参考轴,适用于表头比较复杂,需要做表头分类的场景。 Boolean false

Table.Column #

参数 说明 类型 默认值 版本支持
dataIndex 指定列对应的字段,支持a.b形式的快速取值 String -
cell 行渲染的逻辑
value, rowIndex, record, context四个属性只可读不可被更改
Function(value, index, record) => Element
ReactElement/ReactNode/Function value => value
title 表头显示的内容 ReactElement/ReactNode/Function -
htmlTitle 写到 header 单元格上的title属性 String -
sortable 是否支持排序 Boolean -
sortDirections 排序的方向。
设置 ['desc', 'asc'],表示降序、升序
设置 ['desc', 'asc', 'default'],表示表示降序、升序、不排序
Array<Enum> - 1.23
width 列宽,注意在锁列的情况下一定需要配置宽度 Number/String -
align 单元格的对齐方式

可选值:
'left', 'center', 'right'
Enum -
alignHeader 单元格标题的对齐方式, 不配置默认读取align值

可选值:
'left', 'center', 'right'
Enum -
filters 生成标题过滤的菜单, 格式为[{label:'xxx', value:'xxx'}] Array<Object> -
filterMode 过滤的模式是单选还是多选

可选值:
'single', 'multiple'
Enum 'multiple'
filterMenuProps filter 模式下传递给 Menu 菜单的属性, 默认继承 Menu 组件的API

属性:
subMenuSelectable: {Boolean} 默认为false subMenu是否可选择
isSelectIconRight: {Boolean} 默认为false 是否将选中图标居右。注意:SubMenu 上的选中图标一直居左,不受此API控制
Object { subMenuSelectable: false, }
lock 是否支持锁列,可选值为left,right, true Boolean/String -
resizable 是否支持列宽调整, 当该值设为true,table的布局方式会修改为fixed. Boolean false
asyncResizable (推荐使用)是否支持异步列宽调整, 当该值设为true,table的布局方式会修改为fixed. Boolean false 1.24
colSpan header cell 横跨的格数,设置为0表示不出现此 th Number -
wordBreak 设置该列单元格的word-break样式,对于id类、中文类适合用all,对于英文句子适合用word

可选值:
'all'(all)
'word'(word)
Enum all 1.23

Table.ColumnGroup #

参数 说明 类型 默认值
title 表头显示的内容 ReactElement/ReactNode/Function 'column-group'

Table.GroupHeader #

参数 说明 类型 默认值
cell 行渲染的逻辑 ReactElement/ReactNode/Function () => ''
hasChildrenSelection 是否在Children上面渲染selection Boolean false
hasSelection 是否在GroupHeader上面渲染selection Boolean true
useFirstLevelDataWhenNoChildren 当 dataSouce 里没有 children 时,是否使用内容作为数据 Boolean false
参数 说明 类型 默认值
cell 行渲染的逻辑 ReactElement/ReactNode/Function () => ''