Vue 数组更新检测

Vue 数组更新检测

变异方法

Vue包含一组观察数组的变异方法,所以它们也将会触发视图更新。这些方法如下:

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reserve()

替换数组

变异方法会改变被这些方法调用的原始数组。相比之下,也有非变异方法,例如: filter(), concat()slice() 。这些方法不会改变原始数组,但总是会返回一个新数组。当使用非变异方法时,可以用新数组替换旧数组:

example.items = example.items.filter(function (item) {
    return item.message.match(/Foo/)
})

可以认为这将导致Vue丢弃现有DOM并重新渲染整个列表。然而事实并非如此。Vue为了使得DOM元素得到最大范围的重用而实现了一些智能的、启发式的方法,所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作。

注意事项

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

1.利用索引直接设置一个项,例如: vm.items[index] = newVal

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

例如:

var vm = new Vue({
    data: {
        items: ['a', 'b', 'c']
    }
})
vm.items[1] = 'x'   // 不是响应性的
vm.items.length = 2 // 不是响应性的

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

// Vue.set
Vue.set(vm.items, index, newVal)
// Array.prototype.splice
vm.items.splice(index, 1, newVal)

也可以使用 vm.$set 实例方法,该方法是全局方法 Vue.set 的一个别名:

vm.$set(vm.items, index, newVal)

为了解决第二类问题,可以使用 splice

vm.items.splice(newLength)

推荐阅读更多精彩内容

  • #变异方法 作用 : 改变这些方法调用的原始数组 VUE包含一组观察数组的变异方法,他们也将触发视图的更新 数组方...
    竹溪穆褕阅读 131评论 0 0
  • 变异方法 Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新 替换数组 非变异 (non-mutati...
    飞鱼_JS阅读 610评论 0 0
  • 今天在做项目的时候,需要向vuex的中的一个数组添加属性。使用的方法为: array[index] = newVa...
    果果不正常阅读 41评论 0 0
  • 主要还是自己看的,所有内容来自官方文档。 介绍 Vue.js 是什么 Vue (读音 /vjuː/,类似于 vie...
    Leonzai阅读 1,975评论 0 23
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 3,306评论 0 29