當你在Vue中使用watch
屬性去監(jiān)聽一個對象時,Vue會默認按照引用來檢測對象的變化。所以,如果你有個對象的引用發(fā)生了變化,那么會觸發(fā)watch
的響應,但是如果對象的屬性發(fā)生了變化,watch
并不會觸發(fā)響應。但是有一些情況我們需要監(jiān)聽對象內(nèi)部的屬性變化,這時候可以使用Vue的深度觀察。
那么,當我們在Vue中觀察一個數(shù)組時,應該怎么做才能深度觀察呢?
首先,我們需要了解一個關(guān)于Vue的特點,Vue無法檢測到以下變動的數(shù)組:
1.當你利用索引直接設置一個項時,例如:vm.items[indexOfItem] = newValue 2.當你修改數(shù)組的長度時,例如:vm.items.length = newLength
因此,Vue提供了一組變異方法,這些方法會改變原始數(shù)組,但同時也會觸發(fā)視圖更新,如下所示:
push() pop() shift() unshift() splice() sort() reverse()
所以,如果你想深度觀察一個數(shù)組,可以通過以下方式實現(xiàn):
watch: {
arr: {
handler: function(val, oldVal) {
console.log('數(shù)組發(fā)生了變化');
},
deep: true // 深度觀察
}
}
在上述例子中,arr
是一個數(shù)組,通過設置deep:true
來實現(xiàn)深度觀察。
此外,還可以通過Vue.set方法來添加、修改或刪除數(shù)組元素,該方法可以確保響應式更新。例如:
let arr = [1,2,3];
Vue.set(arr, 4, 4); // 添加元素
Vue.set(arr, 0, 0); // 修改元素
Vue.delete(arr, 0); // 刪除元素
最后,需要注意的是,雖然深度觀察可以實現(xiàn)對數(shù)組內(nèi)部屬性的監(jiān)聽,但是會帶來一定的性能問題,因此不要濫用。
上一篇vue watch6