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