解决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 相关文章推荐
ajax无刷新动态调用股票信息(改良版)
Nov 01 Javascript
JavaScript中判断对象类型的几种方法总结
Nov 11 Javascript
Javascript限制网页只能在微信内置浏览器中访问
Nov 09 Javascript
jquery中ready()函数执行的时机和window的load事件比较
Jun 22 Javascript
js实现各种复制到剪贴板的方法(分享)
Oct 27 Javascript
JavaScript模板引擎Template.js使用详解
Dec 15 Javascript
微信小程序 页面之间传参实例详解
Jan 13 Javascript
详解Vue.js 2.0 如何使用axios
Apr 21 Javascript
jQuery取得元素标签名称小结(附代码)
Aug 16 jQuery
PHP自动加载autoload和命名空间的应用小结
Dec 01 Javascript
js实现控制文件拖拽并获取拖拽内容功能
Feb 17 Javascript
javascript导出csv文件(excel)的方法示例
Aug 25 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提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
TMDPHP 模板引擎使用教程
2012/03/13 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
php表单敏感字符过滤类
2014/12/08 PHP
use jscript List Installed Software
2007/06/11 Javascript
javascript 检测浏览器类型和版本的代码
2009/09/15 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
微信实现自动跳转到用其他浏览器打开指定APP下载
2019/02/15 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
[53:10]完美世界DOTA2联赛决赛日 FTD vs GXR 第二场 11.08
2020/11/11 DOTA
Python3实现zip分卷压缩过程解析
2019/10/09 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
简单了解python元组tuple相关原理
2019/12/02 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
基于python实现对文件进行切分行
2020/04/26 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
澳大利亚优质的家居用品和生活方式公司:Bed Bath N’ Table
2019/04/16 全球购物
结构和类有什么异同
2012/07/16 面试题
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
房地产财务部员工岗位职责
2014/03/12 职场文书
网络编辑岗位职责
2014/03/18 职场文书
幼儿园毕业典礼主持词
2014/03/21 职场文书
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
2015年营业员工作总结
2015/04/23 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
写给同事的离职感言
2015/08/04 职场文书