Vue中watch監(jiān)聽屬性新舊值相同的問題解決方案
偵聽器 _watch:
作用:可以偵聽data和computed中數(shù)據(jù)的變化.
語法
watch: { "被偵聽的屬性名" (newVal, oldVal){ } }
監(jiān)聽簡單數(shù)據(jù)類型時可以直接使用,而監(jiān)聽復(fù)雜數(shù)據(jù)類型時,例如當我們只需要監(jiān)聽data或者computed中對象的某個屬性時,可以使用字符串的形式進行監(jiān)聽.
//舉例: watch: { ? //字符串形式 表示監(jiān)聽item對象下的good_count屬性 ? 'item.goods_count'(newval) { ? if (newval <= 0) { ? this.item.goods_count=1 ? } ? } }
在watch中,如果對對象進行監(jiān)聽,只有對象obj被重新賦值時
,watch才會被監(jiān)聽到,這個時候無法對obj里面的屬性的變化進行監(jiān)聽,我們也可以給watch對象加上深度監(jiān)聽屬性.
handler(newval, oldval) { console.log("完整寫法,監(jiān)聽復(fù)雜數(shù)據(jù)類型", newval); }, deep: true, //表示開啟深度監(jiān)聽 immediate: true, //立即監(jiān)聽,在頁面初始化時,會監(jiān)聽一次 }
而監(jiān)聽復(fù)雜數(shù)據(jù)類型,當復(fù)雜數(shù)據(jù)類型被改變之后,newval的值改變,由于newval和oldval都指向同一個對象
,導(dǎo)致oldval也會隨之改變,打印出來則沒有了old和new之分.
解決方法:在初始化的時候,深克隆一個oldval.
也有看其他人寫的文章解決方案,都大差不差,都是使用一個計算屬性加上深拷貝,看別人的回答時總感覺很拗口.于是自己總結(jié)了一下.
在我看來,解決此問題的關(guān)鍵在于:我們此時遇到的問題就是新值與舊值指向同一個地址的問題.而深拷貝的特點就是新開辟一個地址儲存需要拷貝對象的所有屬性.然后指向這個新地址. 故 JSON.parse(JSON.stringify())能完美解決其中的問題.然后與計算屬性合并達到監(jiān)聽的屬性一旦變化,自動新開辟一個地址,儲存新值.而新值與舊值指向的地址不同,則解決了新值與舊值相同的問題.
<div id="app"> <input type="text" v-model="lzy.age" /> </div> </template> <script> export default { name: "App", watch: { lzy2: { handler(newvalue, oldvalue) { console.log("新值"); console.log(newvalue); console.log("舊值"); console.log(oldvalue); console.log(oldvalue===this.lzy); }, deep: true, }, }, data() { return { lzy: { gender: "man", age: 21, }, }; }, computed: { lzy2(){ return JSON.parse(JSON.stringify(this.lzy)) // 因為計算屬性一開始就執(zhí)行了一次,相當于在一開始就深拷貝拿到了oldvalue,改變之后又再一次深拷貝,每一次深拷貝生成的對象都是指向不同的地址,所以oldvalue和newvalue是兩個不同的地址. }, }, }; </script> <style scoped> </style>
到此這篇關(guān)于Vue中watch監(jiān)聽屬性新舊值相同問題解決方案的文章就介紹到這了,更多相關(guān)Vue watch監(jiān)聽屬性新舊值相同內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue使用Luckysheet插件實現(xiàn)excel導(dǎo)入導(dǎo)出
本文主要介紹了vue使用Luckysheet插件實現(xiàn)excel導(dǎo)入導(dǎo)出,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-03-03vue element-ui導(dǎo)航實現(xiàn)全屏/取消全屏功能
這篇文章主要介紹了vue element-ui導(dǎo)航實現(xiàn)全屏/取消全屏功能,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08element-ui自定義表格如何給input雙向綁定數(shù)據(jù)
這篇文章主要介紹了element-ui自定義表格如何給input雙向綁定數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10