Antd的table筛选,表头columns的filters过滤清空

本文介绍了在使用Ant Design的Table组件时遇到的筛选功能问题,当点击清除按钮,Table组件的列过滤条件(filters)未能正确清空,导致数据展示错误。解决方案在于利用filteredValue属性,初始化state为filteredInfo,设置columns的filteredValue属性,并在Table的onChange事件中更新filteredInfo。查询按钮操作时,通过setFilteredInfo(null)来清除所有筛选条件。
部署运行你感兴趣的模型镜像

Form +Table 实现了自定义筛选菜单的功能。具体可以参考 https://ant.design/components/table-cn/#components-table-demo-custom-filter-panel

但是此功能会有bug:

选择相应的搜索条件后,点击“搜索”按钮,Table 会渲染相应的数据,且Table 表头也有自带的过滤功能(实际上是column的filters属性起的作用);然后再点击“清除”按钮,所有的搜索条件和表头里filters过滤的条件都要被清除。但是 Table 组件表头column里的过滤条件未清空。导致重新发起请求时,table列表展示的仍然是上次带了filters的筛选条件,并没有清空。

解决方案:filteredValue。具体API参考:https://2x.ant.design/components/table-cn/

具体源码:

// 初始化state:filteredInfo

const [filteredInfo, setFilteredInfo] = useState(null);

// columns: 赋属性filteredValue

const columns = [{
  title: 'Cluster',
  dataIndex: 'clusterName',
  ...getColumnSearchProps('clusterName'),
},
{
  title: 'App',
  dataIndex: 'appId',
  ...getColumnSearchProps('appId'),
},
{
  title: 'Namespace',
  dataIndex: 'nameSpaceName',
  ...getColumnSearchProps('nameSpaceName'),
},
{
  title: 'Key',
  dataIndex: 'key',
  ...getColumnSearchProps('key'),
},{
  title: 'Value',
  dataIndex: 'value',
  width: '500px',
  ...getColumnSearchProps('value'),
}];

const getColumnSearchProps = (dataIndex: any) => ({
   filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters, filters }) => {
       return (
          <div style={{ padding: 8 }}>
            <Input
              ref={searchInputRef}
              placeholder={`Search ${dataIndex}`}
              value={selectedKeys && selectedKeys[0]}
              onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}
              onPressEnter={() => handleSearch(selectedKeys, confirm, dataIndex)}
              style={{ width: 188, marginBottom: 8, display: 'block' }}
            />
            <div style={{display: 'flex', flexDirection: 'row', justifyContent: 'center'}}>
              <Button
                type="primary"
                onClick={() => handleSearch(selectedKeys, confirm, dataIndex)}
                icon="search"
                size="small"
                style={{ width: 70, marginRight: 15 }}
              >
                确认
              </Button>
              <Button onClick={() => handleReset(clearFilters)} size="small" style={{ width: 70 }}>
                清空
              </Button>
            </div>
          </div>
        )},
    filterIcon: filtered => <Icon type="search" style={{ color: filtered ? '#1890ff' : undefined }}  />,
    onFilter: (value, record) => record[dataIndex] ?record[dataIndex].toString().toLowerCase().includes(value.toLowerCase())
            : '',
        onFilterDropdownVisibleChange: visible => {
          if (visible) {
            setTimeout(() => ((searchInputRef as any).current as any).select(), 100);
          }
        },
        filteredValue: filteredInfo && filteredInfo[dataIndex],
        render: text =>
          searchedColumn === dataIndex ? (
            <Highlighter
              highlightStyle={{ backgroundColor: '#ffc069', padding: 0 }}
              searchWords={[searchText]}
              autoEscape
              textToHighlight={text ? text.toString() : ''}
            />
          ) : (
            text
          ),
      });

// Table: 添加onChange事件,并赋值给filteredInfo

<Table
  onChange={tableChange}
  columns={columns}
  dataSource={dataSource}
  pagination={false}
  rowKey={(recode, index) => index.toFixed()}
  bordered
/>

const tableChange = ({ current: pageNum, pageSize }, filters) => {
  console.log('filters', filters);
  setFilteredInfo(filters);
}

// 查询按钮:setFilteredInfo(null)

const handleSubmit = (e: any) => {
  e.preventDefault();
  props.form.validateFields(async (err, values) => {
     if (err) {
       return err
     }
     const { key, value, haveLike } = values;
     if (key || value) {
       getApolloListFunc(key, value, haveLike);
       setFilteredInfo(null);
     } else {
        message.warning('key和value中至少得填写一项查询')
     }
   })
}

 

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>我们讨论的是在Ant Design(antd)的Table组件中,表头有多个筛选条件的情况。 通常,我们可以通过配置columns中的filterDropdown属性来实现自定义的筛选菜单,同时可能结合filteredValue来控制当前筛选状态。 基本步骤: 1. 在columns中,为需要筛选的列配置filterDropdown,这是一个返回React节点的函数,可以在这里放置多个筛选控件(如Input、Select、DatePicker等)。 2. 使用filteredValue来设置当前列的筛选值(一个数组或单一值,取决于你的筛选逻辑),当有筛选时,表格会根据这个值来过滤数据。 3. 在自定义的筛选菜单中,你需要自己处理筛选逻辑的触发(比如点击“确定”按钮时),然后通过调用confirm函数来关闭下拉菜单,并更新filteredValue。 4. 你可能需要维护一个状态来存储每个筛选器的值,然后在数据源(dataSource)上应用这些筛选条件。 注意:antd Table本身不提供内置的多条件筛选(比如多个输入框组合筛选),所以需要自己实现筛选逻辑。 以下是一个简单的示例,展示如何在一个列上使用两个输入框(例如,最小值和最大值)进行范围筛选。 我们将以“年龄”列为例,设置两个输入框分别输入最小年龄和最大年龄,然后根据这个范围筛选。 代码示例(使用React Hooks):</think>在 Ant Design (antd) 的 Table 组件中,实现表头多个筛选条件时,通常需要结合 `filterDropdown` 自定义筛选菜单和状态管理。以下是关键实现步骤: ### 核心实现方案 1. **状态管理** 使用 React 状态(如 `useState`)存储每个列的筛选值: ```jsx const [filters, setFilters] = useState({ name: null, age: [null, null], // 年龄范围 [min, max] status: null, }); ``` 2. **自定义筛选菜单** 在 `columns` 配置中使用 `filterDropdown` 渲染复杂筛选器: ```jsx const columns = [ { title: '年龄', dataIndex: 'age', filterDropdown: ({ confirm }) => ( <div style={{ padding: 8 }}> <InputNumber placeholder="最小值" onChange={min => setFilters({...filters, age: [min, filters.age?.[1]]})} /> <InputNumber placeholder="最大值" onChange={max => setFilters({...filters, age: [filters.age?.[0], max]})} /> <Button onClick={() => confirm()}>确认</Button> </div> ), filteredValue: filters.age || [], }, // 其他列配置... ]; ``` 3. **数据筛选逻辑** 在 `onChange` 事件中处理多条件过滤: ```jsx <Table dataSource={rawData.filter(item => ( (!filters.name || item.name.includes(filters.name)) && (!filters.age[0] || item.age >= filters.age[0]) && (!filters.age[1] || item.age <= filters.age[1]) && (!filters.status || item.status === filters.status) ))} columns={columns} onChange={(pagination, _, sorter) => { /* 分页/排序处理 */ }} /> ``` 4. **重置筛选** 添加重置按钮清除筛选状态: ```jsx <Button onClick={() => setFilters({ name: null, age: [null, null], status: null })}> 重置筛选 </Button> ``` ### 注意事项 - **性能优化**:大数据量时使用防抖处理输入 - **UI一致性**:通过 `filterIcon` 自定义图标高亮筛选状态 - **空值处理**:显式处理 `null`/`undefined` 避免渲染错误 - **TypeScript**:建议定义完整的类型声明 完整示例见 [Ant Design Table 筛选文档](https://ant.design/components/table#components-table-demo-custom-filter-panel)。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值