vue如何監(jiān)聽對象或者數(shù)組某個屬性的變化詳解
前言
在vue.js中監(jiān)聽某個屬性的改變,動態(tài)的去修改另外屬性的值,這是非常常見的業(yè)務(wù)場景。例如在一個購物車中,根據(jù)用戶添加的商品數(shù)量,動態(tài)修改頁面顯示的訂單總金額。要實現(xiàn)這樣的功能,主要有兩種方法可以實現(xiàn),一種是使用watch監(jiān)聽,另外一種是使用computed計算屬性。
用watch監(jiān)聽
在Vue組件中,可以使用watch選項來監(jiān)聽數(shù)據(jù)的變化。假設(shè)你有一個data中的屬性sourceProp,當(dāng)它變化時,你想修改另一個屬性targetProp的值。
export default {
data() {
return {
totalMoney: 0.00,
buyCount: 1
};
},
watch: {
buyCount(newValue, oldValue) {
// 當(dāng)buyCount變化時,修改totalMoney的值,這里的100是單個商品的金額
this.totalMoney = newValue * 100;
}
}
};1、watch選項是一個對象,其中的鍵是要監(jiān)聽的數(shù)據(jù)屬性名(這里是buyCount),值是一個函數(shù)。這個函數(shù)接收兩個參數(shù),newValue是屬性變化后的新值,oldValue是變化前的值。
2、在函數(shù)內(nèi)部,可以根據(jù)newValue來修改其他屬性(這里將totalMoney修改為newValue * 100)。
深度監(jiān)聽
上述的方法,適合監(jiān)聽簡單的熟悉感,如果要監(jiān)聽的屬性是一個對象或者是一個數(shù)組,并且需要監(jiān)聽對象內(nèi)部屬性的變化,要使用上述的方法就無法實現(xiàn)我們的需求。此時就需要使用深度監(jiān)聽。
export default {
data() {
return {
goodsInfo: {
price: 100.00,
buyCount: 1
},
orderTotalMoney: 0.00
};
},
watch: {
goodsInfo: {
handler(newValue, oldValue) {
this.orderTotalMoney = goodsInfo.buyCount * goodsInfo.price;
},
deep: true// 開啟深度監(jiān)聽
}
}
};深度監(jiān)聽會帶來一定的性能開銷,因為它會遞歸地檢查對象的每一個屬性。如果不需要監(jiān)聽對象內(nèi)部的所有屬性變化,可以考慮使用淺拷貝等方式來手動比較對象的變化。
使用計算屬性
計算屬性可以根據(jù)其他數(shù)據(jù)屬性自動計算并返回一個新的值,并且會自動緩存結(jié)果。雖然它不是直接監(jiān)聽屬性變化,但可以達到類似的效果。
export default {
data() {
return {
totalMoney: 0.00,
buyCount: 1
};
},
computed: {
totalMoney() {
return this.totalMoney * 100;
}
}
};watch和計算屬性的區(qū)別
watch主要用于在屬性變化時執(zhí)行一些副作用,比如異步操作、修改多個屬性等。計算屬性主要用于根據(jù)已有數(shù)據(jù)生成新的數(shù)據(jù),并且具有緩存機制,只有當(dāng)依賴的屬性發(fā)生變化時才會重新計算。
在Vue 3中使用watchEffect(組合式API)
在Vue 3的組合式API中,可以使用watchEffect來實現(xiàn)屬性變化的監(jiān)聽。
import {ref, watchEffect} from 'vue';
export default {
setup() {
const totalMoney = ref(0);
const buyCount = ref(0);
watchEffect(() => {
totalMoney.value = buyCount.value * 100;
});
return {
totalMoney: 0.00,
buyCount: 1
};
}
};watchEffect會立即執(zhí)行傳入的函數(shù),并自動追蹤函數(shù)中使用的響應(yīng)式數(shù)據(jù)(這里是buyCount)。當(dāng)這些響應(yīng)式數(shù)據(jù)變化時,函數(shù)會再次執(zhí)行。這樣就可以根據(jù)buyCount的變化動態(tài)修改totalMoney的值。
在vue.js中監(jiān)聽某個屬性的改變,動態(tài)的去修改另外屬性的值,這是非常常見的業(yè)務(wù)場景。例如在一個購物車中,根據(jù)用戶添加的商品數(shù)量,動態(tài)修改頁面顯示的訂單總金額。要實現(xiàn)這樣的功能,主要有兩種方法可以實現(xiàn),一種是使用watch監(jiān)聽,另外一種是使用computed計算屬性。
用watch監(jiān)聽
在Vue組件中,可以使用watch選項來監(jiān)聽數(shù)據(jù)的變化。假設(shè)你有一個data中的屬性sourceProp,當(dāng)它變化時,你想修改另一個屬性targetProp的值。
export default {
data() {
return {
totalMoney: 0.00,
buyCount: 1
};
},
watch: {
buyCount(newValue, oldValue) {
// 當(dāng)buyCount變化時,修改totalMoney的值,這里的100是單個商品的金額
this.totalMoney = newValue * 100;
}
}
};1、watch選項是一個對象,其中的鍵是要監(jiān)聽的數(shù)據(jù)屬性名(這里是buyCount),值是一個函數(shù)。這個函數(shù)接收兩個參數(shù),newValue是屬性變化后的新值,oldValue是變化前的值。
2、在函數(shù)內(nèi)部,可以根據(jù)newValue來修改其他屬性(這里將totalMoney修改為newValue * 100)。
深度監(jiān)聽
上述的方法,適合監(jiān)聽簡單的熟悉感,如果要監(jiān)聽的屬性是一個對象或者是一個數(shù)組,并且需要監(jiān)聽對象內(nèi)部屬性的變化,要使用上述的方法就無法實現(xiàn)我們的需求。此時就需要使用深度監(jiān)聽。
export default {
data() {
return {
goodsInfo: {
price: 100.00,
buyCount: 1
},
orderTotalMoney: 0.00
};
},
watch: {
goodsInfo: {
handler(newValue, oldValue) {
this.orderTotalMoney = goodsInfo.buyCount * goodsInfo.price;
},
deep: true// 開啟深度監(jiān)聽
}
}
};深度監(jiān)聽會帶來一定的性能開銷,因為它會遞歸地檢查對象的每一個屬性。如果不需要監(jiān)聽對象內(nèi)部的所有屬性變化,可以考慮使用淺拷貝等方式來手動比較對象的變化。
使用計算屬性
計算屬性可以根據(jù)其他數(shù)據(jù)屬性自動計算并返回一個新的值,并且會自動緩存結(jié)果。雖然它不是直接監(jiān)聽屬性變化,但可以達到類似的效果。
export default {
data() {
return {
totalMoney: 0.00,
buyCount: 1
};
},
computed: {
totalMoney() {
return this.totalMoney * 100;
}
}
};watch和計算屬性的區(qū)別
watch主要用于在屬性變化時執(zhí)行一些副作用,比如異步操作、修改多個屬性等。計算屬性主要用于根據(jù)已有數(shù)據(jù)生成新的數(shù)據(jù),并且具有緩存機制,只有當(dāng)依賴的屬性發(fā)生變化時才會重新計算。
在Vue 3中使用watchEffect(組合式API)
在Vue 3的組合式API中,可以使用watchEffect來實現(xiàn)屬性變化的監(jiān)聽。
import {ref, watchEffect} from 'vue';
export default {
setup() {
const totalMoney = ref(0);
const buyCount = ref(0);
watchEffect(() => {
totalMoney.value = buyCount.value * 100;
});
return {
totalMoney: 0.00,
buyCount: 1
};
}
};watchEffect會立即執(zhí)行傳入的函數(shù),并自動追蹤函數(shù)中使用的響應(yīng)式數(shù)據(jù)(這里是buyCount)。當(dāng)這些響應(yīng)式數(shù)據(jù)變化時,函數(shù)會再次執(zhí)行。這樣就可以根據(jù)buyCount的變化動態(tài)修改totalMoney的值。
總結(jié)
到此這篇關(guān)于vue如何監(jiān)聽對象或者數(shù)組某個屬性的變化的文章就介紹到這了,更多相關(guān)vue監(jiān)聽對象或者數(shù)組屬性變化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3中reactive丟失響應(yīng)式的問題解決(避大坑!)
這篇文章主要給大家介紹了關(guān)于Vue3中reactive丟失響應(yīng)式的問題解決,vue3中reactive定義的引用類型直接賦值導(dǎo)致數(shù)據(jù)失去響應(yīng)式 ,需要的朋友可以參考下2023-07-07
在vue項目中 實現(xiàn)定義全局變量 全局函數(shù)操作
這篇文章主要介紹了在vue項目中 實現(xiàn)定義全局變量 全局函數(shù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
手把手教你如何將html模板資源轉(zhuǎn)為vuecli項目
Vue可以直接集成html,Vue就是前端框架,使用Vue做前端開發(fā)效率非常高,下面這篇文章主要給大家介紹了關(guān)于如何將html模板資源轉(zhuǎn)為vuecli項目的相關(guān)資料,需要的朋友可以參考下2023-04-04
解決cordova+vue 項目打包成APK應(yīng)用遇到的問題
這篇文章主要介紹了解決cordova+vue 項目打包成APK應(yīng)用遇到的問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05
vue3 vue-draggable-next如何實現(xiàn)拖拽穿梭框效果
這篇文章主要介紹了vue3 vue-draggable-next如何實現(xiàn)拖拽穿梭框效果,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06

