解决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 相关文章推荐
jQuery表单获取和失去焦点输入框提示效果的实例代码
Aug 01 Javascript
JS实现遮罩层效果的简单实例
Nov 12 Javascript
javascript制作的cookie封装及使用指南
Jan 02 Javascript
jQuery插件制作之参数用法实例分析
Jun 01 Javascript
浅谈JS中的bind方法与函数柯里化
Aug 10 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
Oct 19 Javascript
Angularjs中的页面访问权限怎么设置
Nov 11 Javascript
Vue动态组件实例解析
Aug 20 Javascript
JavaScript中的一些隐式转换和总结(推荐)
Dec 22 Javascript
小程序实现左右来回滚动字幕效果
Dec 28 Javascript
node事件循环和process模块实例分析
Feb 14 Javascript
原理深度解析Vue的响应式更新比React快
Apr 04 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
php5.2时间相差8小时
2007/01/15 PHP
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
2011/04/07 PHP
显示程序执行时间php函数代码
2013/08/29 PHP
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
javascript中简单的进制转换代码实例
2013/10/26 Javascript
js实现简单登录功能的实例代码
2013/11/09 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
js检测用户输入密码强度
2015/10/22 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
如何制作幻灯片(代码分享)
2017/01/06 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
2018/09/17 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
微信小程序开发注意指南和优化实践(小结)
2019/06/21 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
python可以用哪些数据库
2020/06/22 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
ColourPop美国官网:卡拉泡泡,洛杉矶彩妆品牌
2019/04/28 全球购物
医德医风个人总结
2015/02/28 职场文书
2015年人事科工作总结
2015/04/28 职场文书
2015年度内部审计工作总结
2015/05/20 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers