Vue的watch選項非常強大,它允許我們在監視數據變化時執行自定義邏輯。對象數組在Vue中是常見的數據形式,那么如何在watch選項中監聽一個對象數組的變化呢?
首先,我們需要在組件的data選項中定義一個名為items的數組:
data() { return { items: [ {name: 'apple', price: 2.5}, {name: 'banana', price: 1.5}, {name: 'orange', price: 3} ] } }
接下來,我們可以在組件的watch選項中監聽items數組的變化,代碼如下:
watch: { items: { handler(newVal, oldVal) { // 監聽到items數組的變化時執行的邏輯 }, deep: true } }
需要注意的是,在watch選項中監聽對象或數組時,需要將deep選項設為true。這樣才能監聽到對象或數組內部數據的變化。
除了deep選項,watch選項還有一個immediate選項。它允許我們在組件加載時立即執行一次handler函數。對于對象數組來說,我們有可能需要在組件加載時立即執行一次處理函數,以保證每次組件加載時的初始狀態都是正確的。代碼如下:
watch: { items: { handler(newVal, oldVal) { // 監聽到items數組的變化時執行的邏輯 }, deep: true, immediate: true } }
除了監聽整個數組的變化外,我們還可以監聽數組中每個對象的變化。考慮這樣一種情況:每個商品對象都有一個price屬性,我們想要監聽price屬性的變化。代碼如下:
watch: { items: { handler(newVal, oldVal) { // 監聽到items數組的變化時執行的邏輯 }, deep: true } }, computed: { itemPrices() { return this.items.map(item =>item.price) } }, watch: { itemPrices: { handler(newVal, oldVal) { // 監聽到itemPrices數組的變化時執行的邏輯 }, deep: true } }
在這里,我們用計算屬性itemPrices將items數組中每個對象的price屬性提取出來,然后在watch選項中監聽itemPrices數組的變化。需要注意的是,由于數組是引用類型,因此我們不能直接監聽items[i].price,當數組中某個對象的price屬性發生變化時,items[i]本身并未發生變化,因此handler函數不會被調用。
最后需要說明的是,在監聽對象數組時,我們可以使用lodash中的_.cloneDeep方法來深拷貝數組,以監聽數組內部的數據變化。代碼如下:
import cloneDeep from 'lodash/cloneDeep' watch: { items: { handler(newVal, oldVal) { // 監聽到items數組的變化時執行的邏輯 }, deep: true }, itemPrices: { handler(newVal, oldVal) { // 監聽到itemPrices數組的變化時執行的邏輯 }, deep: true } }, computed: { itemPrices() { return cloneDeep(this.items).map(item =>item.price) } }
這里,我們先使用lodash中的cloneDeep方法對items數組進行深拷貝,然后再提取每個對象的price屬性。這樣,在監聽itemPrices數組時,我們就能監聽到items數組內部數據的變化了。