el-cascade限制选中数量(续)

Demo预览:

https://sunzsh.github.io/vue-demos/#/cascader2

代码 / 文件:

https://github.com/sunzsh/vue-el-demo/blob/master/src/views/cascader2.vue

上期视频发布以后

有个小伙伴发现一点问题

就是比如说我在这个层级下

选中了2个

并且呢我现在最多限制只能选2个

在我去其他层级的时候,大家看

我再勾选

虽然提示了不能选

然后这个选中也都没有问题

但是呢

这个面板又回到了原来这个层级上

(我们希望他还是在这个层级里边)

那为什么会这样呢

我们来看一下上一期的代码

我们会改变checkedValue

这个checkedValue 上一期也说了

他会传给这个组件

也就是说展开的这个面板

是一个单独封装的组件

那我们都知道

v-model其实就是value的双向绑定

所以

checkedValue就会传给这个组件的value属性

所以呢我们来看这个组件

找到这个props

大家看 这有一个value属性

然后我们再搜这个value

你会发现它还有一个watch

也就是说当value发生变化的时候

它会改变复选框的这个选中状态

我们来看一下

然后这里边你再一层一层的看

你会发现啊

它这里边会改变展开的状态

比如说我们展开这个方法

这里边就有expand nose才会去做展开

那具体代码的细节我们就不读了哈

我们就知道这个方法给他一个数组

他就可以一层一层的展开

那数组是什么呢

就是我们每一层

对应被展开的那个节点

所以如果我们要想展开这一层

我们其实需要"东南"和"江苏"(两个节点)就够了

所以呢我就想到

我们可不可以直接调这个方法

那调这个方法没问题

问题是我们怎么去构建这个node节点的数组

所以这里边还有一个关键的方法

就是这个getNodeByValue

这个方法可以根据一个value

去找到对应的node节点,注意它只是找到一个节点

我们可以试一下

我们先在这啊

找到它最后一次点击的那个值

注意

一定要在这个checkedValue被赋值之前

否则它就被覆盖了

所以呢我们在这找到value的最后一个

.length - 1 作为一个索引

因为value是一个数组

我们声明一个变量叫last

等于value里面的最后一个

然后啊我们就要想办法调用它

这个getNodeByValue

调用这个方法就要先找到这个

展开的面板组件

好在他这也写了一个ref

所以呢我们需要在这加一个

找到这个组件之后

再去点refs.panel

然后呢我们再去调这个方法

getNoteByValue

然后把这个value last传进来

我们先把它打印一下大家看一下

好,刷新一下

大家注意啊

我现在这选两个

然后换一节点选一个

大家看这个node出来了

我们展开这个node

这有一个label

大家看这个label就是我刚才点的这个

无锡

就是这个

好在呢它还有一个parent

大家看parent就是它外部这一层

我们看它的label

就是江苏

所以呢我们一层一层的

其实可以构建出一个数组的

所以这就简单了

我们呀

可以这样先把它放到一个数组里面

const nodes =

把这个拿过来

这个就是他最后一个node

然后呢我们做一个while循环 nodes

第一个的parent

是不是有值

如果有值呢

我们让node.unshift 大家看

unshift就是在第一个元素(第0个索引)上添加

添加它的parent

这样的话呢最终构建一个nodes

我们再把它打印一下

好刷新

现在这选两个

然后选浙江

点嘉兴打开

出来3个

其实啊我们要2个就够了

第一个是东南就是这个

然后以此类推第二个是江苏(口误:浙江)

第三个是无锡(口误:嘉兴)

其实第三个有没有都行

但是我们就放这了

然后最后简单了

我们就去调一下它这个expendNode方法

还是我们去找到panel的组件

然后在这

调用他的expendNodes

然后把一个nodes传进来

但是注意

这个还是要在nextTick里边执行

否则它还会乱

nextTick

我们先这样写把它替换下

把这个用了

好我们再来试一下

展开

选中两个然后换一个西北、新疆 大家看

没有问题了

再去东南江苏

这样都可以了

最后更新于