填坑小能手——el-table-column中show-overflow-tooltip属性探索

前言

这两天碰到了一个bug,与el-table-column中show-overflow-tooltip属性有关,本节就来看一下具体的解决过程。

show-overflow-tooltip

show-overflow-tooltip是el-table-column的一个属性,该属性的属性值是个布尔值,默认为false,如果设置为true时,单元格内容过长时,就会变成el-tooltip的效果。

项目中运用了此属性,碰到了一个bug:当我们鼠标移动上去展示内容时,如果列表数据发生改变,此时浮动框的内容不会跟着变化,只有重新移开移入才会进行变化,为了解决这个问题,我们先来看下源码中show-overflow-tooltip的实现。

源码

项目中用的是element ui,打开gitlab源码,在table-column.js找到showOverflowTooltip属性。

继续往下查找,会看到相关逻辑处理:当列表有这个属性,就会增加el-tooltip类名,并且修改列宽。我们先来看下el-tooltip,找到tale.scss文件在.cell类名下就能看到el-tooltip:

cell与el-tooltip实现的效果就是,单元格超出部分就会用省略号代替,这跟官方文档描述的效果刚好对应上。悬浮框内容展示出来的行为是鼠标移入,我们就找一下单元格是否有移入事件。在table-body.js文件中刚好有handleCellMouseEnter事件:

事件中会根据是否具有el-tooltip类名判断,满足条件就会展示tooltip。往下看我们就会发现tooltip的实现就是通过el-tooltip组件实现的。

函数中tooltip是$refs获取的,我们找一下ref名为tooltip的组件,就能看到el-tooltip:

到此我们就能总结出show-overflow-tooltip属性的实现过程:

  1. 根据属性值去添加el-tooltip类名,并且设置宽度,让溢出单元格的内容变成省略号。
  2. 单元格的mouseEnter事件会判断单元格是否有el-tooltip类名,如果有就会开启el-tooltip中的popper,让内容显示出来。
    根据实现过程我们就能得出bug产生的原因,当数据变化时并没有触发handleCellMouseEnter事件。

解决

为了让弹出框内容实时进行更新,有以下几种思路:

  • 修改key值。vue底层用了diff算法进行视图更新,里面会用到key属性进行组件的对比,key值一样整体就不会重新渲染。在el-table-column绑定一个可变key值,当单元格数据变化时,更新key值,结果不生效。对diff算法的理解有待提高。
  • 替换poper内容。既然它不能自动更新,那我们就手动更新,获取悬浮框dom元素,在数据发生改变时将里面的内容进行替换。这个方法很麻烦局限性也大,只能当最后的手段了。
  • el-tooltip组件。既然show-overflow-tooltip最终效果跟el-tooltip效果一致,那么我们就直接用default插槽将需要用到show-overflow-tooltip属性的列,用el-tooltip写一下,el-tooltip悬浮框内容就是content参数,content变化时,视图会跟着一起更新了。采用此方法成功解决问题。

上面三个是解析源码前的想法,解析源码后我们知道了bug产生原因,就能'对症下药',在列表数据修改时,将handleCellMouseEnter事件执行一次就行。

总结

以上就是对show-overflow-tooltip属性的探索,当我们阅读源码知道bug产生原因后,解决bug就会更加轻松。

相关推荐
程序员爱技术1 小时前
Vue 2 + JavaScript + vue-count-to 集成案例
前端·javascript·vue.js
并不会2 小时前
常见 CSS 选择器用法
前端·css·学习·html·前端开发·css选择器
衣乌安、2 小时前
【CSS】居中样式
前端·css·css3
兔老大的胡萝卜2 小时前
ppk谈JavaScript,悟透JavaScript,精通CSS高级Web,JavaScript DOM编程艺术,高性能JavaScript pdf
前端·javascript
低代码布道师2 小时前
CSS的三个重点
前端·css
耶啵奶膘3 小时前
uniapp-是否删除
linux·前端·uni-app
王哈哈^_^5 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
cs_dn_Jie5 小时前
钉钉 H5 微应用 手机端调试
前端·javascript·vue.js·vue·钉钉
开心工作室_kaic6 小时前
ssm068海鲜自助餐厅系统+vue(论文+源码)_kaic
前端·javascript·vue.js
有梦想的刺儿6 小时前
webWorker基本用法
前端·javascript·vue.js