您好,登錄后才能下訂單哦!
這篇文章主要介紹了Vue中如何watch監聽屬性,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
首先要確認 watch是一個對象,要當成對象來使用。
鍵:就是那個,你要監聽的那個家伙;
值:可以是函數,當你監控的家伙發生變化時,需要執行的函數,這個函數有兩個形參
第一個是當前值(新的值),第二個是更新前的值(舊值)
值也可以是函數名:不過這個函數名要用單引號來包裹。
值是包括選項的對象:選項包括有三個。
1.第一個 handler
:其值是一個回調函數。即監聽到變化時應該執行的函數。
2.第二個是 deep
:其值是 true 或 false;確認是否深入監聽。(一般監聽時是不能監聽到對象屬性值的變化的,數組的值變化可以聽到。)
3.第三個是 immediate
:其值是 true 或 false;確認是否以當前的初始值執行 handler 的函數。
舉例說明:
在data
數據中心的num
,當我們通過點擊事件讓它發生變化時,通過watch
監聽屬性監聽它的變化
<div id="app"> <p>{{num}}</p> <button @click="num++">點擊加一</button> </div> let vm = new Vue({ el:'#app', data:{ num:0 }, watch:{ // 當前值(已經改變的值)newval 舊值 oldval num:function(newval,oldval){ console.log("新值是:"+newval); console.log("舊值是:"+oldval); } } })
當我們點擊按鈕時,查看控制臺:
注意:在watch中還有其他兩種方法
watch:{ // 當前值(已經改變的值)newval 舊值 oldval // num(newval,oldval){ // console.log("新值是:"+newval); // console.log("舊值是:"+oldval); // } num:{ handler(newval,oldval){ console.log("新值是:"+newval); console.log("舊值是:"+oldval); } } }
輸出結果是一致的,下面的例子統一使用第三種方法,也就是帶handler
的方法。
<div id="app"> <input type="text" v-model="mes"> <p>輸入的內容為:{{mes}}</p> </div> let vm = new Vue({ el:'#app', data:{ mes:'' }, watch:{ mes:{ handler(newval,oldval){ console.log("新的內容:"+newval); console.log("舊的內容:"+oldval); } } } })
當我們在文本框內輸入內容時:
查看輸出結果:
<div id="app"> <p v-show="isShow">通過修改布爾值顯示和隱藏</p> <button @click="isShow = !isShow">點擊改變布爾值</button> </div> let vm = new Vue({ el:'#app', data:{ isShow:true }, watch:{ isShow:{ handler(newval,oldval){ console.log("新的值:"+newval); console.log("舊的值:"+oldval); } } } })
當點擊按鈕切換時,查看控制臺:
deep 屬性:深度監聽對象變化 (代表是否深度監聽),當需要監聽一個對象的改變時,普通的 watch 方法無法監聽到對象內部屬性的改變,此時就需要 deep 屬性對對象進行深度監聽。
<div id="app"> <input type="text" v-model="mes.name"> <p>輸入的內容是:{{mes.name}}</p> </div> let vm = new Vue({ el:'#app', data:{ mes:{name:''} }, watch: { mes:{ // watch監聽屬性監聽對象時新舊值時相同的 handler(newval){ console.log("新值為:"+this.mes.name); }, deep:true } } })
在文本框中輸入內容后,查看控制臺:
也可以在對象中添加num,通過滑動桿來控制num的值,并監聽:
<input type="range" v-model="mes.num"> data:{ mes:{name:'',num:''} }, watch: { mes:{ // watch監聽屬性監聽對象時新舊值時相同的 handler(newval){ console.log("num新值:"+this.mes.num); }, deep:true } }
滑動時查看輸出結果:
<body> <div id="app"> <ul> <li v-for="(item,index) in arr">{{item}}</li> </ul> <!-- 添加一個按鈕,點擊時往數組中添加一個新內容 --> <button @click="add()">點擊添加</button> </div> <script src="./js/vue.js"></script> <script> let vm = new Vue({ el:'#app', data:{ arr:[1,2,3,4,5] }, methods:{ add(){ // 獲取當前數組最大值 let cont = this.arr[this.arr.length-1]; // 自增 cont++; // 向數組最后一位添加元素 this.arr.push(cont); } }, watch: { arr:{ // 監聽數組的時候不需要深度監聽,不需要deep handler(newval){ console.log("新數組為:"+newval); } } } }) </script> </body>
點擊添加元素后,查看輸出結果:
<body> <div id="app"> <ul> <li v-for="item in list"> {{item.id}}--{{item.name}} </li> </ul> <!-- 定義文本框,向數組中添加新的對象 --> <input type="text" v-model="id"> <input type="text" v-model="name"> <button @click="add()">添加</button> </div> <script src="./js/vue.js"></script> <script> let vm = new Vue({ el:'#app', data:{ list:[ {id:1,name:"哇哈"}, {id:2,name:"哇哈哈"}, {id:3,name:"哇哈哈哈"} ], id:"", name:'' }, methods: { // 將收到的輸入內容添加到數組中 add(){ this.list.push({id:this.id,name:this.name}); // 清除文本框的內容 this.id=this.name='' } }, watch:{ // 注意:watch對象中監聽的數據,一定是數據中心data中已經存在的數據 // watch監聽數組對象 新,舊值是相等,但是監聽數組的時候,不需要 深度監聽! list:{ handler(newval){ newval.forEach((item)=>{ console.log(item.name); }) } } } }) </script> </body>
添加新元素后查看輸出結果:
<body> <div id="app"> <ul> <li v-for="x in list"> {{x.id}}---{{x.name}}   <button @click="mod(x.id)">修改</button> </li> </ul> </div> <script src="./js/vue.js"></script> <script> let vm = new Vue({ el:'#app', data:{ list:[ {id:1,name:'ww'}, {id:2,name:'ee'}, {id:3,name:'qq'} ], }, methods: { mod(id,name){ this.list.forEach((item)=>{ // 在遍歷的過程中做判斷,如果你點擊的id就是你當前編輯的這一條數據 if(item.id == id){ item.name = "老鐵" console.log(item); } }) } }, watch: { list:{ handler(x,y){ x.forEach((element)=>{ console.log(element.name); }) }, deep:true } } }) </script> </body>
點擊修改時,查看輸出結果:
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Vue中如何watch監聽屬性”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。