#ProTable - 高级表格
ProTable 的诞生是为了解决项目中需要写很多 table 的样板代码的问题,所以在其中封装了很多常用的逻辑。这些封装可以简单的分类为预设行为与预设逻辑。
依托于 ProForm 的能力,ProTable 的查询区可切换多种形态(如 QueryFilter / LightFilter),也可在 type="form" 等场景下更像普通表单使用。

#何时使用
当你的表格需要与服务端进行交互或者需要多种单元格样式时,ProTable 是不二选择。
#Issue 回归场景
| ID | 名称 |
|---|---|
暂无数据 | |
import type {
ActionType,
EditableFormInstance,
} from '@ant-design/pro-components';
import {
EditableProTable,
ProCard,
ProTable,
} from '@ant-design/pro-components';
import { Alert, Button, Space, Tabs, Typography, message } from 'antd';
import { useRef, useState } from 'react';
type Row = {
id: number;
name: string;
status?: 'active' | 'closed';
sort?: number;
};
const rows: Row[] = [
{ id: 1, name: 'Alpha', status: 'active' },
{ id: 2, name: 'Beta', status: 'closed' },
{ id: 3, name: 'Gamma', status: 'active' },
];
const CursorPagination = () => (
<ProTable<Row>
rowKey="id"
search={false}
options={false}
columns={[
{ title: 'ID', dataIndex: 'id' },
{ title: '名称', dataIndex: 'name' },
]}
pagination={{ type: 'cursor', pageSize: 1 }}
request={async ({ nextToken }) => {
const index = Number(nextToken ?? 0);
return {
success: true,
data: rows.slice(index, index + 1),
nextToken: index + 1 < rows.length ? String(index + 1) : undefined,
};
}}
/>
);
const SortFilterState = () => {
const actionRef = useRef<ActionType>();
const [snapshot, setSnapshot] = useState('点击按钮读取');
return (
<ProTable<Row>
actionRef={actionRef}
rowKey="id"
search={false}
pagination={false}
dataSource={rows}
columns={[
{ title: '名称', dataIndex: 'name', sorter: true },
{
title: '状态',
dataIndex: 'status',
filters: true,
valueEnum: { active: '启用', closed: '关闭' },
},
]}
toolBarRender={() => [
<Space key="state">
<Button
onClick={() =>
setSnapshot(
JSON.stringify(actionRef.current?.getSortFilter?.() ?? {}),
)
}
>
读取排序和筛选
</Button>
<Typography.Text code>{snapshot}</Typography.Text>
</Space>,
]}
/>
);
};
const EditableDragSort = () => {
const [dataSource, setDataSource] = useState<Row[]>(rows);
return (
<EditableProTable<Row>
rowKey="id"
value={dataSource}
onChange={(value) => setDataSource([...value])}
columns={[
{ title: '排序', dataIndex: 'sort', width: 64 },
{
title: '名称',
dataIndex: 'name',
formItemProps: {
rules: [{ required: true, message: '请填写名称' }],
},
errorType: 'default',
},
]}
recordCreatorProps={false}
dragSortKey="sort"
editable={{ type: 'multiple', editableKeys: [1] }}
onDragSortEnd={(_, __, nextDataSource) => {
setDataSource(nextDataSource);
message.success('顺序已更新,编辑行保持编辑状态');
}}
/>
);
};
const InlineValidation = () => {
const editableFormRef = useRef<EditableFormInstance<Row>>();
return (
<Space direction="vertical" style={{ width: '100%' }}>
<Button
onClick={() => {
editableFormRef.current?.validateFields().catch(() => undefined);
}}
>
验证并显示行内错误
</Button>
<EditableProTable<Row>
editableFormRef={editableFormRef}
rowKey="id"
value={[{ id: 1, name: '' }]}
recordCreatorProps={false}
columns={[
{
title: '名称',
dataIndex: 'name',
errorType: 'default',
formItemProps: {
rules: [{ required: true, message: '请填写名称' }],
},
},
]}
editable={{ type: 'multiple', editableKeys: [1] }}
/>
</Space>
);
};
export default () => (
<ProCard direction="column" ghost gutter={[0, 16]}>
<Alert
type="info"
showIcon
message="表格稳定性与新增能力"
description="覆盖游标分页、排序筛选状态、可编辑行拖拽和行内校验错误。"
/>
<ProCard>
<Tabs
destroyOnHidden
items={[
{
key: 'cursor',
label: '游标分页 #9500',
children: <CursorPagination />,
},
{
key: 'state',
label: '排序筛选 #9197',
children: <SortFilterState />,
},
{
key: 'drag',
label: '编辑拖拽 #9046',
children: <EditableDragSort />,
},
{
key: 'error',
label: '行内错误 #8786',
children: <InlineValidation />,
},
]}
/>
</ProCard>
</ProCard>
);
#API
ProTable 在 antd 的 Table 上进行了一层封装,支持了一些预设,并且封装了一些行为。这里只列出与 antd Table 不同的 API。
#request
request 是 ProTable 最重要的 API,request 会接收一个对象。对象中必须要有 data 和 success,如果需要手动分页 total 也是必需的。request 会接管 loading 的设置,同时在查询表单查询时和 params 参数发生修改时重新执行。同时查询表单的值和 params 参数也会带入。以下是一个例子:
<ProTable<DataType, Params>
// params 是需要自带的参数
// 这个参数优先级更高,会覆盖查询表单的参数
params={params}
request={async (
// 第一个参数 params 查询表单和 params 参数的结合
// 第一个参数中一定会有 pageSize 和 current ,这两个参数是 antd 的规范
params: T & {
pageSize: number;
current: number;
},
sort,
filter,
) => {
// 这里需要返回一个 Promise,在返回之前你可以进行数据转化
// 如果需要转化参数可以在这里进行修改
const msg = await myQuery({
page: params.current,
pageSize: params.pageSize,
});
return {
data: msg.result,
// success 请返回 true,
// 不然 table 会停止解析数据,即使有数据
success: boolean,
// 不传会使用 data 的长度,如果是分页一定 要传
total: number,
};
}}
/>列配置中也支持 request,但是只有几种 valueType 支持。
#ProTable
| 属性 | 描述 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| actionRef | Table action 的引用,便于自定义触发 | React.Ref<ActionType | undefined> | - | - |
| beforeSearchSubmit | 搜索之前进行一些修改 | (params: Partial<U>) => any | - | - |
| cardBordered | Table 和 Search 外围 Card 组件的边框 | boolean | {search?: boolean, table?: boolean} | false | - |
| cardProps | table 外面卡片的设置 | ProCardProps | false | - | - |
| columns | 列配置能力,支持一个数组 | ProColumns<T, ValueType>[] | - | - |
| columnEmptyText | 空值时的显示,不设置时显示 -,false 可以关闭此功能 | ProFieldEmptyText | '-' | - |
| columnsState | 受控的列状态,可以操作显示隐藏 | ColumnStateType | - | - |
| dataSource | Table 的数据,ProTable 推荐使用 request 来加载 | T[] | - | - |
| dateFormatter | 转化 dayjs 格式数据为特定类型,false 不做转化 | 'string' | 'number' | ((value: dayjs.Dayjs, valueType: string) => string | number) | false | 'string' | - |
| defaultData | 默认的数据 | T[] | - | - |
| defaultSize | 默认的 size | SizeType | - | - |
| debounceTime | 防抖时间 | number | 20 | - |
| editable | 可编辑表格的相关配置,支持 type="multiple" 等。配置详情 | RowEditableConfig<T> | - | - |
| ErrorBoundary | 自带了错误处理功能,防止白屏,ErrorBoundary=false 关闭默认错误边界 | React.ComponentClass<any, any> | false | 内置 ErrorBoundary | - |
| form | type="form" 和搜索表单的 Form 配置,ignoreRules: false 可开启查询表单校验,详见此处 | Omit<ProFormProps & QueryFilterProps, 'form'> | - | - |
| formRef | 可以获取到查询表单的 form 实例,用于一些灵活的配置 | TableFormItem<T>['formRef'] | - | - |
| ghost | 幽灵模式,即是否取消表格区域的 padding | boolean | false | - |
| headerTitle | 左上角的 title | ReactNode | - | - |
| manualRequest | 是否需要手动触发首次请求,配置为 true 时不可隐藏搜索表单 | boolean | false | - |
| name | 可编辑表格的 name,通过这个 name 可以直接与 form 通信,无需嵌套 | NamePath | - | - |
| onDataSourceChange | Table 的数据发生改变时触发 | (dataSource: T[]) => void | - | - |
| onLoad | 数据加载完成后触发,会多次触发 | (dataSource: T[]) => void | - | - |
| onLoadingChange | loading 被修改时触发,一般是网络请求导致的 | (loading: boolean | SpinProps | undefined) => void | - | - |
| onRequestError | 数据加载失败时触发 | (error: Error) => void | - | - |
| onReset | 重置表单时触发 | () => void | - | - |
| onSizeChange | table 尺寸发生改变 | (size: DensitySize) => void | - | - |
| onSubmit | 提交表单时触发 | (params: U) => void | - | - |
| options | table 工具栏,设为 false 时不显示,传入 function 会点击时触发 | {{ density?: boolean, fullScreen?: boolean | function, reload?: boolean | function, reloadIcon?: React.ReactNode, densityIcon?: React.ReactNode, setting?: boolean | SettingOptionType }} | { reload: true, density: true, setting: true, search: false, fullScreen: false } | - |
| optionsRender | 自定义渲染工具栏选项 | ToolBarProps<T>['optionsRender'] | - | - |
| pagination | 分页器的配置,current 和 pageSize 会被 request 接管 | TablePaginationConfig | false | - | - |
| params | 用于 request 查询的额外参数,一旦变化会触发重新加载 | U | - | - |
| polling | 是否轮询,polling 表示轮询的时间 间隔,0 表示关闭轮询,大于 0 表示开启轮询,最小的轮询时间为 2000ms | number | ((dataSource: T[]) => number) | undefined | - | - |
| postData | 对通过 request 获取的数据进行处理 | (data: T[]) => T[] | - | - |
| request | 获取 dataSource 的方法 | (params: U & {pageSize?: number, current?: number, keyword?: string}, sort: Record<string, SortOrder>, filter: Record<string, FilterValue>) => Promise<{data: T[], success?: boolean, total?: number}> | - | - |
| revalidateOnFocus | 窗口聚焦时自动重新请求 | boolean | false | - |
| rowSelection | 选择项配置 | TableProps<T>['rowSelection'] & {alwaysShowAlert?: boolean} | false | - | - |
| search | 是否显示搜索表单,传入对象时为搜索表单的配置 | false | SearchConfig | - | - |
| searchFormRender | 渲染搜索表单 | (props: ProTableProps<T, U, ValueType>, defaultDom: JSX.Element) => ReactNode | - | - |
| style | 外层容器的样式 | React.CSSProperties | - | - |
| tableClassName | 封装的 table 的 className | string | - | - |
| tableExtraRender | table 和搜索表单之间的 dom 渲染 | (props: ProTableProps<T, U, ValueType>, dataSource: T[]) => ReactNode | - | - |
| tableRender | 自定义渲染表格函数 | (props: ProTableProps<T, U, ValueType>, defaultDom: ReactNode, domList: {toolbar: ReactNode, alert: ReactNode, table: ReactNode}) => ReactNode | - | - |
| tableStyle | 封装的 table 的 style | CSSProperties | - | - |
| tableViewRender | 渲染 table 视图,用于定制 ProList,不推荐直接使用;defaultDom 可为惰性函数,仅在需要默认 Table 时调用(见 resolveTableViewDefaultDom) | (props: TableProps<DataSource>, defaultDom: JSX.Element | (() => JSX.Element)) => JSX.Element | undefined | - | - |
| toolBarRender | 渲染工具栏,支持返回一个 dom 数组,会自动增加 margin-right | ToolBarProps<T>['toolBarRender'] | false | - | - |
| toolbar | 透传 ListToolBar 配置项 | ListToolBarProps | - | - |
| tooltip | 标题旁边的 tooltip | string | LabelTooltipType | - | - |
| type | pro-table 类型 | ProSchemaComponentTypes | - | - |
#RecordCreator (EditableProTable)
| 属性 | 描述 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| (...buttonProps) | antd 的 ButtonProps | ButtonProps | - | - |
| position | 行增加在哪里,开始或者末尾 | 'top' | 'bottom' | 'bottom' | - |
| record | 需要新增的行数据,一般来说包含唯一 key,支持传入函数 | T | ((index: number, dataSource: T[]) => T) | {} | - |
| newRecordType | 新增行的类型,dataSource 直接写入数据,cache 写入缓存取消后消失 | 'dataSource' | 'cache' | - | - |
| parentKey | 要增加到哪个节点下,一般用于多重嵌套表格 | React.Key | ((index: number, dataSource: T[]) => React.Key) | - | - |
#ColumnStateType
| 属性 | 描述 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| defaultValue | 列状态的默认值,只有初次生效,并用于重置使用 | Record<string, ColumnsState> | - | - |
| onChange | 列状态的值发生改变之后触发 | (value: Record<string, ColumnsState>) => void | - | - |
| persistenceKey | 持久化列的 key,用于判断是否是同一个 table | string | number | - | - |
| persistenceType | 持久化列的类型,localStorage 设置在关闭浏览器后也是存在的,sessionStorage 关闭浏览器后会丢失 | 'localStorage' | 'sessionStorage' | - | - |
| value | 列状态的值,支持受控模式 | Record<string, ColumnsState> | - | - |
#Search 搜索表单
| 属性 | 描述 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| className | 封装的搜索 Form 的 className | string | - | - |
| collapseRender | 收起按钮的 render | (collapsed: boolean, showCollapseButton?: boolean) => ReactNode | false | - | - |
| collapsed | 是否收起 | boolean | - | - |
| defaultCollapsed | 默认是否收起 | boolean | true | - |
| defaultColsNumber | 默认一行显示几个表单项(查询表单分栏数) | number | - | - |
| defaultFormItemsNumber | 默认展示几个表单项 | number | - | - |
| filterType | 过滤表单类型 | 'query' | 'light' | 'query' | - |
| labelWidth | 标签的宽度 | number | 'auto' | 80 | - |
| layout | 搜索表单布局 | 'horizontal' | 'inline' | 'vertical' | - | - |
| split | 每一行之前是否有分割线,layout 为 vertical 时生效 | boolean | - | - |
| onCollapse | 收起按钮的事件 | (collapsed: boolean) => void | - | - |
| optionRender | 自定义操作栏 | (searchConfig, formProps, dom) => ReactNode[] | false | - | - |
| resetText | 重置按钮的文本 | string | '重置' | - |
| searchText | 查询按钮的文本 | string | '查询' | - |
| searchGutter | 查询表单栅格间隔 | RowProps['gutter'] | - | - |
| showHiddenNum | 是否显示收起之后显示隐藏个数 | boolean | false | - |
| span | 配置查询表单的列数,支持按断点配置(xs/sm/md/lg/xl/xxl),未配置时按屏幕宽度自动分行 | number | SpanConfig | 响应式默认值 | - |
optionRender: false 只会隐藏操作按钮。如需在输入或选择后自动查询,可在 form.onValuesChange 中调用 formRef.current?.submit();请使用 ProTable 的 debounceTime 配置请求防抖。
#搜索表单的 rules 校验
查询表单为了不阻塞搜索,默认忽略列配置 formItemProps.rules 中的校验规则(ProTable 会为查询表单自动注入 ignoreRules: true)。如果希望查询表单也执行校验,需要显式开启:
<ProTable
columns={columns}
// 开启查询表单校验
form={{ ignoreRules: false }}
/>开启后列上的 formItemProps.rules(如 required)会在提交查询时生效;校验不通过将阻止搜索请求。可编辑表格(editable)中的行内校验不受此配置影响。
#ColConfig
const defaultSpanConfig = {
xs: 24,
sm: 24,
md: 12,
lg: 12,
xl: 8,
xxl: 6,
};实际断点值来自 antd 设计 token(screenSMMin 等),可通过 ConfigProvider 主题定制;以上为默认 token 下的参考值。
#菜单栏 options 配置
export type OptionsType =
| ((e: React.MouseEvent<HTMLSpanElement>, action?: ActionType) => void)
| boolean;
export type OptionConfig = {
density?: boolean;
fullScreen?: OptionsType;
reload?: OptionsType;
setting?: boolean | SettingOptionType;
search?: (OptionSearchProps & { name?: string }) | boolean;
reloadIcon?: React.ReactNode;
densityIcon?: React.ReactNode;
};
export type SettingOptionType = {
draggable?: boolean;
checkable?: boolean;
showListItemOption?: boolean;
checkedReset?: boolean;
listsHeight?: number;
extra?: React.ReactNode;
children?: React.ReactNode;
settingIcon?: React.ReactNode;
/** #9620: 自定义列设置面板列表项标题渲染,可取消固定宽度 实现单行自适应 */
listItemTitleRender?: (
title: React.ReactNode,
column: { key?: React.Key; title?: React.ReactNode; [key: string]: any },
) => React.ReactNode;
};#ActionRef 手动触发
有时我们要手动触发 table 的 reload 等操作,可以使用 actionRef。
| 方法 | 描述 | 类型 |
|---|---|---|
| reload | 刷新表格,如果传入 true 则重置页码 | (resetPageIndex?: boolean) => Promise<void> |
| reloadAndRest | 刷新并清空,页码也会重置,不包括表单 | () => Promise<void> |
| reset | 重置到默认值,包括表单 | () => void |
| clearSelected | 清空选中项 | () => void |
| startEditable | 开始编辑行 | (rowKey: Key) => boolean |
| cancelEditable | 取消编辑行 | (rowKey: Key) => boolean |
| scrollTo | 滚动到指定位置 | (arg: number | { index?: number; key?: Key; top?: number }) => void |
| fullScreen | 切换全屏 | () => void |
| setPageInfo | 设置分页信息 | (page: Partial<PageInfo>) => void |
// 示例
const ref = useRef<ActionType>();
<ProTable actionRef={ref} />;
// 刷新
ref.current?.reload();
// 刷新并清空,页码也会重置,不包括表单
ref.current?.reloadAndRest();
// 重置到默认值,包括表单
ref.current?.reset();
// 清空选中项
ref.current?.clearSelected();
// 开始编辑
ref.current?.startEditable(rowKey);
// 结束编辑
ref.current?.cancelEditable(rowKey);#Columns 列定义
请求远程数据比较复杂,详细可以看这里。
💡 本地排序/筛选与 request 当你提供了
request时,ProTable 默认会在筛选/排序变化后触发一次重新请求,并把服务端需要的sort/filter透传给request(params, sort, filter)。
如果你希望前端本地排序/筛选(不触发 request),请使用以下写法:
- 本地筛选:同时配置
filters+onFilter(函数或true)。 - 本地排序:将
sorter设为比较函数,或{ compare }。不要使用sorter: true(这代表服务端排序)。
排序后 Ant Design 会为当前方向添加 .ant-table-column-sorter-up.active 或 .ant-table-column-sorter-down.active,并在表头设置 aria-sort。如排序正常但颜色不变,请优先检查业务全局 CSS 是否覆盖 .active,以及 ConfigProvider 的主题 token。
:::
| 属性 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| title | 与 antd 中基本相同,但是支持通过传入一个方法 | ReactNode | ((config: ProColumnType<T>, type: ProTableTypes) => ReactNode) | - |
| tooltip | 会在 title 之后展示一个 icon,hover 之后提示一些信息 | LabelTooltipType | string | - |
| ellipsis | 是否自动缩略。true 时使用 antd Table 原生 CSS 省略(性能更优,无悬浮提示);需要 tooltip 提示或自定义时传 {showTitle?: boolean,tooltip: [TooltipProps](https://ant-design.antgroup.com/components/tooltip-cn#api)} 走 Typography 渲染 | boolean | {showTitle?: boolean,tooltip: TooltipProps} | - |
| copyable | 是否支持复制 | boolean | - |
| valueEnum | 值的枚举,会自动转化把值当成 key 来取出要显示的内容 | valueEnum | - |
| valueType | 值的类型,会生成不同的渲染器 | valueType | text |
| order | 查询表单中的权重,权重大排序靠前 | number | - |
| fieldProps | 查询表单的 props,会透传给表单项,如果渲染出来是 Input,就支持 Input 的所有 props,同理如果是 select,也支持 select 的所有 props。也支持方法传入 | (form,config)=>Record | Record | - |
formItemProps | 传递给 Form.Item 的配置,可以配置 rules,但查询表单默认忽略 rules,需配置 form={{ ignoreRules: false }} | (form,config)=>formItemProps | formItemProps | - |
| renderText | 类似 table 的 render,但是必须返回 string,如果只是希望转化枚举,可以使用 valueEnum | (text: any,record: T,index: number,action: UseFetchDataAction<T>) => string | - |
| render | 类似 table 的 render,第一个参数变成了 dom,增加了第四个参数 action | (text: ReactNode,record: T,index: number,action: UseFetchDataAction<T>) => ReactNode | ReactNode[] | - |
| formItemRender | 渲染查询表单的输入组件 | (item,{ type, defaultRender, formItemProps, fieldProps, ...rest },form,action) => ReactNode | - |
| search | 配置列的搜索相关,false 为隐藏 | boolean | { transform: (value: any) => any } | true |
| sorter | 与 antd 中基本相同,新增支持字串覆盖该栏位请求时字段 | function | boolean | string | { compare: function, multiple: number } | - |
| search.transform | 转化值的 key, 一般用于时间区间的转化 | (value: any) => any | - |
| editable | 在编辑表格中是否可编辑的,函数的参数和 table 的 render 一样 | boolean | (text: any, record: T,index: number) => boolean | - |
| colSize | 一个表单项占用的格子数量,占比= colSize*span,colSize 默认为 1 ,span 为 8,span是form={{span:8}} 全局设置的 | number | - |
| hideInTable | 在 Table 中不展示此列 | boolean | - |
| hideInForm | 在 Form 中不展示此列 | boolean | - |
| hideInDescriptions | 在 Descriptions 中不展示此列 | boolean | - |
| hideInSetting | 不在配置工具中显示 | boolean | - |
| filters | 表头的筛选菜单项,当值为 true 时,自动使用 valueEnum 生成 | boolean | object[] | false |
| onFilter | 筛选表单,为 true 时使用 ProTable 自带的,为 false 时关闭本地筛选 | (value, record) => boolean | false | false |
| onCell | 与 antd Table 相同,设置单元格属性,返回 colSpan / rowSpan 可实现合并单元格(值为 0 时不渲染该单元格),写法与 antd 合并单元格示例 完全一致 | (record: T, index?: number) => React.TdHTMLAttributes<HTMLTableCellElement> | - |
| request | 从服务器请求枚举 | request | - |
| initialValue | 查询表单项初始值 | any | - |
| disable | 列设置中disabled的状态 | boolean | { checkbox: boolean; } | - |
| readonly | 只读 | boolean | - |
| listSlot | 列表键(ProList 插槽),指定该列映射到列表项的插槽位置,如 title、avatar、description、subTitle、content、actions、aside、type,私有属性 | string | - |
#合并单元格示例
onCell 返回 colSpan / rowSpan 即可合并单元格,与 antd Table 完全一致(被合并的单元格返回 0):
| 姓名 | 年龄 | 地址 | 标签 |
|---|---|---|---|
| 胡彦祖 | 42 | 西湖区湖底公园 1 号 | 前端 / 资深 |
| 李大钊 | 前端 / 资深 | ||
| 王五 | 32 | 后端 |
import type { ProColumns } from '@ant-design/pro-components';
import { ProTable } from '@ant-design/pro-components';
import React from 'react';
interface TableColumn {
key: React.Key;
name: string;
age: number;
address: string;
tags: string[];
}
const dataSource: TableColumn[] = [
{
key: '1',
name: '胡彦祖',
age: 42,
address: '西湖区湖底公园 1 号',
tags: ['前端', '资深'],
},
{
key: '2',
name: '李大钊',
age: 32,
address: '西湖区湖底公园 1 号',
tags: ['前端', '资深'],
},
{
key: '3',
name: '王五',
age: 32,
address: '西湖区湖底公园 2 号',
tags: ['后端'],
},
];
const columns: ProColumns<TableColumn>[] = [
{
title: '姓名',
dataIndex: 'name',
key: 'name',
},
{
title: '年龄',
dataIndex: 'age',
key: 'age',
// 合并单元格:返回 colSpan/rowSpan,为 0 时该单元格不渲染
onCell: (_, index = 0) => {
// 第一行年龄向下合并一格
if (index === 0) return { rowSpan: 2 };
if (index === 1) return { rowSpan: 0 };
return {};
},
},
{
title: '地址',
dataIndex: 'address',
key: 'address',
onCell: (_, index = 0) => {
// 地址列整体合并为一列
if (index === 0) return { rowSpan: 3 };
return { rowSpan: 0 };
},
},
{
title: '标签',
dataIndex: 'tags',
key: 'tags',
render: (_, record) => record.tags.join(' / '),
},
];
export default () => (
<ProTable<TableColumn>
columns={columns}
dataSource={dataSource}
rowKey="key"
search={false}
options={false}
pagination={false}
/>
);
#valueType 值类型
ProTable 封装了一些常用的值类型来减少重复的 render 操作,配置一个 valueType 即可展示格式化响应的数据。
#批量操作
与 antd 相同,批量操作需要设置 rowSelection 来开启,与 antd 不同的是,pro-table 提供了一个 alert 用于承载一些信息。你可以通过 tableAlertRender