在Vue中,使用watch來(lái)響應(yīng)數(shù)據(jù)的變化搀缠。watch的用法大致有下面三種:
1. 基本用法
下面代碼是watch的一種基本用法:
<input type="text" v-model="cityName"/>
new Vue({
el: '#root',
data: {
cityName: 'shanghai'
},
watch: {
cityName(newName, oldName) {
// ...
}
}
})
直接寫一個(gè)監(jiān)聽處理函數(shù),當(dāng)每次監(jiān)聽到cityName值發(fā)生改變時(shí)割疾,執(zhí)行函數(shù)侧纯。也可以在所監(jiān)聽的數(shù)據(jù)后面直接加字符串形式的方法名:
watch: {
cityName: 'nameChange'
}
}
2. immediate和handler
使用watch基本用法時(shí)有一個(gè)特點(diǎn),就是當(dāng)值第一次綁定的時(shí)候碍讨,不會(huì)執(zhí)行監(jiān)聽函數(shù)治力,只有值發(fā)生改變才會(huì)執(zhí)行。如果我們需要在最初綁定值的時(shí)候也執(zhí)行函數(shù)勃黍,則就需要用到immediate屬性宵统。
比如當(dāng)父組件向子組件動(dòng)態(tài)傳值時(shí),子組件props首次獲取到父組件傳來(lái)的默認(rèn)值時(shí)覆获,也需要執(zhí)行函數(shù)马澈,此時(shí)就需要將immediate設(shè)為true瓢省。
new Vue({
el: '#root',
data: {
cityName: ''
},
watch: {
cityName: {
handler(newName, oldName) {
// ...
},
immediate: true
}
}
})
監(jiān)聽的數(shù)據(jù)后面寫成對(duì)象形式,包含handler方法和immediate痊班,之前我們寫的函數(shù)其實(shí)就是在寫這個(gè)handler方法勤婚。
immediate表示在watch中首次綁定的時(shí)候,是否執(zhí)行handler涤伐,值為true則表示在watch中聲明的時(shí)候馒胆,就立即執(zhí)行handler方法,值為false凝果,則和一般使用watch一樣祝迂,在數(shù)據(jù)發(fā)生變化的時(shí)候才執(zhí)行handler。
3. deep
當(dāng)需要監(jiān)聽一個(gè)對(duì)象的改變時(shí)豆村,基本的watch方法無(wú)法監(jiān)聽到對(duì)象內(nèi)部屬性的改變液兽,只有data中的數(shù)據(jù)才能夠監(jiān)聽到變化骂删,此時(shí)就需要deep屬性對(duì)對(duì)象進(jìn)行深度監(jiān)聽掌动。
watch: {
'cityName.name': {
handler(newName, oldName) {
// ...
},
deep: true,
immediate: true
}
}
這樣只會(huì)給對(duì)象的某個(gè)特定的屬性加監(jiān)聽器。數(shù)組(一維宁玫、多維)的變化不需要通過(guò)深度監(jiān)聽粗恢,對(duì)象數(shù)組中對(duì)象的屬性變化則需要deep深度監(jiān)聽。