解决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 相关文章推荐
一个无限级XML绑定跨框架菜单(For IE)
Jan 27 Javascript
JavaScript 大数据相加的问题
Aug 03 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
Dec 08 Javascript
JavaScript 模块的循环加载实现方法
Dec 13 Javascript
JavaScript_object基础入门(必看篇)
Jun 13 Javascript
jQuery通用的全局遍历方法$.each()用法实例
Jul 04 Javascript
JS中script标签defer和async属性的区别详解
Aug 12 Javascript
js仿新浪微博消息发布功能
Feb 17 Javascript
js弹性势能动画之抛物线运动实例详解
Jul 27 Javascript
前端面试知识点目录一览
Apr 15 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
Aug 02 jQuery
JS实现页面跳转与刷新的方法汇总
Aug 30 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来写记数器(详细介绍)
2006/10/09 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
PHP之预定义接口详解
2015/07/29 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
2016/03/21 PHP
php使用pdo连接sqlite3的配置示例
2016/05/27 PHP
php7 安装yar 生成docker镜像
2017/05/09 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
javascript 二维数组的实现与应用
2010/03/16 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
jQuery大于号(&gt;)选择器的作用解释
2015/01/13 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
80%应聘者都不及格的JS面试题
2017/03/21 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
2017/09/26 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
js实现点击生成随机div
2020/01/16 Javascript
Vue props中Object和Array设置默认值操作
2020/07/30 Javascript
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
Python中文字符串截取问题
2015/06/15 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
娇韵诗Clarins意大利官方网站:法国天然护肤品牌
2020/03/11 全球购物
财务分析个人的自荐书范文
2013/11/24 职场文书
高中生期末评语大全
2014/01/28 职场文书
《夕阳真美》教学反思
2014/04/27 职场文书
幼儿园中班个人总结
2015/02/28 职场文书
单位推荐信范文
2015/03/27 职场文书
民事答辩状格式范文
2015/05/21 职场文书
在pyCharm中下载第三方库的方法
2021/04/18 Python