在vue中,使用watch來響應數據的變化。watch的用法大致有三種。下面代碼是watch的一種簡單的用法:
普通用法:
<template> //視圖 <input v-model="username" v-on="changeVal" placeholder="用戶名"><span>dsfsf</span></input> </template> <script> export default { data() { return { username:''; } }, methods: { changeVal(e){ this.loginForm.username=e; } }, watch: { username(newValue){ console.log(newValue)//監聽username的變化,這種寫法,默認第一次不執行該函數 } } } </script>
靈活用法:immediate和handler結合使用
解析:
這樣使用watch時有一個特點,就是當值第一次綁定的時候,不會執行監聽函數,只有值發生改變才會執行。如果我們需要在最初綁定值的時候也執行函數,則就需要用到immediate屬性。
比如當父組件向子組件動態傳值時,子組件props首次獲取到父組件傳來的默認值時,也需要執行函數,此時就需要將immediate設為true。
代碼如下:
<template> //視圖 <input v-model="username" v-on="changeVal" placeholder="用戶名"><span>dsfsf</span></input> </template> <script> export default { data() { return { username:''; } }, methods: { changeVal(e){ this.loginForm.username=e; } }, watch: { username:{ handler(newName){ console.log(newName);/ } }, immediate:true } } </script>
監聽的數據后面寫成對象形式,包含handler方法和immediate,之前我們寫的函數其實就是在寫這個handler方法;
immediate表示在watch中首次綁定的時候,是否執行handler,值為true則表示在watch中聲明的時候,就立即執行handler方法,值為false,則和一般使用watch一樣,在數據發生變化的時候才執行handler。
wacth檢測對象屬性數據:deep深度監測
當需要監聽一個對象的改變時,普通的watch方法無法監聽到對象內部屬性的改變,只有data中的數據才能夠監聽到變化,此時就需要deep屬性對對象進行深度監聽。
<template> //視圖 <input v-model="person.username" v-on="changeVal" placeholder="用戶名"><span>dsfsf</span></input> </template> <script> export default { data() { return { person:{ username:'' } } }, methods: { changeVal(e){ this.loginForm.username=e; } }, watch: { 'person.username':{ handler(newName){ console.log(newName);/ } }, immediate:true, deep:true } } </script>
設置deep: true 則可以監聽到cityName.name的變化,此時會給cityName的所有屬性都加上這個監聽器,當對象屬性較多時,每個屬性值的變化都會執行handler,上面的寫法是精准監聽username的變化;
改文到這里就結束了,感謝查閱;