跳到主要内容

ProTable - 高级表格

ProTable 是 Antd ProTableModalForm 的结合,并且融入了删除,前端导出等功能。更加贴合实际场景。

如果你之前并不熟悉 ProTable 的 api,完全可以直接看例子来开始使用。

一个基本的 CRUD 表格

这是一个基本的 CRUD 表格,包含了 查询新建编辑删除。初次接触 ProTable 的用户可能会遇到很多陌生的 api,让人感觉很不舒服,没关系,我们会通过几个例子慢慢展开。

用户列表
用户名电话昵称性别创建日期操作
暂无数据
暂无数据

查询

先来认识一下 request 属性。通过传入一个请求函数,ProTable 就帮我们做好了数据请求,分页,查询,重置等功能。请求函数必须返回一个 promise (一般是一个 axios 实例),并且 promise 中返回的数据需要满足下面的要求:

// Promise回返的数据格式
{
data: [], // 表格数据源
success: true,
total: 6 // 用于分页
}
<ProTable
request={(params) => requestApi(params)}
...
/>

请求函数的第一个参数 params 会包含分页,搜索等请求参数:

{
current: 2,
pageSize: 5,
... // 其它搜索字段
}

用户可以与后台约定好这些请求参数和返回格式,也可以自已在全局包装一下后传给后台。

用户名电话昵称性别创建日期
暂无数据
暂无数据

新增

接上一个例子,我们先来添加一个新增按钮。

ProTable 内部规划了多个区域用于放置不同的按钮,用户只要在相应的 api 上配置按钮就可以了。这么做一方面能让各表格的功能区域保持清晰统一,另一方面对于终端用户来说也能减少他们对表格操作的熟悉成本。

protable各区域的划分,红色字是大区块, 分成search, toolbar, tableAlert等区域. toolbar大块里还包含actions小块

上图中的红色字是大区块,大区块里还包含黑色的小区块。对于新增按钮来说,可以加到 toolbar 大区块里的 actions 小区块里(也可以加到 title 里)。

<ProTable
toolbar={{
actions: [
<Button
key={1}
type="primary"
>
新增
</Button>,
],
}}

添加了按钮之后,通过 innerRef.current.openModal() 就能打开表单。

<ProTable
innerRef={innerRef}
toolbar={{
actions: [
<Button
key={1}
type="primary"
onClick={() => innerRef.current.openModal()}
>
新增
</Button>,
],
}}

最后设置 onFinish 属性就完成了表单的新增。

<ProTable
columns={getColumns()}
request={mockRequest}
pagination={{ pageSize: 5 }}
innerRef={innerRef}
toolbar={{
actions: [
<Button
key={1}
type="primary"
onClick={() => innerRef.current?.openModal()}
>
新增
</Button>,
],
}}
onFinish={async (values, formType) => {
if (formType === 'new') {
await mockAdd(values);
message.success('新建成功');
actionRef.current?.reload(); // 新增成功后用 actionRef 重新请求接口
}
}}
/>
用户名电话昵称性别创建日期
暂无数据
暂无数据

编辑

接上一个例子,要实现编辑功能,可以在 columns 里增加一个操作列来添加编辑按钮。

// columns
{
title: '操作',
valueType: 'option', // valueType 设为 option 代表是操作列
render: (text, record, index, actionRef, innerRef) => [
<LinkButton
key={1}
onClick={() => innerRef.current?.openModal('edit', record)}
>
编辑
</LinkButton>,
],
},

当 valueType 为 option 时,render 函数会被自动注入 innerRef 参数,通过 innerRef 就可以打开编辑弹框并且对表单赋值。

编辑弹框打开后我们继续完善 onFinish 中的更新部分:

<ProTable
...
onFinish={async (values, formType, formData) => {
if (formType === 'new') {
await mockAdd(values);
message.success('新建成功');
actionRef.current?.reload();
}

if (formType === 'edit') {
await mockUpdate({ ...values, id: formData.id });
message.success('更新成功');
actionRef.current?.reload();
}
}}
/>

从 11 行我们注意到,更新接口除了需要表单值以外,还需要额外传递记录 id 给后台。

我们先来看一下 onFinish 的三个参数:

  • values - 表单收集到的值。
  • formType - 表单类型('new' 或 'edit')
  • formData - 赋给表单的初始值(里面包含 id)

这个 formData 其实就是 innerRef.current?.openModal('edit', record) 里的 record。

因此 id 可以从 formData 里取。

用户名电话昵称性别创建日期操作
暂无数据
暂无数据

删除

删除功能与上文中的 request 属性非常相似,ProTable 提供了一个 delFunction 属性,只需要传入一个删除函数,ProTable 就帮我们做好了批量删除和行上删除的功能,

删除函数同样返回一个 promise,参数是所选行的 ids 数组。

要支持批量删除还需要开启行选择功能。

<ProTable
...
delFunction={mockDetroy}
rowSelection={{}}
/>

行上删除的功能默认是关闭的,是为了节省列的横向空间,可以在 columns 里单独开启。

// columns
{
title: '操作',
valueType: 'option', // valueType 设为 option 代表是操作列
render: (text, record, index, actionRef, innerRef) => [
<LinkButton
key={1}
onClick={() => innerRef.current?.openModal('edit', record)}
>
编辑
</LinkButton>,
],
// boolean
enableDelete: true,
// 或者是函数
enableDelete: () => ({
disabled: true,
visible: true,
danger: true,
btnText: '关闭'
}),
},
用户名电话昵称性别创建日期操作
暂无数据
暂无数据

以上就是一个完整的 CRUD 表格 ✨。

基本概念

valueType

ProTable 同样支持 valueType,只是与 SchemaForm 不同的是,ProTable 的 valueType 主要是用于显示。比如当指定 date 类型时,当后台返回一个时间戳时,表格中会自动显示成时间。

datedateTimedateRangemoney
暂无数据
暂无数据

renderText 与 render 的区别

在 ProTable 的 column 里 renderrenderText 很容易混淆。

renderText更接近于 Antd Table 的 render,但是必需返回 string。最终在表格上显示的时候会把省略号,复制图标(如果有)等内容拼接上去。

render可以完全自定义内容的显示。但是它的第一个参数是 dom 而不是 text,这个需要注意。这个 dom 里包含了省略号和复制图标(如果有)等内容。

用户名电话
暂无数据
暂无数据

搜索区域的配置项

column 里的 hideInSearch 字段用于控制是否在搜索表单里隐藏。或者用 search: false。两者等效。

{
title: '昵称',
dataIndex: 'nickName',
hideInSearch: true, // 在搜索表单里隐藏
search: false, // 在搜索表单里隐藏
}

也可以在组件级别关闭搜索区域。

<ProTable search={false} />

或者配置搜索区域:

<ProTable
search={{
labelWrap: true, // 过长换行
defaultCollapsed: false, // 默认展开
}}
/>
用户列表
很长很长很长的用户名电话昵称性别创建日期
暂无数据
暂无数据

type 用于区分各区域

在 ProTable 组件中同一份 columns 既会被用于生成 Table,也有可能被用于生成 Form 又或者 Search。原来我们用 hideInSearchhideInTablehideInForm 来控制 column 在各区域的显示与隐藏,但是当 column 变多之后这种反向控制的逻辑就不太好理解,所以我们新增了 type 字段 form | table | search 来正向控制 column 显示在哪个区域,比如 type: search 代表该 column 只会显示在搜索区域。

type: search 的优先级最高, 会覆盖 hideInSearch: true 和 search: false

同时 ProTable 新增了 defaultHideInSearch 属性来全局控制 column 是否默认显示在搜索区域。

用户列表
用户名创建日期操作
暂无数据
暂无数据

搜索表单的关联控制

用户列表
用户昵称
暂无数据
暂无数据

受控表单

不想使用 request?那就传入 dataSource 当成普通 table 来使用。同样集成了新增编辑功能。

受控列表
用户名电话操作
王先生1596668888

导出表格数据

可以使用 exceljs 来导出表格数据。组件已经对数据进行了处理,只需传入 ExcelJS 对象就可以轻松导出。

使用前需要先在自已的项目中安装 exceljs:

npm i exceljs --save

在页面中导入 exceljs:

import * as ExcelJS from 'exceljs';

通过 innerRef.current?.export(rows, ExcelJS) 进行导出。参考示例。

用户列表
用户名生日性别类型会员范围状态创建日期
暂无数据
暂无数据
用户列表
用户名生日性别类型会员范围状态创建日期
暂无数据
暂无数据

更改删除确认框的类型和文字

用户名电话昵称性别创建日期操作
暂无数据
暂无数据

弹窗相关

更改弹窗表单的布局

通过 modalFormProps 属性可以透传 ModalForm 中的属性。

用户列表
用户名电话昵称性别身份证号操作
暂无数据
暂无数据

弹窗只读模式

innerRef.current?.openModal('read', initialData)

用户列表
用户名电话昵称是否会员操作
暂无数据
暂无数据

表单数据

onOpen 请求数据后回显

点击编辑时请求接口后回显。新击新增时不请求。

用户列表
用户名电话操作
暂无数据
暂无数据

约定式

SchemaForm 一样,ProTable 同样支持约定式数据处理。

用户列表
用户名部门会员会员等级操作
暂无数据
暂无数据

利用 innerRef 存储额外信息

SchemaForm 一样,ProTable 也能利用 innerRef 存储额外数据。

序号员工部门操作
暂无数据
暂无数据

API

ProTable

ProTable 类型是 ProTableSelfTypeProTableOriginType 的结合。

ProTableSelfType

属性名描述类型默认值
columns表格或表单的配置描述;(必选)
request获取 dataSource 的方法;((params: any, sort: Record<string, SortOrder>, filter: Record<string, (string | number)[] | null>) => Promise<Partial<RequestData<any>>>)--
actionRef用于手动触发 table 的一些操作,比如 reload, reset 等;--
innerRef一个工具类 ref,包含了一些方法和属性;--
name用于 table 的 headerTitle 的显示, 还有弹出框的 title 显示; 可以配合 locale 修改文案。string--
onFinish点击弹窗确定按钮后的回调;(values, formType, formData) => Promise | void--
onOpen打开弹框后的回调, 可以在这里请求数据;(formType, formRef, formData) => Promise | void--
delFunction传入的删除函数;((selectedIds: (string | number)[], record: any) => void | Promise<any>)--
delPermission是否有删除权限; 不传默认为有;(() => boolean)--
tableAlertOption多选删除功能的选项;--
tableAlertOptionRender自定义 table alert 右侧区域;false | ((option: { selectedRowKeys: any[]; selectedRows: any[]; onCleanSelected: () => void; }, doms: { delDom?: ReactNode; cancelDom: ReactNode; }) => ReactNode)--
modalFormProps传递给 ModalForm 组件的属性。
Omit<ModalFormProps, 'innerRef' | 'onFinish' | 'onOpen' | 'columns'>
--
noPadding移除 Card 包裹的 padding; 已废弃; 用 cardStyle = false 替代;boolean--
delConfirmType删除的确认弹框类型。"popconfirm" | "modal"popconfirm
delPopconfirmProps传给删除确认框的属性。title 和 description 可以是函数;(Omit<PopconfirmProps, "title" | "description"> & { title?: ReactNode | ((record: any, index: any) => ReactNode); description?: ReactNode | ((record: any, index: any) => ReactNode); })--
delModalConfirmProps传给删除确认框的属性。title 和 content 可以是函数;(Omit<ModalFuncProps, "title" | "content"> & { title?: ReactNode | ((record: any, index: any) => ReactNode); content?: ReactNode | ((record: any, index: any) => ReactNode); })--
delSuccessProps删除成功后的提示属性(传递给 Message 的属性)。false 关闭提示。{content: "删除成功", type: "success"}
search搜索区域的选项;
false | {labelWrap?: boolean} & SearchConfig
--
optionColumnSpaceProps传给操作列中包裹各按钮的 Space 组件的属性。{size: 'small'}
defaultHideInSearchcolumns 中的列是否默认在搜索区域里隐藏。booleanfalse
rakLocale用于修改 headerTitle 的后缀文案和 formType 等对应的文案。LocaleTypezh_CH
formColumns弹框中的表单项。FormColumnType[]columns

ProTableOriginType

属性名描述类型默认值
rowSelection选择项配置false | (TableRowSelection<any> & { alwaysShowAlert?: boolean; }) | undefined--
scroll--({ x?: string | number | true; y?: string | number | undefined; } & { scrollToFirstRowOnChange?: boolean | undefined; }) | undefined--
indentSize--number--
title--PanelRender<any>--
prefixCls--string--
className--string--
style--CSSProperties--
rowKey--string | number | symbol | GetRowKey<any>--
tableLayout--TableLayout--
expandableConfig expand rowsExpandableConfig<any>--
rowClassName--string | RowClassName<any>--
footer--PanelRender<any>--
summary--((data: readonly any[]) => ReactNode)--
caption--ReactNode--
id--string--
showHeader--boolean--
components--TableComponents<any>--
onRow--GetComponentProps<any>--
onHeaderRow--GetComponentProps<readonly ColumnType<any>[]>--
direction--Direction--
sticky--boolean | TableSticky--
rowHoverable--boolean--
onScroll--UIEventHandler<HTMLDivElement>--
dropdownPrefixCls--string--
dataSource--readonly any[]--
pagination--false | TablePaginationConfig--
loading--boolean | SpinProps--
size--SizeType--
bordered--boolean--
locale--TableLocale--
rootClassName--string--
onChange--((pagination: TablePaginationConfig, filters: Record<string, FilterValue | null>, sorter: SorterResult<any> | SorterResult<...>[], extra: TableCurrentDataSource<...>) => void)--
getPopupContainer--GetPopupContainer--
sortDirections--SortOrder[]--
showSorterTooltip--boolean | SorterTooltipProps--
virtual--boolean--
toolbarListToolBar 的属性ListToolBarProps--
ghost幽灵模式,即是否取消卡片内容区域的 padding 和 卡片的背景颜色。boolean--
paramsrequest 的参数,修改之后会触发更新any--
columnsStateMap列状态配置,可以配置是否浮动和是否展示Record<string, ColumnsState>--
onColumnsStateChange列状态配置修改触发事件((map: Record<string, ColumnsState>) => void)--
columnsState列状态的配置,可以用来操作列功能ColumnStateType--
onSizeChange--((size: DensitySize) => void)--
cardPropstable 外面卡片的设置false | CardProps--
tableRender渲染 table((props: ProTableProps<any, any, "text">, defaultDom: Element, domList: { toolbar: Element; alert: Element | undefined; table: Element | undefined; }) => ReactNode) | undefined--
tableViewRender渲染 table 视图,用于定制 ProList,不推荐直接使用((props: TableProps<any>, defaultDom: Element) => Element) | undefined--
tableExtraRendertable 和搜索表单之间的 dom 渲染((props: ProTableProps<any, any, "text">, dataSource: any[]) => ReactNode)--
searchFormRender渲染搜索表单((props: ProTableProps<any, any, "text">, defaultDom: Element) => ReactNode)--
postData对数据进行一些处理any--
defaultData默认的数据any[]--
formRef操作自带的 formMutableRefObject<ProFormInstance> | undefined--
toolBarRender渲染操作栏false | ((action: ActionType, rows: { selectedRowKeys?: (string | number)[] | undefined; selectedRows?: any[] | undefined; }) => ReactNode[]) | undefined--
optionsRender--((props: ToolBarProps<any>, defaultDom: ReactNode[]) => ReactNode[])--
onLoad数据加载完成后触发((dataSource: any[]) => void)--
onLoadingChangeloading 被修改时触发,一般是网络请求导致的((loading: boolean | SpinProps) => void) | undefined--
onRequestError数据加载失败时触发((e: Error) => void)--
polling是否轮询 ProTable 它不会自动提交表单,如果你想自动提交表单的功能,需要在 onValueChange 中调用 formRef.current?.submit()number | ((dataSource: any[]) => number)--
tableClassName给封装的 table 的 classNamestring--
tableStyle给封装的 table 的 styleCSSProperties--
headerTitle左上角的 titleReactNode--
tooltip标题旁边的 tooltipLabelTooltipType--
options操作栏配置false | OptionConfig--
dateFormatter暂时只支持 dayjs - string 会格式化为 YYYY-DD-MM - number 代表时间戳false | "string" | "number" | (string & {}) | ((value: Dayjs, valueType: string) => string | number)--
beforeSearchSubmit格式化搜索表单提交数据((params: Partial<any>) => any)--
tableAlertRender设置或者返回false 即可关闭AlertRenderType<any>--
type支持 ProTable 的类型ProSchemaComponentTypes--
onReset重置表单时触发(() => void)--
columnEmptyText空值时显示ProFieldEmptyText--
manualRequest是否手动触发请求boolean--
editable编辑行相关的配置RowEditableConfig<any>--
onDataSourceChange可编辑表格修改数据的改变((dataSource: any[]) => void)--
cardBordered查询表单和 Table 的卡片 border 配置Bordered--
debounceTime去抖时间number--
revalidateOnFocus只在request 存在的时候生效,可编辑表格也不会生效booleanfalse
defaultSize默认的表格大小SizeType--
ErrorBoundary错误边界自定义false | ComponentClass<any, any>--

InnerRefType

属性名描述类型默认值
params查询参数。any--
total总条数。number--
dataSource表格数据。any--
export导出表格数据。(rows: any, ExcelJS: any, options?: { beforeExport?: ((worksheet: any) => void) | undefined; filename?: string | undefined; } | undefined) => void(必选)
openModal用于打开弹窗; formType 可用于在 onFinish 的时候判断表单类型;(formType?: FormType | undefined, initialValues?: object | null | undefined, cb?: (() => void) | undefined) => void(必选)
formType当前的表单类型FormType--
data可以存储一些额外数据Record<string, any>(必选)
setData存入数据; setData 和 react 的 setState 一样, 只需要传入关心的字段就可以, 不会覆盖其它的字段。(values: Record<string, any>) => void(必选)

TableAlertOptionType

属性名描述类型默认值
enableDelete是否开启 alert 上的删除boolean | ((selectedRowKeys: any[], selectedRows: any[]) => boolean | EnableDeleteType)true
delPopconfirmProps传给 alert 上删除确认框的属性。title 和 description 可以是函数;(Omit<PopconfirmProps, "title" | "description"> & { title?: ReactNode | ((selectedRowKeys: any[], selectedRows: any[]) => ReactNode); description?: ReactNode | ((selectedRowKeys: any[], selectedRows: any[]) => ReactNode); })--
delModalConfirmProps传给 alert 上删除确认框的属性。title 和 content 可以是函数;(Omit<ModalFuncProps, "title" | "content"> & { title?: ReactNode | ((selectedRowKeys: any[], selectedRows: any[]) => ReactNode); content?: ReactNode | ((selectedRowKeys: any[], selectedRows: any[]) => ReactNode); })--
spaceProps传递给 alert 中包裹各按钮的 Space 组件的属性。{size: 'middle'}

TableColumnType

由于 ProTable 的 columns 既能用于生成 Table 也能用于生成 Form,因此 TableColumnType 类型其实是 TableColumnSelfTypeTableColumnOriginTypeFormColumnType 的结合。

TableColumnSelfType

属性名描述类型默认值
enableDelete是否开启操作列上的删除boolean | ((record: any, index: number) => boolean | (EnableDeleteType & { btnIndex?: number; })) | undefined--
renderExport定义导出((text: string | number, record: any) => string | number)--
render给 render 方法注入 innerRef((dom: ReactNode, record: any, index: number, action: ActionType, innerRef: InnerRef) => any)--
type用于指定该 schema 是被用于表单还是表格"search" | "form" | "table"--
children套嵌表格TableColumnType<any, "text">[]--

TableColumnOriginType

属性名描述类型默认值
title支持 ReactNode 和 方法ReactNode | ((schema: ProSchema<any, Omit<ColumnType<any>, "title" | "children" | "render" | "filters" | "onFilter" | "sorter"> & { sorter?: string | boolean | CompareFn<...> | { ...; }; } & { ...; }, ProSchemaComponentTypes, "text", { ...; }>, type: ProSchemaComponentTypes, dom: ReactNode) => ReactNode)--
className--string--
sortDirections--SortOrder[]--
showSorterTooltip--boolean | SorterTooltipProps--
search在查询表单中隐藏boolean | { transform: SearchTransformKeyFn; }--
request从服务器请求枚举ProFieldRequestData<any>--
params从服务器请求的参数,改变了会触发 reloadRecord<string, any> | ((record: any, column: ProSchema<any, Omit<ColumnType<any>, "title" | "children" | "render" | "filters" | "onFilter" | "sorter"> & { ...; } & { ...; }, "form", "text", unknown>) => Record<...>)--
tooltip展示一个 icon,hover 是展示一些提示信息LabelTooltipType--
debounceTimerequest防抖动时间 默认10 单位msnumber--
filters表头的筛选菜单项boolean | ColumnFilterItem[]--
onFilter筛选的函数,设置为 false 会关闭自带的本地筛选boolean | ((value: boolean | Key, record: any) => boolean)--
sorter--string | boolean | CompareFn<any> | { compare?: CompareFn<any>; multiple?: number | undefined; } | undefined--
colSpan--number--
dataIndex支持一个数字,[a,b] 会转化为 obj.a.bany--
shouldCellUpdate--((record: any, prevRecord: any) => boolean)--
rowSpan--number--
width--string | number--
minWidth--number--
onCell--GetComponentProps<any>--
onCellClickPlease use `onCell` instead((record: any, e: MouseEvent<HTMLElement, MouseEvent>) => void)--
key确定这个列的唯一值,一般用于 dataIndex 重复的情况Key--
hidden--boolean--
fixed--FixedType--
onHeaderCell--GetComponentProps<ColumnType<any> | ColumnGroupType<any>>--
ellipsis是否缩略CellEllipsisType--
align--AlignType--
rowScope--RowScopeType--
sortOrder--SortOrder--
defaultSortOrder--SortOrder--
sortIcon--((props: { sortOrder: SortOrder; }) => ReactNode)--
filtered--boolean--
filterDropdown--ReactNode | ((props: FilterDropdownProps) => ReactNode)--
filterOnClose--boolean--
filterMultiple--boolean--
filteredValue--FilterValue | null--
defaultFilteredValue--FilterValue | null--
filterIcon--ReactNode | ((filtered: boolean) => ReactNode)--
filterMode--"menu" | "tree"--
filterSearch--FilterSearchType<ColumnFilterItem>--
filterDropdownPropsCan cover `<Dropdown>` propsCoverableDropdownProps--
filterResetToDefaultFilteredValue--boolean--
responsive--Breakpoint[]--
tip--string--
valueEnum支持 object 和Map,Map 是支持其他基础类型作为 keyProSchemaValueEnumObj | ProSchemaValueEnumMap | ((row: any) => ProSchemaValueEnumObj | ProSchemaValueEnumMap)--
formItemProps自定义的 formItemProps(FormItemProps<any> & { lightProps?: LightWrapperProps; }) | ((form: FormInstance<any>, config: { key?: Key | undefined; ... 19 more ...; proFieldProps?: (ProFieldProps & Record<...>) | undefined; } & ... 4 more ... & { ...; }) => FormItemProps<...> & { ...; }) | undefined--
renderText修改的数据是会被 valueType 消费((text: any, record: any, index: number, action: ProCoreActionType<{}>) => any)--
dependencies依赖字段的name,暂时只在拥有 request 的项目中生效,会自动注入到 params 中any[]--
ignoreFormItem忽略 FormItem,必须要和 renderFormItem 组件一起使用boolean--
hideInDescriptions在 descriptions 隐藏boolean--
hideInForm在 Form 中隐藏boolean--
hideInTable在 table 中隐藏boolean--
hideInSearch在 table的查询表单 中隐藏boolean--
proFieldProps设置到 ProField 上面的 Props,内部属性(ProFieldProps & Record<string, any>)--
index--number--
colSize每个表单占据的格子大小number--
initialValue搜索表单的默认值any--
copyable是否拷贝boolean--
hideInSetting不在配置工具中显示boolean--
orderForm 的排序number--
listKey--string--
readonly只读boolean--
disable列设置的 disabledboolean | { checkbox: boolean; }--
valueType--ProFieldValueType | { type: "money"; status?: "normal" | "active" | "success" | "exception"; locale?: string | undefined; showSymbol?: boolean | ((value: any) => boolean) | undefined; ... 4 more ...; width?: number | undefined; } | ... 4 more ... | undefined--

FormColumnType

EnableDeleteType

属性名描述类型默认值
disabled操作列中的删除按钮是否禁用。boolean--
visible操作列中的删除按钮是否可见。boolean--
danger操作列中的删除按钮的 danger 属性。boolean--
btnText操作列中的删除按钮的文字。string--

全局事件

事件名描述说明
@proTableReload组件注册了一个 reload 事件, 可以通过 document.dispatchEvent(new Event('@proTableReload')) 方法来触发表格刷新. 新增这个 reload 事件是希望能在其它的兄弟页面来触发表格页面的刷新, 比如在一些缓存场景, 新增页面提交成功后能够通过这个事件来触发表格页面的刷新.v1.0.0