watch:{
dialogForm: {
handler(newVal, oldVal) {
console.log(newVal, oldVal)
}
}
},
使用 immediate和handler
這樣使用watch時有一個特點云挟,就是當值第一次綁定的時候郑诺,不會執(zhí)行監(jiān)聽函數港柜,只有值發(fā)生改變才會執(zhí)行吃谣。如果我們需要在最初綁定值的時候也執(zhí)行函數碰镜,則就需要用到immediate屬性。
比如當父組件向子組件動態(tài)傳值時鳖孤,子組件props首次獲取到父組件傳來的默認值時者娱,也需要執(zhí)行函數,此時就需要將immediate設為true
watch:{
dialogForm: {
handler(newVal, oldVal) {
console.log(newVal, oldVal)
},
deep: true,
immediate: true
}
},
監(jiān)聽的數據后面寫成對象形式淌铐,包含handler方法和immediate,之前我們寫的函數其實就是在寫這個handler方法蔫缸;
immediate表示在watch中首次綁定的時候腿准,是否執(zhí)行handler,值為true則表示在watch中聲明的時候拾碌,就立即執(zhí)行handler方法吐葱,值為false,則和一般使用watch一樣校翔,在數據發(fā)生變化的時候才執(zhí)行handler弟跑。
使用 deep 深度監(jiān)聽 (對象里面的屬性值發(fā)生改變)
當需要監(jiān)聽一個對象的改變時,普通的watch方法無法監(jiān)聽到對象內部屬性的改變防症,只有data中的數據才能夠監(jiān)聽到變化孟辑,此時就需要deep屬性對對象進行深度監(jiān)聽。
watch: {
cityName: {
handler(newName, oldName) { // ... },
deep: true,
immediate: true
}
設置deep: true 則可以監(jiān)聽到cityName.name的變化蔫敲,此時會給cityName的所有屬性都加上這個監(jiān)聽器饲嗽,當對象屬性較多時,每個屬性值的變化都會執(zhí)行handler奈嘿。如果只需要監(jiān)聽對象中的一個屬性值貌虾,則可以做以下優(yōu)化:使用字符串的形式監(jiān)聽對象屬性:
watch: {
'cityName.name': {
handler(newName, oldName) {
// ...
},
deep: true,
immediate: true
}
}
這樣就只會給對象的某個特定的屬性加監(jiān)聽器。
數組(一維裙犹、多維)的變化不需要通過深度監(jiān)聽尽狠,對象數組中對象的屬性變化則需要deep深度監(jiān)聽。