table的 props参考 antd Table,Pagination,和 ProTable的 props

  1. 数据驱动 界面渲染
  2. 字段绑定,动态计算
  3. 前端校验,后端校验
  4. 数据转换,构建

表格、表单、列表、图表和布局
布局组件
表格组件
导入 Excel 、语雀表格的数据
表格数据的智能 mock填充,支持文本、编号、数据、时间、地址 e
father 打包覆盖 esm、cjs 和 umd
Islands 架构, astro
Table 的状态就是 Editor 的 config 字段,当 Table 改时,会触发 Editor 的 config 字段同步更新。当 Editor 更新时,也会触发该数据更新
支持撤销重做、快捷键等能力

store

  • api
  • table
  • columns
  • search
  • toolbar
  • pagination
    1. const store = {
    2. defaultConfig: {},
    3. columns: [
    4. {
    5. "dataIndex": "name",
    6. "valueType": "text",
    7. "fieldType": "string"
    8. }
    9. ],
    10. dataSource: [],
    11. table: {
    12. rowKey: 'id',
    13. bordered: false,
    14. showHeader: true,
    15. footer: true,
    16. size: 'middle',
    17. "primaryColor": "",
    18. "showRowSelection": false,
    19. "rowSelectionType": "checkbox", // radio, ''
    20. "enableScroll": false,
    21. scrollToFirstRowOnChange: true,
    22. widthType: 'auto',
    23. widthNumber: 1360,
    24. primaryColor: '#f90',
    25. },
    26. api: {
    27. type: 'restful',
    28. url: '',
    29. method: 'POST',
    30. params: {},
    31. },
    32. search: {
    33. collapsed: true,
    34. filterType: 'query'
    35. },
    36. toolbar: {
    37. actionGroups: [],
    38. setting: true,
    39. reload: true,
    40. fullScreen: true,
    41. density: true,
    42. showOptions: 'auto',
    43. headerTitle: '表格标题'
    44. },
    45. pagination: {
    46. current: 1,
    47. pageSize: 10,
    48. size: 'small',
    49. "enabled": false,
    50. },
    51. }

ProTable

  1. <ProTable
  2. headerTitle=''
  3. tooltip=''
  4. search={} // false
  5. // 不显示右侧操作按钮
  6. options={false}
  7. toolBarRender={false}
  8. />

request

page,pageNumber,pageSize 是表格常用的 state状态参数
ProTable 会将 props.params 中的数据默认带入到请求中

request,使用的是 umi-request
https://www.npmjs.com/package/umi-request

约定 request 拥有三个参数

  1. params 会自带 pageSize 和 current , 并且将 props 中的 params 也会带入其中,
  2. sort 用与排序,
  3. filter 用于筛选。自定义的参数通过 params 参数 传入 ProTable,会合并到 request 中的 params 中

proTable-search.jpg

  1. const params = {
  2. current: number, // 当前页码
  3. pageSize: number // 每页多少条数据
  4. ...params // 你传入的其他查询数据
  5. }
  6. import request from 'umi-request';
  7. const fetchData = (params, sort, filter) =>
  8. request('https://proapi.azurewebsites.net/github/issues', {
  9. params,
  10. sort,
  11. filter,
  12. });
  13. function App() {
  14. return (
  15. <ProTable
  16. params={{ keyWords }}
  17. request={fetchData}
  18. columns={columns}
  19. search={{
  20. labelWidth: 200
  21. }}
  22. />
  23. )
  24. }

request 和 params文档
https://procomponents.ant.design/components/schema/#request-%E5%92%8C-params

实际业务中,后端定义接口常常与我们需求的不同,可以做自定义转换,
比方说下面是一段在项目中实际使用的代码,后端代码

  1. request={async (params = {}) => {
  2. const { current, pageSize } = params;
  3. const { data, success } = await fetchData({
  4. page: current,
  5. limit: pageSize,
  6. });
  7. return {
  8. data: data?.list,
  9. total: data?.total,
  10. success,
  11. };
  12. }}

单独一次的转换可能成本不算什么,每个接口都转一遍成本就比较大了
解决:让后端在定义接口时可以与组件定义的数据结构保持一致

请求回来的结果的 ProTable 也有一些约定

  1. interface RequestData {
  2. data: Data[];
  3. success: boolean;
  4. total: number;
  5. }

columns

查询表单与表格共用 [columns 列定义的数据,查询表单根据表格项的类型生成对应类型的表单
https://procomponents.ant.design/components/table#columns-%E5%88%97%E5%AE%9A%E4%B9%89
通过切换 [valueType 值的类型切换表格项的展示形式以及表单项的选择形式。
如将创建时间的 valueType 从 dateTime 改为 date ,表格中和搜索表单项都会相应变化

某些表单你希望它在另外一些表单的前面,你可以通过指定 order 来进行排序,权重大排序靠前

  1. const columns: ProColumns<API.fetchData>[] = [
  2. {
  3. title: '序号',
  4. dataIndex: 'index',
  5. // 可以通过 valueType 指定值的格式化方式
  6. valueType: 'indexBorder',
  7. width: 72,
  8. },
  9. // column 的 title 属性支持传入一个函数
  10. {
  11. title: (_, type) => {
  12. if( type === 'form') return '用户名称';
  13. return '这是一个超长的用户名称';
  14. },
  15. dataIndex: 'name',
  16. width: 100,
  17. }
  18. {
  19. title: '用户账号',
  20. dataIndex: 'account',
  21. renderFormItem: () => <UserSearch />,
  22. width: 100,
  23. },
  24. {
  25. title: '创建时间',
  26. dataIndex: 'createDt',
  27. width: 200,
  28. valueType: 'date',
  29. // 将列数设置为 4 列,创建时间的表单项占据 2 列
  30. colSize: 2,
  31. renderFormItem: () => <RangePicker showTime style={{ width: '100%'}} />
  32. },
  33. ]

在 columns 中可以同时配置这两方面的显示隐藏
hideInSearch: true,在 查询表单中不展示此项
hideInTable: true 在 Table中不展示此列

search 查询表单

查询表单项的宽度
体调整表单项的 labelWidth ,默认为 80

  1. <ProTable
  2. search={{
  3. labelWidth: 100,
  4. span: 12,
  5. // 收起状态下能够多展示一些表单项,因为重置查询按钮固定占一列,所以设置为 5 时只会展示 4 个表单项
  6. defaultColsNumber: 5,
  7. }}
  8. request={
  9. const res = { total: 200, data: [], success: true }
  10. return Promise.resolve(res)
  11. }
  12. />

有些自定义的表单项可能会比较长,需要占据多列,比方说日期的范围输入

  1. 调整 labelWidth
  2. search 调整配置查询表单的列数 span,这里遵循 antd 的24栅格系统,即列数 = 24 / span ,如下是 12 即展示位 2列。
  3. columns 调整让该表单项占据更多的 colSize ,即一个表单项占用的格子数量

自定义查询按钮组

  1. <ProTable
  2. search={{
  3. defaultCollapsed: false,
  4. optionRender: ({ searchText, resetText }, { form }) => [
  5. <Button
  6. key="search"
  7. type="primary"
  8. onClick={() => {
  9. form?.submit();
  10. }}
  11. >
  12. {searchText}
  13. </Button>,
  14. <Button
  15. key="rest"
  16. onClick={() => {
  17. form?.resetFields();
  18. }}
  19. >
  20. {resetText}
  21. </Button>,
  22. <Button key="out">导出</Button>,
  23. ],
  24. }}
  25. />

简单查询

简单的表格需求中,我们要的可能不是一个查询表单,而是一个简单的查询输入
只有一个 input框
方法一:通过 options 中的 search 选项设置为 true ,默认变量为 keyword ,
你也可以传入 name 自定义变量名,或者传入更多搜索表单的相关选项,如 placeholder

  1. <ProTable
  2. request={async (params) => {
  3. console.log(params);
  4. // {current: 1, pageSize: 20, keyword: "123"}
  5. }}
  6. search={false} // search 用于控制查询表单不显示
  7. options={{
  8. search: true, // 打开搜索功能表单。
  9. // search: {
  10. // name: 'userName',
  11. // placeholder: '请输入用户名'
  12. // }
  13. }}
  14. headerTitle="toolbar 中搜索"
  15. />

toolBarRender

通过 `toolBarRender 自定义搜索项

  1. export default () => {
  2. const actionRef = useRef();
  3. const [keyWord, setKeyWord] = useState();
  4. return (
  5. <ProTable
  6. params={{keyWord}}
  7. request={async (params = {}) => {
  8. console.log('params', params);
  9. // {current: 1, pageSize: 20, keyWord: "1111"}
  10. }}
  11. toolBarRender={() => [
  12. <Input.Search
  13. style={{
  14. width: 350,
  15. }}
  16. onSearch={(value) => setKeyWord(value)}
  17. placeholder="按数据名称搜索"
  18. />,
  19. <ProForm tableRef={actionRef} />,
  20. ]}
  21. />
  22. );
  23. };

自定义表单

自定义的表单项都要能够接受 value 和 onChange
通常直接传的表单项如 Input, Select 等都是支持 value 和 onChange 的
如果是项目中又封装了一层,记得要传入 {…props}

自定义列表工具栏

在表格中进行 tab 切换等,用 ListToolBar 列表工具栏进行高级定制:
https://procomponents.ant.design/components/table#%E5%88%97%E8%A1%A8%E5%B7%A5%E5%85%B7%E6%A0%8F
在 ProTable 的 params 中添加 activeKey,就会在 request 的时候自动带上该参数啦

  1. function App() {
  2. const [activekey, setActiveKey] = useState('tab1');
  3. return (
  4. <ProTable
  5. params={{activekey}}
  6. request={async (params = {}) => {
  7. console.log('params', params);
  8. // {current: 1, pageSize: 20, keyWord: "1111"}
  9. }}
  10. toolbar={{
  11. menu: {
  12. type: 'tab',
  13. activeKey: activekey, // 'tab1'
  14. items: [
  15. {
  16. key: 'tab1',
  17. label: '普通用户'
  18. },
  19. {
  20. key: 'tab2',
  21. label: '氪金用户'
  22. },
  23. {
  24. key: 'tab3',
  25. label: '管理员'
  26. },
  27. ],
  28. onChange: (key) => {
  29. setActiveKey(key as string);
  30. },
  31. },
  32. }}
  33. />
  34. )
  35. }
  1. {
  2. "table": {
  3. "showHeader": true,
  4. "footer": true,
  5. "size": "middle",
  6. "bordered": false,
  7. "primaryColor": "",
  8. "rowKey": "id",
  9. "showRowSelection": false,
  10. "rowSelectionType": "checkbox", // radio, ''
  11. "enableScroll": false,
  12. },
  13. "columns": [
  14. {
  15. "dataIndex": "name",
  16. "valueType": "text",
  17. "fieldType": "string"
  18. }
  19. ],
  20. "pagination": {
  21. "enabled": false,
  22. },
  23. "toolBar": {}
  24. }
  25. <ProTable
  26. headerTitle=''
  27. tooltip=''
  28. search={} // false
  29. // 不显示右侧操作按钮
  30. options={false}
  31. toolBarRender={false}
  32. />

https://github.com/arvinxx
https://arvinxx.github.io/microwave/component.html

ProTable问题

options配置错误

Argument appears to not be a ReactComponent. Keys: forceAlign,forcePopupAlign
原因:options配置错误
some.jpg
正确的设置

  1. options={{
  2. setting: false,
  3. }}
  4. // 报错的配置
  5. options={{
  6. setting: {
  7. listsHeight: 400,
  8. },
  9. }}

https://github.com/ant-design/ant-design/issues/41206