vue中watch監(jiān)聽不到變化的解決
watch監(jiān)聽不到對象內(nèi)部的變化
有的時候vue會出現(xiàn)這種現(xiàn)象,無法監(jiān)聽到復(fù)雜對象內(nèi)部的變化:當(dāng)對象里面原本有某一個屬性,并對這個屬性操作時,watch是可以監(jiān)聽到當(dāng)前屬性的變化的。但是,若對象里面本沒有這個屬性的時候,在操作時將屬性添加進去,同時包括之后對這個屬性的操作,watch是都檢測不到的。
這是因為vue的watch會在初始化的時候通過object.defineProperty給對象的每一個屬性都添加watcher來監(jiān)聽內(nèi)部的變化。所以,后期添加上去的屬性是無法檢測到的。
解決方法:
如果想在初始化后添加一個屬性并進行監(jiān)聽操作,可以使用$set:
// this.$set(object, key, value) // 使用this.$set就可以監(jiān)聽到 this.$set(this.obj, 'a', Math.random())
watch的handler方法的兩個參數(shù)值相同
一個數(shù)據(jù),如果值發(fā)生了變化,如果想要記錄變化前和變化后的兩個值,可以使用handler方法,第一個參數(shù)為變化后的新值,第二個為變化前的舊值。
但是如果這個值是復(fù)雜對象,如果想記錄里面的屬性的變化,使用handler,兩個參數(shù)均為變化后的新值。
解決方法:
結(jié)合計算屬性、序列化、反序列化生成新的對象,來避免此問題
data () {
return {
obj: {}
}
},
computed: {
// 如果想要得到差異內(nèi)容,可以結(jié)合計算屬性、序列化、反序列化生成新的對象,來避免此問題 。
obj2 () {
return JSON.parse(JSON.stringify(this.obj))
}
},
watch: {
obj2: {
handler (newVal, oldVal) {
console.log('data變化了')
console.log(newVal, oldVal)
},
deep: true
}
},全部代碼
<template>
? <div>
? ? <button @click="clickFn">++++</button>
? </div>
</template>
<script>
export default {
? name: 'Mall',
? data () {
? ? return {
? ? ? // !監(jiān)聽時給每一個屬性都添加getter和setter,變化了,就觸發(fā)handler函數(shù),如果后期添加屬性,這個屬性不可以被監(jiān)聽到
? ? ? // obj: {
? ? ? // ? a: 10
? ? ? // }
? ? ? // !這種是不可以被監(jiān)聽到的
? ? ? // 因為watch是通過Object.defineProperty()給對象的每一個現(xiàn)有屬性增加監(jiān)聽器
? ? ? // 在后面直接添加a屬性,身上沒有監(jiān)聽器,所以不會被監(jiān)聽到
? ? ? obj: {}
? ? }
? },
? computed: {
? ? // 如果想要得到差異內(nèi)容,可以結(jié)合計算屬性、序列化、反序列化生成新的對象,來避免此問題 。
? ? obj2 () {
? ? ? return JSON.parse(JSON.stringify(this.obj))
? ? }
? },
? watch: {
? ? obj2: {
? ? ? handler (newVal, oldVal) {
? ? ? ? console.log('data變化了')
? ? ? ? console.log(newVal, oldVal)
? ? ? },
? ? ? deep: true
? ? }
? },
? methods: {
? ? clickFn () {
? ? ? // this.obj.a = Math.random()
? ? ? // this.$set(object, key, value)
? ? ? // 使用this.$set就可以監(jiān)聽到
? ? ? this.$set(this.obj, 'a', Math.random())
? ? }
? }
}
</script>到此這篇關(guān)于vue中watch監(jiān)聽不到變化的解決的文章就介紹到這了,更多相關(guān)vue watch監(jiān)聽不到內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3使用Echarts導(dǎo)致tooltip失效問題及解決方法
Vue3 使用 proxy 對象代理,而 echarts 則使用了大量的全等(===), 對比失敗從而導(dǎo)致了bug,這篇文章主要介紹了Vue3使用Echarts導(dǎo)致tooltip失效問題及解決方法,需要的朋友可以參考下2023-08-08
vue項目中v-model父子組件通信的實現(xiàn)詳解
vue.js,是一個構(gòu)建數(shù)據(jù)驅(qū)動的 web 界面的庫。Vue.js 的目標(biāo)是通過盡可能簡單的 API 實現(xiàn)響應(yīng)的數(shù)據(jù)綁定和組合的視圖組件。下面這篇文章主要給大家介紹了關(guān)于vue項目中v-model父子組件通信實現(xiàn)的相關(guān)資料,需要的朋友可以參考下。2017-12-12
Vue3使用el-form嵌套el-table進行單條數(shù)據(jù)的表單校驗功能
在實際開發(fā)過程中,我們經(jīng)常需要處理表格中的表單數(shù)據(jù),比如在編輯表格中的某一行數(shù)據(jù)時進行校驗,本文給大家介紹了Vue3使用el-form嵌套el-table進行單條數(shù)據(jù)的表單校驗功能,文中有相關(guān)的代碼供大家參考,需要的朋友可以參考下2024-08-08

