Ant Design表格组件排序与筛选:Table组件高级功能实现

Ant Design表格组件排序与筛选:Table组件高级功能实现

【免费下载链接】ant-design An enterprise-class UI design language and React UI library 【免费下载链接】ant-design 项目地址: https://gitcode.com/gh_mirrors/antde/ant-design

在企业级应用开发中,数据表格的排序与筛选是提升用户体验的核心功能。Ant Design的Table组件提供了强大的内置排序与筛选能力,无需从零开发即可满足复杂业务需求。本文将从实际应用场景出发,详细讲解如何利用Table组件实现高效的数据处理功能。

基础功能快速上手

Table组件的排序与筛选功能通过columns配置实现,核心属性包括sorter(排序)和filters(筛选)。以下是一个基础示例,展示如何同时启用姓名列的排序和地址列的筛选:

const columns = [
  {
    title: '姓名',
    dataIndex: 'name',
    sorter: (a, b) => a.name.localeCompare(b.name), // 字符串排序
  },
  {
    title: '地址',
    dataIndex: 'address',
    filters: [
      { text: '北京', value: '北京' },
      { text: '上海', value: '上海' },
    ],
    onFilter: (value, record) => record.address.includes(value),
  },
];

<Table columns={columns} dataSource={data} onChange={handleTableChange} />

官方基础用法示例可参考components/table/demo/head.tsx,该文件包含了完整的筛选和排序实现代码。

排序功能深度解析

内置排序类型

Table组件支持三种排序方式,通过sorter属性配置:

  1. 基础排序:直接返回排序函数
{
  title: '年龄',
  dataIndex: 'age',
  sorter: (a, b) => a.age - b.age, // 数字排序
}
  1. 多列排序:设置sorter: { multiple: 1 }指定排序优先级
{
  title: '入职日期',
  dataIndex: 'hireDate',
  sorter: {
    compare: (a, b) => new Date(a.hireDate) - new Date(b.hireDate),
    multiple: 2, // 排序优先级,数字越小优先级越高
  },
}
  1. 远程排序:设置sorter: true并通过onChange处理服务端排序
{
  title: '销售额',
  dataIndex: 'sales',
  sorter: true, // 仅标记支持排序,实际排序在服务端进行
}

排序相关API定义可参考components/table/interface.ts中的SorterResult接口。

排序状态控制

通过defaultSortOrder设置默认排序方向,可选值为'ascend'(升序)或'descend'(降序):

{
  title: '年龄',
  dataIndex: 'age',
  defaultSortOrder: 'descend', // 默认降序排列
  sorter: (a, b) => a.age - b.age,
}

如需完全控制排序状态,可使用受控模式:

const [sortOrder, setSortOrder] = useState<'ascend' | 'descend' | null>(null);

// 在columns中
{
  title: '姓名',
  dataIndex: 'name',
  sortOrder: sortOrder,
  onHeaderCell: (column) => ({
    onClick: () => setSortOrder(sortOrder === 'ascend' ? 'descend' : 'ascend'),
  }),
}

筛选功能全攻略

内置筛选类型

Table组件提供多种筛选交互形式,满足不同业务场景:

  1. 单选筛选:适用于互斥选项(如性别、状态)
{
  title: '状态',
  dataIndex: 'status',
  filters: [
    { text: '启用', value: 'active' },
    { text: '禁用', value: 'inactive' },
  ],
  filterMultiple: false, // 关闭多选
  onFilter: (value, record) => record.status === value,
}
  1. 多选筛选:默认模式,适用于可同时选择的选项
{
  title: '标签',
  dataIndex: 'tags',
  filters: [
    { text: '热门', value: 'hot' },
    { text: '新品', value: 'new' },
    { text: '促销', value: 'promo' },
  ],
  onFilter: (value, record) => record.tags.includes(value),
}
  1. 树形筛选:通过children属性创建层级筛选菜单
{
  title: '地区',
  dataIndex: 'region',
  filters: [
    {
      text: '华东',
      value: 'east',
      children: [
        { text: '上海', value: 'shanghai' },
        { text: '江苏', value: 'jiangsu' },
      ],
    },
    {
      text: '华北',
      value: 'north',
      children: [
        { text: '北京', value: 'beijing' },
        { text: '天津', value: 'tianjin' },
      ],
    },
  ],
  filterMode: 'tree', // 启用树形筛选模式
}

树形筛选示例可参考components/table/demo/filter-in-tree.tsx

自定义筛选面板

对于复杂筛选需求,可通过filterDropdown自定义筛选面板。以下是一个带搜索框的筛选示例:

{
  title: '产品名称',
  dataIndex: 'productName',
  filterDropdown: ({ setSelectedKeys, selectedKeys, confirm }) => (
    <div style={{ padding: 8 }}>
      <Input
        placeholder="搜索产品"
        value={selectedKeys[0]}
        onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}
        onPressEnter={() => confirm()}
      />
      <Button onClick={() => confirm()}>搜索</Button>
    </div>
  ),
  onFilter: (value, record) => 
    record.productName.toLowerCase().includes(value.toLowerCase()),
}

更多自定义筛选示例可参考components/table/demo/custom-filter-panel.tsx

高级应用场景

远程数据处理

在大数据场景下,排序和筛选通常在服务端进行。通过onChange事件获取当前排序和筛选状态,然后发送请求获取新数据:

const handleTableChange = (pagination, filters, sorter) => {
  // 构建请求参数
  const params = {
    page: pagination.current,
    pageSize: pagination.pageSize,
    // 处理排序参数
    sortField: sorter.field,
    sortOrder: sorter.order,
    // 处理筛选参数
    ...filters,
  };
  
  // 发送请求获取数据
  fetchData(params).then(newData => {
    setDataSource(newData);
    setPagination({ ...pagination, total: newData.total });
  });
};

<Table
  columns={columns}
  dataSource={dataSource}
  pagination={pagination}
  onChange={handleTableChange}
  loading={loading}
/>

远程加载数据完整示例见components/table/demo/ajax.tsx

状态持久化

通过localStorage保存用户的排序和筛选偏好,提升用户体验:

// 组件挂载时恢复状态
useEffect(() => {
  const savedState = localStorage.getItem('tableState');
  if (savedState) {
    const { filters, sorter } = JSON.parse(savedState);
    setFilters(filters);
    setSorter(sorter);
  }
}, []);

// 状态变化时保存
const handleTableChange = (pagination, filters, sorter) => {
  const tableState = { filters, sorter };
  localStorage.setItem('tableState', JSON.stringify(tableState));
  // ...其他处理逻辑
};

性能优化建议

  1. 减少渲染次数:使用shouldCellUpdate控制单元格更新时机
{
  title: '操作',
  key: 'action',
  render: (_, record) => <Button onClick={() => handleEdit(record.id)}>编辑</Button>,
  shouldCellUpdate: (record, prevRecord) => record.id !== prevRecord.id,
}
  1. 虚拟滚动:大数据表格启用虚拟滚动提升性能
<Table
  columns={columns}
  dataSource={largeDataSource}
  virtual // 启用虚拟滚动
  scroll={{ y: 600 }} // 固定高度
  rowKey="id"
/>

虚拟列表实现可参考components/table/demo/virtual-list.tsx

  1. 防抖处理:复杂筛选添加防抖,减少频繁查询
const [searchText, setSearchText] = useState('');
const debouncedSearch = useCallback(
  debounce(value => {
    // 执行搜索逻辑
  }, 500),
  [],
);

useEffect(() => {
  debouncedSearch(searchText);
}, [searchText, debouncedSearch]);

常见问题解决

Q: 如何清除所有筛选条件?

A: 通过设置filteredValue: []清除指定列筛选,或通过按钮重置所有状态:

<Button onClick={() => {
  // 重置所有筛选条件
  const newColumns = columns.map(col => ({
    ...col,
    filteredValue: null,
  }));
  setColumns(newColumns);
}}>
  清除筛选
</Button>

Q: 排序图标不显示怎么办?

A: 确保同时设置了sorter属性和sortDirections,参考components/table/index.zh-CN.md中的API文档。

Q: 如何实现自定义排序图标?

A: 通过sortIcon属性自定义排序指示器:

{
  title: '姓名',
  dataIndex: 'name',
  sorter: (a, b) => a.name.localeCompare(b.name),
  sortIcon: ({ sortOrder }) => {
    if (sortOrder === 'ascend') return <UpOutlined />;
    if (sortOrder === 'descend') return <DownOutlined />;
    return <SortOutlined />;
  },
}

总结与扩展阅读

通过本文介绍的排序与筛选功能,你可以构建出满足大多数业务需求的数据表格。Ant Design Table组件还提供了更多高级功能:

完整API文档请参考components/table/index.zh-CN.md,更多高级用法可查阅ProComponents提供的ProTable组件,它在基础Table之上扩展了更多企业级特性。

掌握这些技能后,你将能够高效处理各类数据展示需求,为用户提供流畅直观的数据操作体验。

【免费下载链接】ant-design An enterprise-class UI design language and React UI library 【免费下载链接】ant-design 项目地址: https://gitcode.com/gh_mirrors/antde/ant-design

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

抵扣说明:

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

余额充值