VUE watch監(jiān)聽器的基本使用方法詳解
偵聽器一般來說是用來監(jiān)聽數(shù)據(jù)的變化,默認是在數(shù)據(jù)發(fā)生變化時執(zhí)行。
監(jiān)聽的數(shù)據(jù)名放到這里面作為函數(shù)名,這個函數(shù)里面有兩個參數(shù),一個是新值,一個是舊值。
在vue中,使用watch來響應(yīng)數(shù)據(jù)的變化,關(guān)于watch的用法大致有三種。
1、下面代碼是watch的一種簡單的用法
<div id="app"> <input type="text" v-model="firstName" /> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> var vm=new Vue({ el:"#app", data:{ firstName:"張" }, watch:{ firstName:(newVal,oldVal){ //firstName即為你想監(jiān)聽的數(shù)據(jù)的名稱,要監(jiān)聽誰函數(shù)名就用誰的 如監(jiān)聽v-model的firstName //newVal:表示改變后的值,即第一個形參,不要調(diào)換位置 //oldVal:表示改變前的值, console.log({newVal,oldVal}); // {newVal: "陳", oldVal: "張"} } //直接寫一個監(jiān)聽處理函數(shù),當(dāng)每次監(jiān)聽到cityName值發(fā)生改變時,執(zhí)行函數(shù)。 //也可以在所監(jiān)聽的數(shù)據(jù)后面直接加字符串形式的方法名:firstName: 'nameChange' }, methods:{ nameChange(){ } } }) vm.firstName = "陳";//改變監(jiān)聽的值 </script>
2、immediate 立即監(jiān)聽
使用watch基本用法時有一個特點,就是當(dāng)值第一次綁定的時候,不會執(zhí)行監(jiān)聽函數(shù),只有值發(fā)生改變才會執(zhí)行。如果我們需要在最初綁定值的時候也執(zhí)行函數(shù),則就需要用到immediate屬性。
watch: { firstName: { handler(newName, oldName) { this.fullName = newName + ' ' + this.lastName; }, { immediate: true } } }
監(jiān)聽的數(shù)據(jù)后面寫成對象形式,包含handler方法和immediate,上面簡單的寫法我們寫的函數(shù)其實就是在寫這個handler方法、默認省略而已。
3、handler方法
<div id="app"> <div> <p>Number: {{ myNumber }}</p> <p>Number: <input type="text" v-model.number="myNumber"></p> </div> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> new Vue({ el: '#app', data: { myNumber: 'Dawei' }, watch: { myNumber: { handler(newVal, oldVal) { console.log('newVal', newVal); console.log('oldVal', oldVal); }, //immediate為true時則立即觸發(fā)回調(diào)函數(shù);如果為false,則和上面的例子一樣,不會立即執(zhí)行回調(diào)。 immediate: true } } }) </script> //handler方法就是你watch中需要具體執(zhí)行的方法
4、 deep屬性
對于對象或者對象中的屬性,我們?nèi)绾伪O(jiān)聽?那么就介紹deep屬性。它的作用就是解決這個問題的關(guān)鍵。
<div id="root"> <p>obj.a: {{obj.a}}</p> <p>obj.a: <input type="text" v-model="obj.a"></p> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> new Vue({ el: '#root', data: { obj: { a: 123 } }, watch: { obj: { handler(newName, oldName) { console.log(newName, oldName); }, immediate: true, deep:true } } }) </script>
上面的代碼如果不加deep:true 那么console中就不會執(zhí)行,只執(zhí)行第一次,輸出結(jié)果為undefined
默認情況下 handler 只監(jiān)聽obj這個屬性它的引用的變化,我們只有給obj賦值的時候它才會監(jiān)聽到。
這個時候就可以使用deep深入觀察,監(jiān)聽器會一層層的往下遍歷,給對象的所有屬性都加上這個監(jiān)聽器,但是這樣消耗過大。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
解決@vue/cli安裝成功后,運行vue -V報:不是內(nèi)部或外部命令的問題
這篇文章主要介紹了解決@vue/cli安裝成功后,運行vue -V報:不是內(nèi)部或外部命令的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10VUE跨域問題Access to XMLHttpRequest at
今天發(fā)現(xiàn)一個錯誤,VUE發(fā)送請求的時候不能請求到正確數(shù)據(jù),VUE跨域問題Access to XMLHttpRequest at,本文就詳細的來介紹一下解決方法,感興趣的可以了解一下2022-05-05Vue-cli3執(zhí)行serve和build命令時nodejs內(nèi)存溢出問題及解決
這篇文章主要介紹了Vue-cli3執(zhí)行serve和build命令時nodejs內(nèi)存溢出問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01關(guān)于Vue.js一些問題和思考學(xué)習(xí)筆記(2)
這篇文章主要為大家分享了關(guān)于Vue.js一些問題和思考的學(xué)習(xí)筆記,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12