ProTable - 高级表格
ProTable 是 Antd ProTable 和 ModalForm 的结合,并且融入了删除,前端导出等功能。更加贴合实际场景。
如果你之前并不熟悉 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 上配置按钮就可以了。这么做一方面能让各表格的功能区域保持清晰统一,另一方面对于终端用户来说也能减少他们对表格操作的熟悉成本。

上图中的红色字是大区块,大区块里还包含黑色的小区块。对于新增按钮来说,可以加到 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 类型时,当后台返回一个时间戳时,表格中会自动显示成时间。
| date | dateTime | dateRange | money |
|---|---|---|---|
暂无数据 | |||
renderText 与 render 的区别
在 ProTable 的 column 里 render 跟 renderText 很容易混淆。
renderText更接近于 Antd Table 的 render,但是必需返回 string。最终在表格上显示的时候会把省略号,复制图标(如果有)等内容拼接上去。
render可以完全自定义内容的显示。但是它的第一个参数是 dom 而不是 text,这个需要注意。这个 dom 里包含了省略号和复制图标(如果有)等内容。