watch 的作用可以監(jiān)控一個(gè)值的變換,并調(diào)用因?yàn)樽兓枰獔?zhí)行的方法??梢酝ㄟ^watch動(dòng)態(tài)改變關(guān)聯(lián)的狀態(tài),通常有三種寫法寫法。
第一種: 普通用法
export default {
data: {
testName: 'testNameTxt'
},
watch: {
testName(newName, oldName) {
// ... do something
this.nameChange();
}
},
methods:{
nameChange(){
// ... do something
}
}
}
直接寫一個(gè)監(jiān)聽處理函數(shù),當(dāng)每次監(jiān)聽到 cityName 值發(fā)生改變時(shí),執(zhí)行函數(shù)。
也可以在所監(jiān)聽的數(shù)據(jù)后面直接加字符串形式的方法名:
export default {
data: {
testName: 'testNameTxt'
},
watch: {
testName: 'nameChange'
},
methods:{
nameChange(){
// ... do something
}
}
}
第二種: immediate 和 handler
如第一種使用 watch 時(shí)有一個(gè)特點(diǎn) : 當(dāng)值第一次綁定的時(shí)候,不會(huì)執(zhí)行監(jiān)聽函數(shù),只有值發(fā)生改變才會(huì)執(zhí)行。
如果我們需要在最初綁定值的時(shí)候也執(zhí)行函數(shù),又該怎么辦呢 ?
這時(shí)就需要用到 immediate 屬性。
舉個(gè)栗子
比如當(dāng)父組件向子組件動(dòng)態(tài)傳值時(shí),子組件props首次獲取到父組件傳來的默認(rèn)值時(shí),也需要執(zhí)行函數(shù),此時(shí)需要將 immediate 設(shè)為 true 即可。
export default {
data: {
testName: 'testNameTxt'
},
watch: {
testNam{
handler(newName, oldName) {
// ... do something
this.nameChange();
},
immediate: true
}
},
methods:{
nameChange(){
// ... do something
}
}
}
監(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。
讓 handler 指向 methods 中的方法
watch: {
studen: {
handler: 'sayHello',
immediate: true // 創(chuàng)建組件后立即執(zhí)行一次
}
},
methods: {
sayHello() {
console.log(this.studen)
}
}
觸發(fā)多個(gè)監(jiān)聽方法,使用數(shù)組可以設(shè)置多項(xiàng),形式包括字符串、函數(shù)、對(duì)象
watch: {
name: [
'sayHello1',
function(newVal, oldVal) {
// ...
},
{
handler: 'sayHello2',
immaediate: true
}
]
},
methods: {
sayHello1() {
console.log('sayHello1==>', this.name)
},
sayHello2() {
console.log('sayHello2==>', this.name)
}
}
第三種: deep 深度監(jiān)聽
當(dāng)需要監(jiān)聽一個(gè)對(duì)象的改變時(shí),普通的 watch 方法無法監(jiān)聽到對(duì)象內(nèi)部屬性的改變,只有 data 中的數(shù)據(jù)才能夠監(jiān)聽到變化,此時(shí)就需要deep屬性對(duì)對(duì)象進(jìn)行深度監(jiān)聽。
export default {
data: {
testObj: {name:'test', age:18}
},
watch: {
testObj: {
handler(newName, oldName){
// ... do something
this.nameChange();
},
deep: true,
immediate: true
}
},
methods:{
nameChange(){
// ... do something
}
}
}
設(shè)置 deep: true 則可以監(jiān)聽到 testObj.name 的變化,此時(shí)會(huì)給 testObj 的所有屬性都加上這個(gè)監(jiān)聽器,當(dāng)對(duì)象屬性較多時(shí),每個(gè)屬性值的變化都會(huì)執(zhí)行 handler。
如果只需要監(jiān)聽對(duì)象中的一個(gè)屬性值,還可以這樣寫(使用字符串的形式監(jiān)聽對(duì)象屬性):
export default {
data: {
testObj: {name:'test', age:18}
},
watch: {
'testObj.name': {
handler(newName, oldName){
// ... do something
this.nameChange();
},
deep: true,
immediate: true
}
},
methods:{
nameChange(){
// ... do something
}
}
}
好啦, watch的三種使用方法到這就結(jié)束了, 希望能幫助到你呦, 歡迎點(diǎn)贊, 留言~