react中使用antdesign组件库的table组件实现自定义筛选菜单

需求如下:

这是一个表格的表头信息,实现这几列的筛选。

涉及到的筛选有:自定义选择项,动态生成选择项,自定义筛选菜单展示

1、依据antdesign官方给出的例子实现的,比如第一列,使用的是:

2、第2,3,6列使用的是同一种筛选方式,与第一列不同的是列配置中关于filters的值的渲染是动态生成的。

3、第4,5列使用的是同一种筛选方式,使用的是自定义的筛选菜单,参考官方示例,进行改写

进入正题,代码怎么实现???

第一列的实现就很简单了,只需要在列配置选项中写入相关配置即可,这种方式适用于filters的值是固定筛选的数组的情况。

{title: 'x能',dataIndex: 'neng',key: 'neng',align: 'center' as const,filters: [{text: '高',value: '1'},{text: '低',value: '0'}],// value指的是你选中的是filters里的哪一个筛选项onFilter: (value: string, record: any) => record.neng === Number(value)
}

第2,3,6列是需要动态生成filters的值,这个时候应该是点击筛选icon,弹框展示filter中的选项,问题就是点击icon的事件是不是没有找到?这个时候我想到了一个办法,那就是仿照自定义筛选菜单的写法,实现一个icon,然后在icon上绑定点击事件。

const getColumnFilterRender = (dataIndex: string) => ({// dataIndex指的是点击的哪一列filters: filterArr || [],filterIcon: (<FilterFilled onClick={() => handleFilterIcon(dataIndex)} />)
});const handleFilterIcon = (dataIndex: string) => {// 对表格数据的当前列进行去重const arr = new Set(initialTableData.map((item: any) => item[dataIndex]));// filters数组要求的格式[{text: string, value: string}]setFilterArr(Array.from(arr).map(item => ({text: item, value: item})));
};{title: '业务xx',dataIndex: 'business',key: 'business',...getColumnFilterRender('business'),onFilter: (value: string, record: any) => record.business === value
}

第4,5列是参考excle表格内的数据筛选,对于数字的筛选有大于某个值,小于某个值,以及大于某个值且小于某个值。实现这样一个自定义筛选功能。

const getColumnSearchProps = (dataIndex: string, filter: any) => ({filterDropdown: ({close}: {close: any;}) => (<div style={{padding: 8}} onKeyDown={(e) => e.stopPropagation()}><div style={{display: 'flex', marginBottom: '8px'}}><SelectshowSearchallowClearstyle={{width: '80px'}}value={filter.condition}onChange={(value) => handleFilterCondition(value, dataIndex)}><Option key={'large'} value={'large'}>大于</Option><Option key={'small'} value={'small'}>小于</Option><Option key={'range'} value={'range'}>期间</Option></Select>{filter.condition === 'range' ? (<div style={{marginLeft: '10px'}}>大于<Inputvalue={filter.largeNum}style={{width: '60px', margin: '0 10px'}}onChange={(e) => handleLargeNum(e.target.value, dataIndex)}/>小于<Inputvalue={filter.smallNum}style={{width: '60px', marginLeft: '10px'}}onChange={(e) => handleSmallNum(e.target.value, dataIndex)}/></div>) : (<Inputvalue={filter.smallNum}style={{width: '60px', marginLeft: '10px'}}onChange={(e) => handleSmallNum(e.target.value, dataIndex)}/>)}</div><Space><ButtononClick={() => handleReset(dataIndex)}size="small"style={{color: 'grey'}}>重置</Button><Buttontype="primary"onClick={() => handleFilter(close, dataIndex)}size="small">筛选</Button><Buttontype="link"size="small"onClick={() => {close();}}>关闭</Button></Space></div>),filterIcon: () => {return (<FilterFilled style={{color: filterStates?.[dataIndex] ? '#1890ff' : undefined}} />);}
});{title: 'CPU使用xxx',dataIndex: 'cpuxxx',key: 'cpuxxx',...getColumnSearchProps('cpuxxx', cpuFilter)
}// 分别保存这两列的筛选内的一些相关值
const [cpuFilter, setCpuFilter] = useState({condition: 'large', smallNum: '', largeNum: '', isReset: false});
const [memFilter, setMemFilter] = useState({condition: 'large', smallNum: '', largeNum: '', isReset: false});// 用来保存所有列的筛选状态
const [filterStates, setFilterStates] = useState<{[dataIndex: string]: boolean;}>({});/*** 根据筛选条件filterCondition获取筛选的结果*/
const getCondition = (value: number, filter: any) => {let result = false;switch (filter.condition) {case 'range':result = value > Number(filter.largeNum) && value < Number(filter.smallNum);break;case 'large':result = value > Number(filter.smallNum);break;case 'small':result = value < Number(filter.smallNum);break;default:result = false;break;}return result;
};
const filterTableData = (cpuFilter: any, memFilter: any) => {setLoading(true);const newArr = initialTableData.filter((item: any) => {return getCondition(item.cpuxxx, cpuFilter) && getCondition(item.memxxx, memFilter);});setTableData(newArr);setLoading(false);
};// 选择大于,小于,还是期间
const handleFilterCondition = (value: string, dataIndex: string) => {if (dataIndex === 'cpuxxx') {setCpuFilter({...cpuFilter, condition: value});}if (dataIndex === 'memxxx') {setMemFilter({...memFilter, condition: value});}
};const handleLargeNum = (value: string, dataIndex: string) => {if (dataIndex === 'cpuxxx') {setCpuFilter({...cpuFilter, largeNum: value});}if (dataIndex === 'memxxx') {setMemFilter({...memFilter, largeNum: value});}
};const handleSmallNum = (value: string, dataIndex: string) => {if (dataIndex === 'cpuxxx') {setCpuFilter({...cpuFilter, smallNum: value});}if (dataIndex === 'memxxx') {setMemFilter({...memFilter, smallNum: value});}
};// 点击重置
const handleReset = (dataIndex: string) => {if (dataIndex === 'cpuxxx') {setCpuFilter({condition: 'large', largeNum: '', smallNum: '', isReset: true});}if (dataIndex === 'memxxx') {setMemFilter({condition: 'large', largeNum: '', smallNum: '', isReset: true});}
};// 点击筛选
const handleFilter = (callback: any, dataIndex: string) => {callback();filterTableData(cpuFilter, memFilter);setFilterStates(prevFilterStates => ({...prevFilterStates,[dataIndex]: true}));if (dataIndex === 'cpuxxx') {setFilterStates(prevFilterStates => ({...prevFilterStates,[dataIndex]: !cpuFilter.isReset}));}if (dataIndex === 'memxxx') {setFilterStates(prevFilterStates => ({...prevFilterStates,[dataIndex]: !memFilter.isReset}));}
};

以上就是关于table组件的筛选功能的一些实现,欢迎参考,有问题或者可以优化的点希望大家可以帮忙指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云RDS MySQL与自建MySQL数据库进行主从同步(GTID方式)

1、创建数据库&#xff0c;dump阿里云RDS数据&#xff0c;导入到自建MySQL 阿里云RDS的配置几乎不用动&#xff0c;只需从RDS开一个只读的账号出来。 在ECS服务器上远程导出RDS的数据库&#xff0c;执行下面命令&#xff0c;记得将[]内容替换掉 mysqldump -h http://***.mys…

安装vcenter管理esxi

安装vcenter管理esxi虚拟化操作系统 文章目录 安装vcenter管理esxi虚拟化操作系统1.安装vcenter2.vcenter的应用 1.安装vcenter esxi虚拟机具体安装步骤请参考上一篇文章&#xff0c;vcenter软件包需自己到网上下 2.vcenter的应用

电机学(笔记一)

磁极对数p&#xff1a; 直流电机的磁极对数是指电机定子的磁极对数&#xff0c;也等于电机电刷的对数。它与电机的转速和扭矩有直接关系。一般来说&#xff0c;极对数越多&#xff0c;电机转速越低&#xff0c;扭矩越大&#xff0c;适用于低速、高扭矩的场合&#xff1b;相反&…

Java-JVM 虚拟机原理调优实战

一、基础 栈帧&#xff08;Stack Frame&#xff09;栈空间的 基本元素&#xff0c;用于 方法的调用和方法的执行的数据结构 堆内存用来存放由new创建的对象和数组。在堆中分配的内存&#xff0c;由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后&#xff0c…

MATLAB的使用(一)

一&#xff0c;MATLAB的编程特点 a,语法高度简化&#xff1b; b,脚本式解释型语言&#xff1b; c,针对矩阵的高性能运算&#xff1b; d,丰富的函数工具箱支持&#xff1b; e,通过matlab本体构建跨平台&#xff1b; 二&#xff0c;MATLAB的界面 工具栏:提供快捷操作编辑器…

2024年腾讯云服务器租用价格表_1个月一年3年5年和1小时费用表

腾讯云服务器租用优惠价格表&#xff1a;轻量应用服务器2核2G3M价格61元一年、2核2G4M价格99元一年&#xff0c;540元三年、2核4G5M带宽165元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器646元15个月&#xff0c;轻量4核16G12M服务器32元1个月、312元一年&#x…

RabbitMQ介绍及搭建

架构 RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff0c;使用erlang语言编写&#xff0c;依赖Erlang环境运行。 Broker&#xff1a;运行消息队列服务进程的节点&#xff0c;包含Exchange、Queue&#xff1b; Producer&#xff1a;消…

Java进阶 Maven基础

资料格式 配置文件 com.itheima Java代码 Statement stat con.createStatement(); 示例 com.itheima 命令 mvn test - Maven简介 传统项目管理状态分析 Maven 是什么 Maven的本质是一个项目管理工具&#xff0c;将项目开发过程抽象成一个项目对象模型&#xff08;POM&…

HTTP 工作流程请求响应 - 面试常问

文章目录 HTTP 工作流程请求和响应格式HTTP请求格式请求行&#xff1a;请求头部字段&#xff1a;空行&#xff1a;消息正文&#xff08;请求正文&#xff09;&#xff1a; HTTP响应格式状态行&#xff1a;响应头部字段&#xff1a;空行&#xff1a; HTTP方法HTTP状态码常用HTTP…

yocto编译测试

源码下载 git clone -b gatesgarth git://git.yoctoproject.org/poky lkmaolkmao-virtual-machine:~/yocto$ git clone -b gatesgarth git://git.yoctoproject.org/poky Cloning into poky... remote: Enumerating objects: 640690, done. remote: Counting objects: 100% (13…

整型数组按个位值排序 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给定一个非空数组(列表)&#xff0c;其元素数据类型为整型&#xff0c;请按照数组元素十进制最低位从小到大进行排序&#xff0c;十进制最低位相同的元素&#xf…

四.排序(冒泡/选择)

目录 11-排序介绍 常见排序算法: 12-冒泡排序介绍 代码要求: 思路: 13-冒泡排序 代码: 14-选择排序 简单写法: 好的写法: 11-排序介绍 排序&#xff1a;将一组“无序”的记录序列调整为“有序”的记录序列。 列表排序&#xff1a;将无序列表变为有序列表 输入&#…

CentOS 7 编译安装 Nginx

CentOS 7 编译安装 Nginx 背景下载 Nginx 源码包安装依赖包编译添加环境变量添加守护查考文献 背景 一开始使用 docker 搭建了一个 web 服务器&#xff0c;但是由于 docker 不太方便的部署 TLS 证书&#xff0c;故使用 Nginx 做反向代理&#xff0c;实现 https 连接。 下载 N…

C#进阶实践项目(俄罗斯方块)

CSharp进阶实践项目--俄罗斯方块 1.需求分析 2.复用贪吃蛇开始等场景切换的代码 &#xff08;自己写一遍&#xff0c;不难&#xff01;&#xff01;&#xff01;&#xff09; 入口&#xff1a; 更新接口&#xff1a; Game 类&#xff1a; BeginOrEndBaseScene 类&#xff1a;…

【Flink】Flink 中的时间和窗口之窗口API使用

1. 窗口的API概念 窗口的API使用分为按键分区和非按键分区&#xff0c;在定义窗口操作之前&#xff0c;首先就要确定好是基于按键分区Keyed的数据流KeyedStream来开窗还是基于没有按键分区的DataStream上开窗。 1.1 按键分区窗口&#xff08;Keyed Windows&#xff09; 按键…

Android视角看鸿蒙第六课(module.json5中的各字段含义之pages)designWidth的用法

Android视角看鸿蒙第六课(module.json5中的各字段含义之pages&#xff09; 导读 前面几篇文章&#xff0c;我们陆续分析了entry->src->main下的module.json5中的各个字段的含义及作用。目前剩余pages和abilities两个字段&#xff0c;本篇文章一起来了解pages。 过程有错…

用Stable Diffusion生成同角色不同pose的人脸

随着技术的不断发展&#xff0c;我们现在可以使用稳定扩散技术&#xff08;Stable Diffusion&#xff09;来生成同一角色但不同姿势的人脸图片。本文将介绍这一方法的具体步骤&#xff0c;以及如何通过合理的提示语和模型选择来生成出更加真实和多样化的人脸图像。 博客首发地…

【Python】进阶学习:一文解决如何从指定的源目录中,挑选出符合条件的文件,并将这些文件复制到目标目录中

【Python】进阶学习&#xff1a;一文解决如何从指定的源目录中&#xff0c;挑选出符合条件的文件&#xff0c;并将这些文件复制到目标目录中 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化…

音频剪辑软件评测,哪一款最适合你?

“音频剪辑小白求解&#xff01;我正在制作一部个人纪录片&#xff0c;拍摄了很多原始音频素材&#xff0c;但是需要进行剪辑和整理才能使用。我完全不懂音频剪辑&#xff0c;请问有没有简单易懂的教程或者方法&#xff0c;帮助我快速上手并完成剪辑工作呢&#xff1f;” 随着…

5_相机标定_3_calibrateCamera()例子

上次介绍了calibrateCamera()接口参数&#xff0c;这次实际调用。 程序中所用标准标定板。 一、图片预处理 使用的图片原像素是3072*2048&#xff0c;即600万像素&#xff0c;处理起来不快&#xff1b;改成了560*420&#xff0c;即20万像素。调用opencv接口如下&#xff1a; //…