el-tree树形控件勾选数据回显问题

1,986 阅读2分钟

问题描述:

el-tree树形控件的勾选通过default-checked-keys绑定所选中的节点keys组成的数组。我通过v-bind绑定checked变量,通过后端获取的数据动态渲染勾选的权限列表

image.png image.png

但是这样却有一个问题,虽然checked变量动态改变了数据,但是el-tree的勾选却只会渲染数组元素最多的的时候的情况,简单来说,就是el-tree的勾选只勾选所绑定数组的并集 比如:我点开第二行权限列表,选中的是[3, 4],即开设课程栏和课程论坛栏被勾选

image.png 此时是第一次打开,没问题,控制台也是[3, 4]

但是当我接着打开第三行时,问题就来了,理论上选中的时[2, 4],即加入课程栏和课程论坛栏

image.png

但是实际上是绑定了[2,3,4] 也就是两次数组的并集,但是控制台打印依旧是没问题的

解决方法

这里一个原因是因为el-tree这个组件default-checked-keys属性绑定好变量后,在变量更新之后需要再通过获取在el-tree标签上设置的ref来使用setCheckedKeys这个api来渲染当前树的勾选情况

image.png

但是此时还有一个缺陷,就是点击打开dialog的时候会有一个勾选改变的动画,也就是之前的bug变为正确的情况的动画效果

这就涉及到js的执行机制的问题,this.$nextTick是微任务,会在同步任务执行后再执行,也就是this.treeVisible=true先执行,所以就会有先打开弹窗,再执行nextTick渲染的情况

因此给this.treeVisible=true加一个setTimeout,让它成为一个宏任务,在最后执行就不会有这bug啦

image.png