Vue 數(shù)組更新檢測
變異方法
Vue包含一組觀察數(shù)組的變異方法吼虎,所以它們也將會觸發(fā)視圖更新。這些方法如下:
push()
pop()
shift()
unshift()
splice()
sort()
reserve()
替換數(shù)組
變異方法會改變被這些方法調(diào)用的原始數(shù)組梨睁。相比之下鲸睛,也有非變異方法,例如: filter()
, concat()
和 slice()
坡贺。這些方法不會改變原始數(shù)組,但總是會返回一個新數(shù)組箱舞。當(dāng)使用非變異方法時遍坟,可以用新數(shù)組替換舊數(shù)組:
example.items = example.items.filter(function (item) {
return item.message.match(/Foo/)
})
可以認(rèn)為這將導(dǎo)致Vue丟棄現(xiàn)有DOM并重新渲染整個列表。然而事實(shí)并非如此晴股。Vue為了使得DOM元素得到最大范圍的重用而實(shí)現(xiàn)了一些智能的愿伴、啟發(fā)式的方法,所以用一個含有相同元素的數(shù)組去替換原來的數(shù)組是非常高效的操作电湘。
注意事項(xiàng)
由于 Javascript
的限制隔节,Vue
不能檢測到以下變動的數(shù)組:
1.利用索引直接設(shè)置一個項(xiàng)鹅经,例如: vm.items[index] = newVal
2.修改數(shù)組的長度時,例如: vm.items.length = newLength
例如:
var vm = new Vue({
data: {
items: ['a', 'b', 'c']
}
})
vm.items[1] = 'x' // 不是響應(yīng)性的
vm.items.length = 2 // 不是響應(yīng)性的
為了解決第一類問題怎诫,一下兩種方法都可以實(shí)現(xiàn)和 vm.items[index] = newVal
相同的效果瘾晃,同時也將觸發(fā)狀態(tài)更新:
// Vue.set
Vue.set(vm.items, index, newVal)
// Array.prototype.splice
vm.items.splice(index, 1, newVal)
也可以使用 vm.$set
實(shí)例方法,該方法是全局方法 Vue.set
的一個別名:
vm.$set(vm.items, index, newVal)
為了解決第二類問題幻妓,可以使用 splice
:
vm.items.splice(newLength)