当程序员多好玩:表格自带的tooltip总跑?看我怎么破!
Demo:
https://sunzsh.github.io/vue-demos/#/table-tooltip
源码:
https://github.com/sunzsh/vue-el-demo/blob/master/src/components/el-table-patch_tooltip.js
做程序员多好玩啊
大家看这个bug
其实啊这个问题重点不在于技术
而是需求
什么意思呢
首先他给这个表格超长的列哈
加了一个悬浮提示
然后他在想能不能支持用户
去复制上面这个完整的内容
但是呢大家看我鼠标一上来呢
刚才那个就没了
现在变成上面这一行的了
所以我说
其实这个问题的重点在于需求
为什么呢
因为当我们(鼠标)在下面的时候鼠标再上来
系统没办法区分鼠标上来的意图
就说系统不知道你是想
复制这个黑框里的内容呢
还是想看上一行的完整的内容
所以呢要解决这个问题
我们要先设计一个交互方式
那我的想法是
我们能不能在悬浮出来弹框之后啊
我们按住Alt
然后呢它上面就可以复制了
像这样
那现在是我已经做好的版本
其实很简单啊先给大家看一下效果
就是我们在main.js里边把这个补丁打进去
然后呢我们在使用的地方
就正常用el-table就可以了
跟正常的使用没什么区别
我先把这个注视掉
我们再来看没有这补丁的效果哈
注意看现在是这一行
然后按住Alt尝试去复制
注意大家看它不好使
然后呢我们把这个再加上
按住Alt上来这样就可以了
然后Alt松手它就可以了
这个补丁文件
等一下我要把它传到GitHub上
接下来
我简单给大家说一下实现思路哈
其实特别简单
就是两个事件,在这里
一个是keydown
一个是keyup
也就是说当我们鼠标(口误:键盘)按下的时候
我们先做一些判断
比如说看它是不是按Alt键啊
重点的是这一行
就这一行
就是我们找到这个tbody里边的tooltip
把它删掉
删掉之前呢
把它备份到另一个变量里边
还是REFS里边
放到这里
这是key down
然后呢当我们
松开的时候
再把刚才备份的这个
还原到这个属性里边
再把备份的删掉
这两行那下面这两个呢
我们一会再给大家解释啊
先把这个注掉
把这两个注掉给大家看没有这两个
是什么效果
我们来看一下
打开按住Alt上来它是可以选中的
但是没有那两行代码
会有什么问题呢
大家看啊
我从这个tooltip和这个黑色的边框
移出鼠标的时候
大家注意
它就隐藏了
因为我们选中的时候
很有可能不小心就拖拽出去了
大家看,他就隐藏了
所以不好用
这两行其实就是控制这个隐藏的
我们呀找到这个tooltip里边的
这个方法handle close popper
把这个方法也给它设置成一个空方法
设空方法之前呢
我们也把它备份到一个变量里
然后同样的keyup再把它还原回来
就是这个道理
我先把这个还原回来
好这个我们再来试一下
大家看 鼠标移出它也没有问题了
好那为什么这两个操作
可以实现这个效果呢
就是一个是删到这个tooltip
一个是把这个方法
设置成一个空方法
我们先来看这个tooltip啊
我们去找到el-table源码
然后呢我们找到里边的tbody
大家看!tbody里边
其实啊它是共用了一个tootip
就说你不管是哪一行哪一列
它只有这一个tooltip
然后呢它始终在更改它这个位置
我们来一个mouse enter
大家看,在这里
它始终在用这一个tootip去重新
计算它这个需要弹开的位置
所以呢我们就从这个方法入手
这个方法就是这个
鼠标移入某一个单元格的方法哈
从这个方法入手
大家看它在这个地方有一个判断
它会弹开这弹出层
然后呢我们往后看
它这有一个并且this.$refs.tooltip
也就是说它
如果有这个REFS引用它就会弹开
所以呢我们在这儿
当鼠标按下的时候我们把它删掉
所以呢
他这个if语句就是一直进不来
当我们鼠标移入其他单元格的时候呢
他也不会弹出新的层了
同时呢
也包括鼠标移出这个当前单元格
它也是有这个判断
大家看有个tooltip
如果有这个tooltip
它就会把这个close掉
所以咱们按住Alt的时候
这个tooltip就为空了
不管是在这移出当前单元格
还是移入其他单元格
这个tooltip都会一直不变
那关于另外一个鼠标移出那个
tip框的时候
那个框会自动隐藏掉
这个解决思路是一样的(区别是这次替换掉的是个方法)
只是呢我们不能把这个方法删掉
因为他有地方在调用所以我们只能把
它设置成一个空方法之后再放回来
思路呢就是这样
我就不给大家详细看代码了
最后更新于
这有帮助吗?