computed与v-model双向数据绑定问题
问题出现场景
有这么一个场景:在某个表单里我用v-for遍历了一个数组(从computed里面获取的),并且在每一个输入框(el-input)里使用v-model对数组里面每一个对象的key进行绑定。具体代码如下图:
此时会出现一个问题:表单里面的输入框不可编辑了,为什么?
解读:问题出现原因
源码分析:其实v-model直接绑定computed里面返回的数组中的对象是会出问题的,让我们深入看下computed内部源码。在定义computed的源码中,重点两个函数是initComputed和defineComputed。
get():在initComputed函数中,也就是初始化computed,我们会遍历computed里面的每一个函数或者对象,并且加上get方法和watch实例
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