阅读 366

computed与v-model双向数据绑定问题

问题出现场景

有这么一个场景:在某个表单里我用v-for遍历了一个数组(从computed里面获取的),并且在每一个输入框(el-input)里使用v-model对数组里面每一个对象的key进行绑定。具体代码如下图:

image2021-9-18_14-45-43.png

image2021-9-18_14-45-56.png

image2021-9-18_14-46-5.png

此时会出现一个问题:表单里面的输入框不可编辑了,为什么?

image2021-9-18_14-47-14.png

解读:问题出现原因

源码分析:其实v-model直接绑定computed里面返回的数组中的对象是会出问题的,让我们深入看下computed内部源码。在定义computed的源码中,重点两个函数是initComputed和defineComputed。

image2021-9-18_14-51-53.png

get():在initComputed函数中,也就是初始化computed,我们会遍历computed里面的每一个函数或者对象,并且加上get方法和watch实例

image2021-9-18_14-55-46.png

set():在defineComputed函数中,也就是定义computed功能,同样会对computed内部每一项值判断类型。如果类型为函数,会在这个函数上加一个set方法,但是方法为空;如果类型为对象,也会给它加一个set方法,当该对象本身已定义set方法时本方法会被保留,否则会赋值一个空函数。

问题总结:综上所述,这个场景下出现的问题是computed方法里有一个list函数并且返回了一个数组,这个list它具有一个get方法和一个set方法但是set方法为空,使用v-model绑定list时可以获取到值,但是由于set方法为空,但是list返回的值不可编辑改变。

场景拓展:当computed里list函数返回的是从store中获取到的data时,输入框可以编辑,为什么?

Vuex官方文档中有这样一句话: 存储在 Vuex 中的数据和 Vue 实例中的 data 遵循相同的规则

因此,v-model绑定的内容约等于是data里面的值,这是可以双向数据绑定成功的

问题解决办法

需要与v-model进行双向绑定的数据不要放在computed里面 

注意事项

computed关联的是props里的数据,然后使用v-model绑定computed数据,这种情况computed的数据是不可以改变的(不提倡做法)


作者:仙儿仙儿
链接:https://juejin.cn/post/7021028847751528461


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐