eltable行高变化后,丢失滚动条排查解决全过程
demo:
https://sunzsh.github.io/vue-demos/#/el-table-scroll
源码:
https://github.com/sunzsh/vue-el-demo/blob/master/src/views/el-table-scroll.vue
大家看这小伙伴的问题
我已经把他代码放到这个demo里了
什么意思呢
就是比如正常情况下
我们在这个固定高度的el-table里边
新增一行
新增一行的
超出表格的时候他就会出现滚动条
但是呢注意我刷新一下
如果我就增加两行
然后呢(这时候还没有中间滚动条对吧)
我不加了
我是在这多选几个选项
大家注意看第一行就被称高了对吧
但是呢
bug就出现了
它没有出现滚动条
导致我现在已经滚动不到第二行了(Mac没有这个问题)
那怎么处理这个问题呢
我们首先来判断一下
它这滚动条是怎么出来的
大家看啊
我们找到这个el-table
就这个el-table
现在呢大家注意是这个样式
但是呢如果我再新增一行儿
大家看这里边多出一个el-table-scrollable-y
我把这个属性(class名称)先复制一下
然后啊咱们再刷新一下
然后还是刚才那个操作加两行
然后多选几个选项把它撑高
这时候没有出现滚动条对吧
好我们手动给这个el-table
加一个这个样式
大家注意在这里
粘贴回车打开滚动条就有了
也就是说
重点就在于这个eltable-scrollable-y
为什么没有出现
对吧
我们先来看一下el-table源码哈
我们点进去
大家看,这里就有一个el-table-scrollable-y了
所以重点就是这个变量
那这个变量怎么来的呢
我们在这里全文搜是没有(为其)赋值的
只有取值哈
所以呢我们重点看layout
layout怎么来的
我们搜一下
大家这有一个layout new了一个table layout
所以呢我们向上查找
在这里我们进到这个table layout里面啊
table layout
然后呢我们在这里去搜看
刚才用到的这
scrollY 我们看在这里他什么时候赋的值
这个不算
scrollY
大家看 在这里
scrollY等于... 他就做了个计算
是否出现这个纵向滚动条
然后呢其实这个方法
我们再去搜看
这里哪里在调用这个方法
这有一个
这是声明
这回来了
所以也就这一个地方在调用scrollY
什么地方呢
这个update elsHeight
然后我们再回过头看一下
eltable源码里,哪里在调这个
大家看
这有一个do layout
那什么时候再调用do layout呢
我们再去搜
这里creat不算mounted的也不算
我们再搜
这有一个resize listener
好resize listener是在什么时候绑定的呢
大家看
它在这儿绑定的(bindEvens)
也就说它应该是在创建的时候
打开monted的时候绑定的
然后呢给谁绑定了一个resizeListener
就是
给这个当前的容器的最外层的元素
this.$el 就是...
这个div
也就是这个div尺寸发生变化的时候
它就会执行刚才那个do layout
但是呢我们再看这个代码啊
其实它这个eltable
设置了一个固定的高度
也说它最外层这个容器
它的高度是不变的了
所以它永远都不会触发resizelistener
即便咱们新增了好几行
那也是在它
的内部尺寸变化
这个div始终没有变
好那有同学可能会问
那为什么刚才新增好几行的时候
他还会出现滚动条
你不是说他外部的尺寸没有变化吗
是的!那是因为啊
他在新增一行的时候
这个数据发生变化了
他在数据发生变化的时候
他还会触发这个更新的动作
我们来看一下这部分代码
这部分代码他藏的比较深
我们就不演示查找过程了
我们这给大家上结果啊
大家看他调用了一个createStore
然后呢在这里生成了一个store对象
store对象干嘛用了呢
我们再来搜一下store对象啊
store.commit
我们搜commit
setData
在这里大家看
它在监听data属性变化
data是什么
就是我们传进来的这个数组
然后呢当这个数组发生变化的时候呢
它store.commit('setData'...
所以呢我们来看一下这个setData啊
它在这里setData的时候
也就是说
当我们这个数组发生变化的时候
就是我们新增了一行或者减少一行
他在最后会调用this.updateTableScrollY()
这个updateTableScrollY在哪呢
我们来搜一下啊
在这里又做了一层封装
其实呢还是在调用table的updateScrollY
我们再回到elTable
在这里他还是调的这个方法
所以呢也就是说啊
eltable它考虑了两种情况
一种是我们新增一行啊减少一行啊
它会更新这个
纵向的滚动条(包括横向的啊)
然后另一种情况呢
就是当外层的这个div
就是最外层的这个
尺寸发生变化的时候
他也会重新去计算这个scrollY
我们也可以验证一下
我们先把刚才那个问题出现出来
新增一个然后呢
好
现在已经有bug了对吧
好这时候咱们改变一下它的宽度啊
比如说我就放大一下网页
它宽度其实就变了
大家看
它里边的滚动条就出现了
好呢分析出原因之后呢
相信很多小伙伴已经有了解决的思路了
那我的思路呢其实很简单
我们就在它这个
select变化的时候
我们在这input
我们要想办法掉这个table里边的
我们现在在写mytable.doLayout这个方法就可以了
我们把这个myTable声明一下
我们来试一下啊
刷新一下
我把这个尺寸再缩回来啊
新增一个
好选
大家看
已经没有问题了
最后更新于
这有帮助吗?