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)