偶发的el-select无法选择的问题
1
问题起源
最近借鉴开源管理系统若依(http://www.ruoyi.vip/)开发公司的管理系统,尤其是其使用VUE的前端。在借鉴若依用户管理时遇到一个很怪的BUG。这个bug不能准确复现,但是希望通过这次问题阐述帮助整理清楚问题原因。
问题定位
在开发用户管理界面,编辑已有用户账号时,其操作界面如下:
这次,我们遇到的问题是角色选项时,虽然返回的数据可以自动选中之前已经选择的角色,但是无法勾选新角色,也无法取消已选角色,这让我们陷入沉思,明明前端代码是一样的啊?为什么若依系统中可以,而自己的系统中就不可以呢?
关键代码
我们来看一下这个对话框的代码,
1 | .... |
我们剔除掉无关紧要或者与本次问题肯定无关的其他代码部分,出问题的便是上方这个el-select
组件。el-select组件官网:https://element.eleme.cn/#/zh-CN/component/select。文档中也并没有特别著名什么。因此,我们也正常书写这段代码。其中的`form.roleIds`格式为数组,data中,有:
1 |
|
获取用户已有角色的接口方法:
1 | /** 修改按钮操作 */ |
我们获取用户数据方法也基本相同,准确的说,没有什么不同,但是我们的仍然是不可选的。
在网络检索“el-select”无法选中问题后,我们尝试了一种可行的方法。
解决问题
一种说法是在form初始化时,其中的roleIds并没有被添加到vue的自动监听机制中,所以其值变化并没有引起el-select的视图刷新。但是,经过我们对form数据进行watch监听,form也并没有发生改变。
尽管如此,我们仍然尝试了文中给出的解决办法:使用this.$set(this.form, 'roleIds', newValue)
设置已有角色,如下所示:
1 | this.$set(this.form, 'roleIds', response.result.data.roleIds) |
如此,竟然成功的解决了问题。
总结
最终,我们猜测,仍然是由于form.roleIds没有被vue自动监听机制发现,所以el-select无法做到视图与数据的更新。
我们可以手动使用this.$set来解决该问题。