「2023 年最新」使用 React、Ant Design Pro、ProComponents 实现各种搜索筛选表格 实战总结(一)

在这里插入图片描述

在这里插入图片描述

情况一:后端中 ID 字段不唯一时正常渲染表格

  • rowkey 结合其他字段指定,进而唯一,注意写法
<ProTable
    scroll={{ x: 1100 }}
    headerTitle="xxx"
    rowKey={(record) => `${record.xxx_level}#${record.xxx_id}`} // 注意写法
    columns={columns as any}
    actionRef={actionRef}
    request={requestTable}
    search={{ defaultCollapsed: false }}
    toolBarRender={() => [<Create />]}
    form={{
      syncToUrl: (values) => values,
      syncToInitialValues: true,
      ignoreRules: false,
    }}
  />

情景二:Protable Columns 搜索框检索和表格列渲染内容字段不一致

大致意思就是,你使用各种搜索框进行下方表格的检索,这时候根据后端给的接口规范,使用 GET 请求并携带的 query 参数中的字段发起检索,进而实现对表格的筛选。

但是你检索的字段和表格渲染字段名不一样,比如姓名这一列即为表格项,又是搜索框检索项,但是两种字段不一样,搜索是 query 中你要携带的字段名为 user_name, 表格中渲染的字段名为chinese_name

这时候解决方法就是一式两份,一份 hide in table,一份 hide in search。

具体代码如下:

「推荐项目中较规范的一种写法」

setting.tsx


...
const CHINESE_NAME_TEXT: ProColumns = {
  title: '姓名',
  dataIndex: 'chinese_name',
  hideInSearch: true,
  width: 100,
  fixed: 'left',
};

const USER_NAME_SEARCH: ProColumns = {
  title: '姓名',
  dataIndex: 'user_name',
  renderFormItem: () => <ChineseNameSelect />,
  hideInTable: true,
};
...


const USER_LIST_SETTINGS = [
  CHINESE_NAME_TEXT,
  USER_NAME_SEARCH,
  ];

export default USER_LIST_SETTINGS;

index.tsx



const columns: ProColumns[] = [
    ...USER_LIST_SETTINGS,
    {
      title: '操作',
      hideInSearch: true,
      width: 100,
      fixed: 'right',
      render: (_: any, record: RESPONSE.XXXOptionsType) => (
        <Actions data={record} actionRef={actionRef?.current} />
      ),
    },
  ];

情景三:自定义搜索框,表格列样式

封装好自己想要带样式的组件,然后选择对应的 render 进行设置
在这里插入图片描述

  • 代码示例

  {
    disable: true,
    title: '标签',
    dataIndex: 'labels',
    search: false,
    renderFormItem: (_, { defaultRender }) => {
      return defaultRender(_);
    },
    render: (_, record) => (
      <Space>
        {record.labels.map(({ name, color }) => (
          <Tag color={color} key={name}>
            {name}
          </Tag>
        ))}
      </Space>
    ),
  }
  • 总结:render 管表格样式 | renderFormItem 管搜索框样式 | renderText 一般用于文本变化(比如时间、格式化文本展示)

情景四:ProTable 的 ValueType

valueType 是 ProComponents 的灵魂,ProComponents 会根据 valueType 来映射成不同的表单项。
建议看文档:
ProTable 的 valueType

情景五:protable 请求数据安装后端接口规范格式化

比如在级联复选框中,会涉及到多个选项的选中,而且每个选项和它上一级的选项还有关系,比如你选中了:
X/XX/XXX
Y/YY
Z/ZZ/ZZZ/ZZZZ
有如下要求:
返回参数 =10001#20001,10001#20002#30001,10001#20002#30002
每一套筛选项之间:用井号分隔
筛选项内不同级别之间:用英文下划线分隔
代码实现:
index.tsx

 const makeRequest = (request: any) => {
    return async ({ ...query }: XXXRequestParams) => {
      const res = await request({
        ...query,
      });
      const { data, paging } = res || {};
      return {
        data: data.depts ?? [],
        total: paging?.total_size,
      };
    };
  };

  const requestTable = (rawData: XXXSearchRequestParams) => {
    const {address, dept, ...props} = rawData
    const params = {
      address: address?.join(','),
      dept: dept?.map((arr: any)=>arr.join('#')).join(','),
      ...props
    }
    console.log(params)
    return makeDepartmentTableRequest(fetchXXXGroup)(params);
  };

import { request } from 'umi';
import { API_PREFIX } from '@/services/settings';
/**
 * 查询XX列表
 * @param params
 * @returns
 */
export const fetchXXXGroup = async (params: any) =>
  request(`${API_PREFIX}/xxx`, { params });

情景六 表格每列固定、宽度定制、表头固定

todo

 <ProTable
 scroll={{ x: 'max-content' }}
>

注意: Protable 为什么 columns 中添加了一列在筛选项中能出现,但是表格中不出现
这种情况应该是你没有添加 width 的缘故,默认就为零了

import { Table } from 'antd';

const columns = [
  {
    title: 'Name',
    dataIndex: 'name',
    key: 'name',
    fixed: 'left',
    width: 150,
  },
  {
    title: 'Age',
    dataIndex: 'age',
    key: 'age',
    width: 150,
  },
  {
    title: 'Address',
    dataIndex: 'address',
    key: 'address',
    width: 200,
  },
  // more columns
];

const data = [
  {
    key: '1',
    name: 'John Brown',
    age: 32,
    address: 'New York No. 1 Lake Park',
  },
  {
    key: '2',
    name: 'Jim Green',
    age: 42,
    address: 'London No. 1 Lake Park',
  },
  // more data
];

<Table
  columns={columns}
  dataSource={data}
  pagination={false}
  scroll={{ y: 240 }}
/>;

在这个示例中,我们创建了一个 Table 组件,其中 columns 是表格的列信息,dataSource 是表格的数据源。我们使用 fixed 属性将第一列的表头固定在左侧,然后设置了每列的宽度。接着,我们使用 scroll 属性来设置表格的滚动条高度。当表格数据超过了这个高度时,表格会出现滚动条。

这个示例中的表格的表头会在向上滑动时吸顶,因为第一列的表头已经被固定在了左侧,其他列的表头会随着表格的滚动而滚动。你可以根据自己的需求调整表格的列宽和滚动条高度。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zoe_ya

如果你成功申请,可以打赏杯奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值