Antd的table组件自定义筛选菜单的使用

table组件可以对每列设置筛选,也可以自定义筛选项,这里记录一下自己在一次开发中对自定义筛选项的使用

table的自定义筛选,也就是大概如下的效果:

// 自定义筛选无非就是自己放置一个input,可供用户输入
// 再拿取到用户输入的值,进行后续的查询、过滤等操作
// filterDropdown方法,提供setSelectedKeys、selectedKeys来实现input输入框在table组件中的受控
// filterDropdown的更多属性可见这个链接,antd的官网也有该链接:https://github.com/ant-design/ant-design/blob/ecc54dda839619e921c0ace530408871f0281c2a/components/table/interface.tsx#L79
// 如果你想在table外部也获取到input输入的值,可以使用 useRef 来实现
// const searchInput = useRef<any>(null);
{
    title: 'Name',
    dataIndex: 'name',
    key: 'name',
    //filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters,close  }) => {
    filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => {
        return (
            <div style={{ padding: 8 }}>
                // 表单的受控是通过setSelectedKeys函数与selectedKeys来实现的,会把值透传到table的onChange事件中
                <Input
                    //ref={searchInput}
                    // placeholder={`Search ${dataIndex}`}
                    value={selectedKeys[0]} //input输入框的取值
                    // 当input输入框变化时,调用setSelectedKeys来设置值,实现受控
                    onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}
                    // onPressEnter={() => handleSearch(selectedKeys as string[], confirm, dataIndex)}
                    style={{ marginBottom: 8, display: 'block' }}
                />
                <Space>
                    <Button
                        type="primary"
                        // onClick={() => handleSearch(selectedKeys as string[], confirm, dataIndex)}
                        // 当调用 confirm 设置closeDropdown为 true时
                        // 会触发table的onChange事件,会在事件中拿到上面input中的值
                        // 可以在onChange 事件中,走网络请求来实现远程的搜索
                        onClick={() => confirm({ closeDropdown: true })}
                        icon={<SearchOutlined />}
                        size="small"
                        style={{ width: 90 }}
                    >
                        远程搜索
                    </Button>
                    <Button
                        onClick={() => clearFilters?.()}
                        size="small"
                        style={{ width: 90 }}
                    >
                        清空
                    </Button>
                    <Button
                        type="link"
                        size="small"
                        onClick={() => {
                            // confirm({ closeDropdown: false });
                            // setSearchText((selectedKeys as string[])[0]);
                            // setSearchedColumn(dataIndex);
                            // 每一关闭筛选项会出发table的onChang事件,会在该事件中拿到上面input输入的值
                            // 本地筛选,配合下面的 onFilter事件来完成
                            // 在onFilter 事件回调中 根据用户输入的筛选条件,过滤掉之后,返回新的值给table
                            confirm({ closeDropdown: true }) 
                        }}
                    >
                        本地筛选
                    </Button>
                    <Button
                        type="link"
                        size="small"
                        onClick={() => {
                             // 注意这里,官网文档会解构出一个close方法用户关闭筛选项
                             // 现在已经已经没有close 方法了 使用如下方法关闭
                            // close(); 
                            confirm({ closeDropdown: true })
                        }}
                    >
                        关闭
                    </Button>
                </Space>
            </div>
        )
    },
    
    // 本地模式下,确定筛选的运行函数 可以在这里进行本地数据的筛选
    onFilter: (value, record) =>
      record[dataIndex]
        .toString()
        .toLowerCase()
        .includes((value as string).toLowerCase()),

    // 自定义 filter 图标
    filterIcon: (filtered: boolean) => (
        <SearchOutlined style={{ color: filtered ? '#1890ff' : undefined }} />
    ),

},

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值