詳解Vue的監(jiān)聽屬性
Vue監(jiān)聽屬性
什么是監(jiān)聽屬性?
所謂監(jiān)聽就是對內(nèi)置對象的狀態(tài)或者屬性變化進(jìn)行監(jiān)聽并且做出反應(yīng)的響應(yīng),監(jiān)聽屬性,意思就是可以監(jiān)視其他數(shù)據(jù)的變化。
監(jiān)聽屬性和計算屬性的區(qū)別?
計算屬性是依賴的值改變后重新計算結(jié)果更新DOM,會進(jìn)行緩存。
屬性監(jiān)聽的是屬性值,當(dāng)定義的值發(fā)生變化時,執(zhí)行相對應(yīng)的函數(shù)。
最主要的用途區(qū)別:
計算屬性不能執(zhí)行異步任務(wù)。計算屬性一般不會用來向服務(wù)器請求或者執(zhí)行異步任務(wù),因為耗時可能會比較長,我們的計算屬性要實時更新。所以這個異步任務(wù)就可以用監(jiān)聽屬性來做。
總之一句話:computed能實現(xiàn)的,watch都能實現(xiàn),computed不能實現(xiàn)的,watch也能實現(xiàn)
監(jiān)聽屬性的使用
使用watch配置項,在配置項里面寫上要監(jiān)視的屬性,每次屬性值的變化都會觸發(fā)handler函數(shù)回調(diào),也可以監(jiān)視計算屬性的變化。

例子:
監(jiān)視輸入框的變化

代碼
<template>
<div class="main">
我:<el-input v-model="name" placeholder="請輸入名字"></el-input>
好友1<el-input v-model="friends.friend_1" placeholder="請輸入名字"></el-input>
好友2<el-input v-model="friends.friend_2" placeholder="請輸入名字"></el-input>
</div>
</template>
<script>
export default {
data(){
return{
name:'浪漫主義碼農(nóng)',
friends:{friend_1:'張三',friend_2:'李四'}
}
},
watch:{
name:{
handler(newValue,oldValue){ //newValue 新的值,oldValue變化前的值
console.log(newValue,oldValue)
this.friends.friend_1='王五'
}
},
//監(jiān)視多級結(jié)構(gòu)中某個屬性的變化
'friends.friend_1':{
handler(newValue,oldValue){
console.log(newValue,oldValue)
}
},
'friends.friend_2':{
handler(newValue,oldValue){
console.log(newValue,oldValue)
}
},
}
};
</script>
深度監(jiān)聽
當(dāng)我們的對象有多層結(jié)構(gòu)的時候,我們要監(jiān)聽的對象的屬性很多,避免一個一個屬性單獨寫,這個時候用到深度監(jiān)聽。
在watch配置中,監(jiān)視屬性對象中,配置deep 設(shè)置為 true 用于監(jiān)聽多級對象或者數(shù)組內(nèi)部值的變化
watch:{
//監(jiān)視多級結(jié)構(gòu)中所有屬性的變化
friends:{
handler(newValue,oldValue){
console.log(newValue,oldValue,"aa")
},
deep:true, //開啟深度監(jiān)聽
}
}

注意:這里有個問題,深度監(jiān)聽時會出現(xiàn)新舊值相同的現(xiàn)象?
官方的解釋:
在變異(不是替換)對象或數(shù)組時,舊值將與新值相同,因為它們的引用指向同一個對象/數(shù)組。Vue不會保留變異之前值的副本
就是導(dǎo)致了指針的變化。在我的js深拷貝你還不會嗎 文章里講到數(shù)據(jù)的存儲
立即調(diào)用
和deep配置的地方一樣。
immediate 設(shè)置為 true 將立即以觸發(fā)當(dāng)前handler回調(diào)
watch:{
name:{
handler(newValue,oldValue){ //newValue 新的值,oldValue變化前的值
console.log(newValue,oldValue)
this.friends.friend_1='王五'
},
immediate:true
},
}
在頁面加載的時候就執(zhí)行了一次,所以舊數(shù)據(jù)為undefined

總結(jié)
watch監(jiān)聽屬性通??梢杂迷?數(shù)據(jù)持久化、派發(fā)事件并同步/異步執(zhí)行,驗證格式…
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
VUE3.2項目使用Echarts5.4詳細(xì)步驟總結(jié)
Vue3.2是一款非常流行的JavaScript框架,它讓在前端領(lǐng)域開發(fā)變得更加的便捷,下面這篇文章主要給大家介紹了關(guān)于VUE3.2項目使用Echarts5.4的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
vue3中$attrs的變化與inheritAttrs的使用詳解
$attrs現(xiàn)在包括class和style屬性。?也就是說在vue3中$listeners不存在了,vue2中$listeners是單獨存在的,在vue3?$attrs包括class和style屬性,?vue2中?$attrs?不包含class和style屬性,這篇文章主要介紹了vue3中$attrs的變化與inheritAttrs的使用?,需要的朋友可以參考下2022-10-10
Vue+element使用row-class-name修改el-table某一行解決背景色無效的方法
本文主要介紹了Vue+element使用row-class-name修改el-table某一行解決背景色無效的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
解決echarts中橫坐標(biāo)值顯示不全(自動隱藏)問題
這篇文章主要介紹了解決echarts中橫坐標(biāo)值顯示不全(自動隱藏)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
vue在index.html中引入靜態(tài)文件不生效問題及解決方法
這篇文章主要介紹了vue在index.html中引入靜態(tài)文件不生效問題及解決方法,本文給大家分享兩種原因分析,通過實例代碼講解的非常詳細(xì) ,需要的朋友可以參考下2019-04-04

