解决Antd Table表头加Icon和气泡提示的坑


Posted in Javascript onNovember 17, 2020

对于Antd Table组件的columns数组来说,它需要接受2个属性(filterDropdown,filterIcon)才能在表头某个属性旁展示图标Icon:

columns: [{
 
 title: '表达式', dataIndex: 'formulaTenderAmount', key: 'formulaTenderAmount', width: 150, placeholder: '请输入表达式', 
 filterDropdown: (<div></div>), 
 filterIcon: <Tooltip placement="top" title="气泡悬浮提示文本" > 
 <Icon type='question-circle-o' style={{ marginLeft: 1 }} />
 
 </Tooltip>,
 
 },{
 
 title: '操作',
 dataIndex: 'operation', 
 key: 'operation', 
 width: 305, 
 fixed: 'right', 
 },
],

然后,结果是怎样呢?

结果是气泡提示框的文本并不是我们期望的 “气泡悬浮提示文本” ,而是 “筛选” 两个字

解决Antd Table表头加Icon和气泡提示的坑

为什么?

看这里~react ant design 中如何在表头中加个Icon和排序,悬浮icon又触发Tooltip

需求:

本篇文章适用于表头同时添加悬浮和排序,另,只需支持文字悬浮对title封一层方法即可eg:

const TooltipTitle = (text, title) => { // text 展示的thead title 展示的提醒文字
 return (
 <Fragment>
 <span style={{ marginRight: 8 }}>{text}</span>
 <Tooltip placement="top" title={title}>
 <Icon type="question-circle" theme="outlined" />
 </Tooltip>
 </Fragment>
 );
};

ant design中的table中的thead支持信息提示和远程加载排序。

解决Antd Table表头加Icon和气泡提示的坑

困难点

ant design 没有提供两者同时存在的api;直接添加sorter,同时对我们的title封装方法,出现点击排序,只会触发单一的一个排序,这不是我们最终达成的结果。那么在不对title做处理的情况下,实现信息提示和排序的方法

解决

const columns = [{
 title: '姓名',
 dataIndex: 'name',
 key: 'name',
 sorter: true, // 实现排序Icon出现,开始交互排序
 filterDropdown: true, // 自定义的列筛选功能,我们占位为信息提示Icon的位置
 filterIcon: () => {
 return (
 <Tooltip placement="top" onVisibleChange={() => onVisibleChange(1)}>
 // 在这不写title的原因是ant design 内部有很多title,内部结构并没有对特殊的情况做处理,只接收一个title,
 // 并覆盖不了默认是筛选。
 <Icon type="question-circle" theme="outlined" />
 </Tooltip>
 );
 },
}, {
 title: '年龄',
 dataIndex: 'age',
 key: 'age',
}, {
 title: '住址',
 dataIndex: 'address',
 key: 'address',
}];

onVisibleChange = (key) => { //Tooltip 显示隐藏的回调,类似onmouseenter 进入离开事件,用来显示我们不同的信息提醒
 let str = '';
 switch (key) {
 case 1:
 str = '你的姓名';
 default:
 break;
 }
 this.setState({
 filterTitleKey: str,
 });
}

handleTableChange = (pagination, filters, sorter) => {
 console.log(pagination, filters, sorter);
 }

<Table
 dataSource={dataSource}
 columns={columns}
 onChange={() => this.handleTableChange}
 locale={{
 filterTitle: filterTitleKey || '默认', // 设一个默认是防止控制台的报错,移除以后造成filterTitle为空,失败;
 }}
 />

样式需要自己去调整

简易解释

ant design table 中 filterIcon api 相关的源码解析 ,一些我们未能解决的问题,我们可以通过研究源代码去分析或可供我们

使用的api方法。

renderFilterIcon = () => {
 const { column, locale, prefixCls, selectedKeys } = this.props;
 const filtered = selectedKeys && selectedKeys.length > 0;
 let filterIcon = column.filterIcon as any;
 if (typeof filterIcon === 'function') {
 filterIcon = filterIcon(filtered);
 }

 const dropdownIconClass = classNames({
 [`${prefixCls}-selected`]: filtered,
 [`${prefixCls}-open`]: this.getDropdownVisible(),
 });

 return filterIcon ? ( // 重点在这,官网提供了filterIcon api,并未提供filterTitle,来解决我们现实遇到的问题
 React.cloneElement(filterIcon as any, {
 title: locale.filterTitle, // 因源码内部有个title,我们实现让它动态展示,层叠掉默认的title
 className: classNames(`${prefixCls}-icon`, dropdownIconClass, filterIcon.props.className),
 onClick: stopPropagation,
 })
 ) : (
 <Icon
 title={locale.filterTitle} // 同理上,供我们使用的api
 type="filter"
 theme="filled"
 className={dropdownIconClass}
 onClick={stopPropagation}
 />
 );
 };

有兴趣的同学可以看一看完整的代码,看看实现的具体过程,小编不才,只展示部分实现的过程,详细的原理小编未给出,敬请谅解...

好了~ 回归正题吧!

如此,我改成了以下的代码,并且新增了onVisibleChange方法,新增了state的属性filterTitleKey,并且在Table组件属性中增加了locale对象:

this.state = { 
 filterTitleKey: '', 
}
columns: [{
 
 title: '表达式', dataIndex: 'formulaTenderAmount', key: 'formulaTenderAmount', width: 150, placeholder: '请输入表达式', 
 filterDropdown: (<div></div>), 
 filterIcon: <Tooltip onVisibleChange={() => this.onVisibleChange(1)} placement="top" > 
 <Icon type='question-circle-o' style={{ marginLeft: 1 }} /> 
 </Tooltip>,
 
 },{
 
 title: '操作', 
 dataIndex: 'operation', 
 key: 'operation', 
 width: 305, 
 fixed: 'right', 
 }, 
],
onVisibleChange = (key) => { //Tooltip 显示隐藏的回调,类似onmouseenter 进入离开事件,用来显示我们不同的信息提醒
 
 let str = ''; 
 switch (key) { 
 case 1: 
 str = '函数计算,x表示发行规模'; 
 default: 
 break; 
 }
 
 this.setState({ 
 filterTitleKey: str, 
 }); 
 }

这边会有Table的一个属性locate,官网是这样解释的:

解决Antd Table表头加Icon和气泡提示的坑

<Table
 loading={loading} 
 className='editableTable' 
 size="small" 
 style={{ height: tableHeight - 40 }} 
 columns={columns}
 
 locale={{
 filterTitle: filterTitleKey || '默认', // 设一个默认是防止控制台的报错,移除以后造成filterTitle为空,失败;
 }}
 
 dataSource={dataSource} 
 pagination={pagination} 
 scroll={{ x: 2400, y: tableScrollHeight }} 
/>

这样就能正常的显示气泡文本了:

解决Antd Table表头加Icon和气泡提示的坑

解决Antd Table表头加Icon和气泡提示的坑

以上这篇解决Antd Table表头加Icon和气泡提示的坑就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS实现可改变列宽的table实例
Jul 02 Javascript
jquery批量设置属性readonly和disabled的方法
Jan 24 Javascript
JS中使用sort结合localeCompare实现中文排序实例
Jul 23 Javascript
Javascript中的getUTCDay()方法使用详解
Jun 10 Javascript
JavaScript:Date类型全面解析
May 19 Javascript
浅谈Javascript中的12种DOM节点类型
Aug 19 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
Nov 07 Javascript
Vue 父子组件、组件间通信
Mar 08 Javascript
Vue微信项目按需授权登录策略实践思路详解
May 07 Javascript
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
May 12 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
Aug 31 Javascript
从0到1构建vueSSR项目之路由的构建
Mar 07 Javascript
ant design的table组件实现全选功能以及自定义分页
Nov 17 #Javascript
ant design pro中可控的筛选和排序实例
Nov 17 #Javascript
antd table按表格里的日期去排序操作
Nov 17 #Javascript
vue 数据遍历筛选 过滤 排序的应用操作
Nov 17 #Javascript
解决vue-cli输入命令vue ui没效果的问题
Nov 17 #Javascript
详解Vue数据驱动原理
Nov 17 #Javascript
vue 解决IOS10低版本白屏的问题
Nov 17 #Javascript
You might like
php pack与unpack 摸板字符字符含义
2009/10/29 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
2020/03/20 PHP
php calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
thinkphp四种url访问方式详解
2014/11/28 PHP
typecho插件编写教程(二):写一个新插件
2015/05/28 PHP
PHP中session跨子域的三种实现方法
2016/07/25 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
javascript 继承实现方法
2009/08/26 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
MVC+jQuery.Ajax异步实现增删改查和分页
2020/12/22 Javascript
jQuery实现背景弹性滚动的导航效果
2016/06/01 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
js截取字符串功能的实现方法
2017/09/27 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
js实现单元格拖拽效果
2020/02/10 Javascript
python 从远程服务器下载日志文件的程序
2013/02/10 Python
Python求两个list的差集、交集与并集的方法
2014/11/01 Python
Python列表计数及插入实例
2014/12/17 Python
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
python3图片文件批量重命名处理
2019/10/31 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
全球性的在线婚纱礼服工厂:27dress.com
2019/03/21 全球购物
迪士尼英国官方商店:shopDisney UK
2019/09/21 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
工程现场管理求职自荐信
2013/10/02 职场文书
工程承诺书怎么写
2014/05/24 职场文书
六一儿童节活动总结
2014/08/27 职场文书
个人作风建设自查报告
2014/10/22 职场文书
python scrapy简单模拟登录的代码分析
2021/07/21 Python