解决Vue不能检测数组或对象变动的问题

前端之家收集整理的这篇文章主要介绍了解决Vue不能检测数组或对象变动的问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

来看一个实例:

<Meta charset="UTF-8"> vue

想实现的效果是点击 li 看 vm.nymbers[index] 是否存在,不存在设置为1,存在的话加1。

点击之后数字并没有在view层更新,而通过console打印发现数据更新了,只是view层没有及时的检测到。

再看一个改动之后的:

<Meta charset="UTF-8"> vue

可以看到这里的view层能及时得到更新,但是到了数组哪里为什么就不可以了呢?

来看Vue2.0官方的文档说明:

由于 JavaScript 的限制,Vue 不能检测以下变动的数组:

当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue

当你修改数组的长度时,例如:vm.items.length = newLength

为了解决第一类问题,以下两种方式都可以实现和 vm.items[indexOfItem] = newValue 相同的效果,同时也将触发状态更新:

你还可以使用 vm.$set 实例方法,它只是全局 Vue.set 的别名。

还是由于 JavaScript 的限制,Vue 不能检测对象属性添加删除

对于已经创建的实例,Vue 不能动态添加根级别的响应式属性。但是,可以使用 Vue.set(object,key,value) 方法向嵌套对象添加响应式属性。例如,对于:

有时你可能需要为已有对象赋予多个新属性,比如使用 object.assign() 或 _.extend()。在这种情况下,你应该用两个对象的属性创建一个新的对象。所以,如果你想添加新的响应式属性,不要像这样:

应该这样做:

因此,上面例子应该改为:

<Meta charset="UTF-8"> vue

搞定!

1.17补充-------------------------------

如何理解“对于已经创建的实例,Vue 不能动态添加根级别的响应式属性”?

例如:

属性 info:{ name:'小明' } } }); //给info添加一个性别属性 Vue.set(vm.info,'sex','男');

上面是正确做法,下面的做法的话就会报错了:

实际上,不能直接在data上增加属性,但可以在data里的对象上增加属性

实际上vm.data是undefined。

以上这篇解决Vue不能检测数组或对象变动的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程之家。

猜你在找的Vue相关文章