您好,登錄后才能下訂單哦!
小編給大家分享一下VUE中watch監(jiān)聽器怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
偵聽器一般來說是用來監(jiān)聽數(shù)據(jù)的變化,默認是在數(shù)據(jù)發(fā)生變化時執(zhí)行。
監(jiān)聽的數(shù)據(jù)名放到這里面作為函數(shù)名,這個函數(shù)里面有兩個參數(shù),一個是新值,一個是舊值。
在vue中,使用watch來響應數(shù)據(jù)的變化,關(guān)于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ù),當每次監(jiān)聽到cityName值發(fā)生改變時,執(zhí)行函數(shù)。 //也可以在所監(jiān)聽的數(shù)據(jù)后面直接加字符串形式的方法名:firstName: 'nameChange' }, methods:{ nameChange(){ } } }) vm.firstName = "陳";//改變監(jiān)聽的值 </script>
使用watch基本用法時有一個特點,就是當值第一次綁定的時候,不會執(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方法、默認省略而已。
<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í)行的方法
對于對象或者對象中的屬性,我們?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)聽器,但是這樣消耗過大。
以上是“VUE中watch監(jiān)聽器怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。