vue修改数组对象触发视图更新问题

·  阅读 2956

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

问题

- 直接修改数组元素是无法触发视图更新 比如:

	 this.item.array[0] = 'b'
复制代码

- 直接给对象添加元素也不会触发视图更新

	 this.item.aa = 'aa'
复制代码

均不会触发视图更新

     

官方给出的解释

当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter。Object.defineProperty 是 ES5 中一个无法 shim 的特性,这也就是为什么 Vue 不支持 IE8 以及更低版本浏览器的原因。 用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。这里需要注意的问题是浏览器控制台在打印数据对象时 getter/setter 的格式化并不同,所以你可能需要安装 vue-devtools 来获取更加友好的检查接口。 每个组件实例都有相应的 watcher 实例对象,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的 setter 被调用时,会通知 watcher 重新计算,从而致使它关联的组件得以更新。

触发视图更新的方法有如下几种

1. Vue.set 可以设置对象或数组的值,通过key或数组索引,可以触发视图更新

数组修改

Vue.set(array, indexOfItem, newValue)
复制代码

对象修改

Vue.set(obj, keyOfItem, newValue)
复制代码

       

2. Vue.delete 删除对象或数组中元素,通过key或数组索引,可以触发视图更新

数组修改

Vue.delete(array, indexOfItem)
复制代码

对象修改

Vue.delete(obj, keyOfItem)
复制代码

       

3. 数组对象直接修改属性,可以触发视图更新

this.array[0].isShow= true;
this.array.forEach(function(item){
    item.isShow= true;
});
复制代码

       

4. 数组赋值为新数组,可以触发视图更新

this.array = this.array.filter(...)
this.array = this.array.concat(...)
复制代码

       

5.Vue提供了如下的数组的变异方法,可以触发视图更新

vue官方:Vue 将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括

push()
pop()
shift()
unshift()
splice()  
sort()
reverse()
复制代码
分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改