Antd相关 Table表格自定义筛选以及统一清空筛选项

源于一直负责的组件库需求,对Antd表格组件进行了二次封装,简化了很多功能配置项(分页、排序、筛选、样式等),其中对多个列筛选进行统一清空功能遇到了不少坑,记录一下……
重点是合理使用filteredValue属性

其中,用到的对象类型判断方法,详见《JavaScript中Object对象类型判断》

const MyTable = ({

  ......

  // 1.定义全局状态,用来存放各列的 filteredValue 状态
  const [filteredValues, set_filteredValues] = useState();

  // 2.定义通用 columns 筛选属性配置方法
  const getColumnSearchProps = (dataIndex) => {
    const filterIcon = (filtered) => {
      // 筛选前后图标样式定义
    }
    const filterDropdown = ({
      setSelectedKeys,
      selectedKeys,
      confirm,
      clearFilters
    }) => {
      let input = (
        <Input
          placeholder="检索文本内容..."
          value={selectedKeys && selectedKeys[0]}
          onChange={(e) =>
            setSelectedKeys(e.target.value ? [e.target.value] : [])
          }
          onPressEnter={() => confirm()}
          style={{ width: 200 }}
          {...props}
        />
      )
      // 自定义筛选最方便的是可以随意定义 input,比如 TreeSelect、Cascader、RangePicker 等等
      // 注意合理使用 selectedKeys 和 setSelectedKeys,setSelectedKeys 设置的状态值必须为 array
      return (
        <Space style={{ padding: 8 }}>
          {input}
          <Button sc_oper="query" onClick={confirm} />
          <Button sc_oper="reset" onClick={clearFilters} />
        </Space>
      );
    }
    const onFilter= (filterValue, record) => {
        // 筛选逻辑会循环遍历 selectedKeys 执行每个筛选条件 filterValue 和每行数据 record,也可以暴露出去
    };
    // 如果 dataIndex 是数组,需要转成字符串
    let key = dataIndex;
    if (isArray(dataIndex)) key = dataIndex.join("."); 
    return {
      // 重点:通过 filteredValues 控制筛选条件
      filteredValue: filteredValues && filteredValues[key],
      filterDropdown,
      filterIcon,
      onFilter,
    }
  }

  // 3.通过表格 onChange 事件,将 filters 赋值给 filteredValues
  const onChange = (pagination, filters, sorter, extra) => {
    set_filteredValues(filters);
  }
  
  // 4.使用,注意依赖项数组
  const columns = useMemo(() => ([
    {
      title: 'Name',
      dataIndex: 'name',
      key: 'name',
      ...getColumnSearchProps('name'), // 使用
    },
    {
      title: 'Age',
      dataIndex: ['info', 'age'],
      key: 'age',
      ...getColumnSearchProps(['info', 'age']), // 使用,数组形式在 filteredValues 关键字会被存为 'info.age'
    }
  ]), [filteredValues])

  ......

  // 5.统一清空筛选项
  const clearFilters = () => {
    // 注意一定要赋值每个列筛选项为空数组
    // 如果直接给 filteredValues 设置 null 或者 undefined,并不会重置筛选项,此乃大坑
    for (let c in filteredValues) filteredValues[c] = [];
    set_filteredValues({ ...filteredValues });
  }
  
  ......
  
  return <Table columns={columns} onChange={onChange} dataSource={data} />;
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果 AntdTable 组件提供的筛选功能不能满足我们的需求,我们可以通过自定义筛选实现更加灵活的功能。具体步骤如下: 1. 在 `columns` 中设置需要筛选的列的 `filterDropdown` 和 `onFilterDropdownVisibleChange` 属性,如下所示: ```javascript const columns = [ { title: '姓名', dataIndex: 'name', key: 'name', filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => ( <div style={{ padding: 8 }}> <Input placeholder="请输入姓名" value={selectedKeys[0]} onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])} onPressEnter={() => confirm()} /> <Button type="primary" onClick={() => confirm()} style={{ margin: '0 8px' }}> 筛选 </Button> <Button onClick={() => clearFilters()}>重置</Button> </div> ), onFilterDropdownVisibleChange: visible => { if (visible) { setTimeout(() => this.searchInput.select()); } }, onFilter: (value, record) => record.name.indexOf(value) === 0, }, { title: '年龄', dataIndex: 'age', key: 'age', }, { title: '地址', dataIndex: 'address', key: 'address', }, ]; ``` 在上述代码中,我们通过 `filterDropdown` 属性自定义筛选面板的内容,包括一个输入框、一个筛选按钮和一个重置按钮。在输入框中输入筛选条件,然后点击筛选按钮即可进行筛选。`onFilterDropdownVisibleChange` 属性用于在筛选面板显示时自动聚焦输入框。 2. 在 `Table` 组件中设置 `columns` 和 `dataSource` 属性,如下所示: ```javascript class App extends React.Component { state = { dataSource: [], }; componentDidMount() { // 模拟数据请求 setTimeout(() => { this.setState({ dataSource: [ { 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', }, { key: '3', name: 'Joe Black', age: 32, address: 'Sidney No. 1 Lake Park', }, { key: '4', name: 'Jim Red', age: 32, address: 'London No. 2 Lake Park', }, ], }); }, 1000); } render() { const { dataSource } = this.state; return <Table columns={columns} dataSource={dataSource} />; } } ``` 在上述代码中,我们只设置了 `columns` 和 `dataSource` 属性,没有处理筛选操作,因为筛选操作已经在 `filterDropdown` 中实现了。 注意:自定义筛选的实现方式比较灵活,可以根据具体需求进行适当的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值