表格 Table
用于数据收集展示、分析整理、操作处理。
安装
npm install @arco-design/web-react@2.66.18
在入口引入 @arco-design/web-react/dist/css/arco.css,用 ConfigProvider 设置语言。React 19 项目还需在入口最先引入 @arco-design/web-react/es/_util/react-19-adapter,否则 Message、Modal 等命令式 API 无法渲染。
示例
- 基础用法:最基础的用法。
- 开启选择:表格开启选择,可以设置
rowSelection.type来使用复选框和单选框。checkbox- 复选框。radio- 单选框。 - 展开行:当内容过长,可以通过
expandedRowRender设置展开行。如果返回值是null,不会渲染展开按钮。 - 定制展开参数:可以通过
expandProps定制展开列的图标,宽度,标题,是否展开等。 Tip: 正常情况下,是否展开是由expandedRowRender返回值决定的,如果过多的expandedRowRender计算导致卡顿,建议使用expandProps.rowExpandable。 - 嵌套子表格:嵌套子表格的例子,点击展开按钮可以在展开区域展示子表格。
- 树形数据展示:树形数据展示的例子,
data里有children字段, 或者通过childrenColumnName设置成自定义字段。 - 表格属性:在这里,你可以方便的打开或关闭表格的属性,来看一下吧。
- 排序和筛选:配置
Column的sorter,可以对表格进行排序。 配置Column的filters,可以对表格进行筛选。sorter为一个排序函数,当然,你也可以指定sorter为true,这样你可以通过Table的onChange事件进行自定义排序。filters为一个数组,包含着要筛选的信息,需要配合onFilter使用。当然也可以配合Table的onChange事件进行自定义筛选或者服务端筛选。 默认排序和筛选:通过指定defaultFilters和defaultSortOrder可以指定默认的排序和筛选。 - 自定义筛选菜单:自定义筛选菜单。
- 多列排序:
column.sorter支持传入一个对象,指定该对象的multiple属性可以实现多列排序的效果。multiple为number类型,数字越大代表排序优先级越高。 注意: 多列排序配合sortOrder使用时,为保持状态一致性,所有指定了sorter的列都需要同时指定sortOrder(可为undefined),同时需要注意列之间的互斥关系。 - 自定义分页:自定义分页,通过设置
total,pageSize,通过onChange来动态更新表格数据。当分页设置simple为true时,会应用简单分页样式。关于pagination的具体设置可查看pagination 组件文档。通过renderPagination可以自定义分页渲染部分。 - 自定义单元格内容:通过
columns中的render字段,可以自定义单元格的内容 - 固定列:在
column中指定fixed: "left"或fixed: "right",可将列固定到左侧或右侧,设置fixed的列,也需要设置width。 注意: 要配合scroll={{ x: number }}使用,columns中需要有一列不设置宽度,自适应,不然会有样式问题。 - 自定义样式:有多种方式定制行列样式,
rowClassName可以对每一行进行样式定制,Column.className可以对列进行样式定制。此外,还有headerCellStyle,bodyCellStyle, 对表头和表格主体的列进行样式定制。 - 表头分组:
columns内可以嵌套children,用于表头分组。 - 单元格合并:用于单元格合并,表头只能进行列合并。
- 可编辑单元格:可编辑单元格。
- 定制前置操作列:可以通过
components来定制前置操作列,包括新增列、调整列的顺序等。 - 大数据:内置虚拟滚动逻辑,设置
virtualized=true开启。 注意: 开启虚拟滚动之后,不要给每一列都设置宽度,要保证有一列自适应,不然可能出现表头表身对不齐的情况。 - 自定义空状态:当表格无数据时,默认会展示一个居中的提示信息。你可以通过
noDataElement属性来自定义无数据时的展示内容。 - 总结栏:总结栏 summary 的用法。
示例来自 Arco Design 官方仓库(MIT),固定在 npm 2.66.18 对应的提交;部分示例使用在线图片或上传地址,预览中网络请求被禁用。
API
Table
| 参数名 | 描述 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| borderCell | 是否显示单元格边框,作用等同于 border={{ cell: true }} | boolean | - | - |
| defaultExpandAllRows | 默认展开所有可展开的行 | boolean | - | - |
| hover | 是否开启鼠标悬浮效果 | boolean | true | - |
| showHeader | 是否显示表头 | boolean | true | - |
| stripe | 是否开启斑马纹 | boolean | - | - |
| tableLayoutFixed | 表格的 table-layout 属性设置为 fixed,设置为 fixed 后,表格的宽度不会被内容撑开超出 100%。 | boolean | - | - |
| virtualized | 表格开启虚拟滚动,用于处理大数据场景。( 注意:虚拟滚动会自动关闭对树形数据的支持 ) | boolean | - | - |
| indentSize | 树形数据每个层级向左偏移的像素 | number | 15 | - |
| childrenColumnName | 树形数据在 data 中的字段名,默认是 children | string | children | - |
| onChange | 分页、排序、筛选时的回调 | (pagination: PaginationProps,sorter: SorterInfo | SorterInfo[],filters: Partial<Record<keyof T, string[]>>,extra: { currentData: T[]; currentAllData: T[]; action: 'paginate' | 'sort' | 'filter' }) => void | - | extra in 2.19.0, currentAllData in 2.53.0 |
| pagePosition | 设置分页器的位置,有六个方位 右下 左下 右上 左上 上中 下中 | 'br' | 'bl' | 'tr' | 'tl' | 'topCenter' | 'bottomCenter' | br | - |
| size | 表格尺寸,分为 默认,默认 中 小 迷你 四个尺寸 | 'default' | 'middle' | 'small' | 'mini' | - | - |
| noDataElement | 没有数据的时候显示的元素 | string | ReactNode | <Empty /> | - |
| placeholder | 当单元格内容为空时,显示占位符,优先级低于 column.placeholder。 | ReactNode | - | 2.23.0 |
| border | 边框设置 | | boolean| { wrapper?: boolean; headerCell?: boolean; bodyCell?: boolean; cell?: boolean } | true | - |
| className | 节点类名 | string | string[] | - | - |
| columns | 列描述数据对象的数组 | ColumnProps<T>[] | - | - |
| components | 覆盖原生表格标签 | ComponentsProps | - | - |
| data | 表格数据 | T[] | - | - |
| defaultExpandedRowKeys | 默认展开的行 | (string | number)[] | - | - |
| expandedRowKeys | 展开的行(受控) | (string | number)[] | - | - |
| expandProps | 自定义展开/关闭列的图标,宽度,标题,具体用法看这个例子 | ExpandProps<T> | - | - |
| loading | 表格是否在加载中 | boolean | SpinProps | - | - |
| onHeaderRow | 设置表头行单元格的各项事件回调 | (columns: ColumnProps<T>[], index: number) => RowCallbackProps | - | - |
| pagination | 分页器设置,参考Pagination组件,设置 false 不展示分页 | PaginationProps | boolean | - | - |
| rowSelection | 设置表格行是否可选,选中事件等。配置项 | RowSelectionProps<T> | - | - |
| scroll | 设置x轴或y轴的滚动。x 设置为 true,会给 table 添加 table-layout: fixed 以及给父元素添加 overflow: auto。y 设置为 true,表头和表身会分离,放在两个 table 中 | { x?: number | string | boolean; y?: number | string | boolean } | - | - |
| showSorterTooltip | 表头是否显示下一次排序的 tooltip 提示。可以设置对象,可以传 Tooltip 组件的所有参数。 | boolean | TooltipProps | true | 2.19.0 |
| style | 节点样式 | CSSProperties | - | - |
| virtualListProps | 用于配置虚拟滚动。 | AvailableVirtualListProps | - | 2.46.0 |
| expandedRowRender | 点击展开额外的行,渲染函数。返回值为 null 时,不会渲染展开按钮 | (record: T, index: number) => ReactNode | - | - |
| footer | 表格尾部 | (currentPageDate) => ReactNode | - | - |
| onExpand | 点击展开的回调 | (record: T, expanded: boolean) => void | - | - |
| onExpandedRowsChange | 点击展开时触发,参数为展开行数组 | (expandedRows: (string | number)[]) => void | - | - |
| onRow | 设置表格行的各项事件回调 | (record: T, index: number) => RowCallbackProps | - | - |
| renderPagination | 自定义分页渲染。 | (paginationNode?: ReactNode) => ReactNode | - | 2.11.0 |
| rowClassName | 表格行的类名 | (record: T, index: number) => string | - | - |
| rowKey | 表格行 key 的取值字段 | React.Key | ((record: T) => React.Key) | key | - |
| summary | 总结栏 | (currentData?: T[]) => ReactNode | - | 2.17.0 |
RowSelection
<Table> 参数 rowSelection 的详细参数。
| 参数名 | 描述 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| checkAll | 多选模式下是否开启全选功能 | boolean | - | - |
| checkCrossPage | 多选模式下的复选框是否跨分页,只在非受控模式下生效。配合 preserveSelectedRowKeys: true 使用,可在受控模式下生效。 | boolean | - | - |
| checkStrictly | 设置为 false 的时候父子选择会自动关联。 | boolean | true | 2.33.0 |
| fixed | 是否固定选择列到左边 | boolean | - | - |
| preserveSelectedRowKeys | 在数据项被删除时仍然保留选项的 key | boolean | - | 2.19.0 |
| columnWidth | 选择框列的宽度 | number | - | - |
| type | 多选或者单选 | 'checkbox' | 'radio' | - | - |
| columnTitle | 自定义列表选择的标题 | string | ReactNode | - | - |
| selectedRowKeys | Table选中的项,(受控模式,需要跟 onChange 配合使用) | (string | number)[] | - | - |
| checkboxProps | 选择框的属性配置 | (record: T) => { [key: string]: any } | - | - |
| onChange | 单选或多选的选中项发生改变时的回调 | (selectedRowKeys: (string | number)[], selectedRows: T[]) => void | - | - |
| onSelect | 用户手动选择/取消选择的回调 | (selected: boolean, record: T, selectedRows: T[]) => void | - | 2.22.0 |
| onSelectAll | 用户手动选择/取消选择所有行的回调 | (selected: boolean, selectedRows) => void | - | 2.6.0 |
| renderCell | 定制复选框,用法与 column.render 相同。 | (originNode, checked: boolean, record: T) => ReactNode | - | 2.19.0 |
ExpandProps
<Table> 参数 expandProps 的详细参数。
| 参数名 | 描述 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| expandRowByClick | 支持通过点击行来展开 | boolean | - | 2.19.0 |
| strictTreeData | 树形数据时,只有 children 是数组且长度大于 1 才显示展开图标。 | boolean | true | 2.27.0 |
| width | 展开按钮列的宽度 | number | - | - |
| columnTitle | 展开按钮列的表头标题 | ReactNode | - | - |
| icon | 定制展开按钮的图标 | (props: { expanded: boolean; record: Record<string, any> }) => ReactNode | - | - |
| rowExpandable | 是否允许行展开。如果不指定该参数,会以 expandedRowRender 是否有返回值决定。当出现性能问题时,建议使用 rowExpandable。 | (record: T) => boolean | - | 2.16.0 |
Column
列描述数据对象,是 columns 中的一项。
| 参数名 | 描述 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| ellipsis | 单元格内容超出长度后,是否自动省略,显示 ...。设置这个属性后,table 的 table-layout 将自动变成 fixed。 | boolean | - | - |
| filterMultiple | 是否可以筛选多项 | boolean | true | - |
| dataIndex | 列数据在数据项中对应的 key,用于取值显示,支持 a[0].b.c[1] 的嵌套写法,详情看 lodash.get。 | string | - | - |
| align | 设置列的对齐方式 | 'left' | 'center' | 'right' | left | - |
| defaultSortOrder | 默认排序方式 | 'ascend' | 'descend' | - | - |
| fixed | 固定头和列到左边或者右边 | 'left' | 'right' | - | - |
| sortDirections | 支持的排序方式。 | Array<'ascend' | 'descend'> | ['ascend','descend'] | - |
| sortOrder | 排序的受控属性,可以控制列的排序,可设置为 ascend descend | 'ascend' | 'descend' | - | - |
| filterIcon | 自定义筛选图标。 | ReactNode | - | - |
| placeholder | 当单元格内容为空时,显示占位符,优先级低于 render。 | ReactNode | - | 2.22.0 |
| title | 列标题 | React.ReactNode (必填) | - | - |
| bodyCellStyle | 表身单元格自定义样式 | CSSProperties | - | - |
| className | 列的类名 | string | string[] | - | - |
| defaultFilters | 默认筛选条件 | string[] | - | - |
| filterDropdownProps | 配置筛选弹出框的一些属性。 | { triggerProps?: TriggerProps } | - | - |
| filteredValue | 筛选的受控属性,值为筛选的 value 数组 | string[] | - | - |
| filters | 筛选项,需要配合 onFilter 或者 onChange 使用 | {text?: ReactNode;value?: any;[key: string]: any;}[] | [] | - |
| headerCellStyle | 表头单元格自定义样式 | CSSProperties | - | - |
| key | React的 key值,如果不指定,默认取 dataIndex 的值 | string | number | - | - |
| sorter | 排序函数,如果想要服务端排序或者添加更多自定义操作,设置为true,利用onChange函数进行自定义排序 | SorterFn | boolean | { compare?: SorterFn; multiple?: number } | - | - |
| width | 列宽度 | number | string | - | - |
| filterDropdown | 自定义筛选框。 | (props: {filterKeys?: string[];setFilterKeys?: (filterKeys: string[], callback?: Function) => void;confirm?: Function;}) => ReactNode | - | - |
| onCell | 设置表身单元格的各项事件回调 | (record, index) => RowCallbackProps | - | - |
| onFilter | 筛选函数,配合filters | (value, row) => any | - | - |
| onFilterDropdownVisibleChange | 筛选框打开关闭的回调 | (visible: boolean) => void | - | - |
| onHeaderCell | 设置头部单元格的各项事件回调 | (column, index) => RowCallbackProps | - | - |
| render | 自定义单元格显示的内容 | (col, item: T, index: number) => any | - | - |
ComponentsProps
export type ComponentsProps = {
table?: any;
header?: {
operations?: (nodes: {
selectionNode?: ReactNode;
expandNode?: ReactNode;
}) => {
name?: string;
node?: ReactNode;
width?: number;
}[];
wrapper?: any;
thead?: any;
row?: any;
th?: any;
cell?: any;
};
body?: {
operations?: (nodes: {
selectionNode?: ReactNode;
expandNode?: ReactNode;
}) => {
name?: string;
node?: ReactNode | ((record) => ReactNode); // 2.17.0
width?: number;
}[];
wrapper?: any;
tbody?: any;
row?: any;
td?: any;
cell?: any;
};
};
SorterInfo
export interface SorterInfo {
direction?: SortDirection;
field?: string | number;
sorterFn?: SorterFn;
priority?: number;
}
SortDirection
export declare type SortDirection = "descend" | "ascend";
SorterFn
export type SorterFn = (a: any, b: any) => number;
RowCallbackProps
export type RowCallbackProps = {
onClick?: (event) => void;
onDoubleClick?: (event) => void;
onContextMenu?: (event) => void;
onMouseEnter?: (event) => void;
onMouseLeave?: (event) => void;
onHandleSave?: (row) => void;
[name: string]: any;
};
AvailableVirtualListProps
export type AvailableVirtualListProps = Pick<
VirtualListProps<any>,
| "height"
| "itemHeight"
| "threshold"
| "isStaticItemHeight"
| "scrollOptions"
| "onScroll"
| "wrapperChild"
>;
隐藏分页
如果想在页数小于或等于一页时隐藏分页,可以配置 pagination.hideOnSinglePage = true,如果想全局配置,
可以配置 ConfigProvider 组件的 tablePagination.hideOnSinglePage = true。
onRow 用法
onRow, onHeaderRow, onCell, onHeaderCell 用法一致。
<Table
onRow={(record, index) => {
return {
onClick: (event) => {}, // 点击表身行
onDoubleClick: (event) => {},
onContextMenu: (event) => {},
onMouseEnter: (event) => {},
onMouseLeave: (event) => {},
};
}}
onHeaderRow={(column, index) => {
return {
onClick: (event) => {}, // 点击表头行
onDoubleClick: (event) => {},
onContextMenu: (event) => {},
onMouseEnter: (event) => {},
onMouseLeave: (event) => {},
};
}}
/>