Vue中的?watch監(jiān)聽屬性詳情
首先要確認(rèn) watch是一個對象,要當(dāng)成對象來使用。
鍵:就是那個,你要監(jiān)聽的那個家伙;
值:可以是函數(shù),當(dāng)你監(jiān)控的家伙發(fā)生變化時,需要執(zhí)行的函數(shù),這個函數(shù)有兩個形參
第一個是當(dāng)前值(新的值),第二個是更新前的值(舊值)
值也可以是函數(shù)名:不過這個函數(shù)名要用單引號來包裹。
值是包括選項(xiàng)的對象:選項(xiàng)包括有三個。
- 1.第一個
handler
:其值是一個回調(diào)函數(shù)。即監(jiān)聽到變化時應(yīng)該執(zhí)行的函數(shù)。 - 2.第二個是
deep
:其值是 true 或 false;確認(rèn)是否深入監(jiān)聽。(一般監(jiān)聽時是不能監(jiān)聽到對象屬性值的變化的,數(shù)組的值變化可以聽到。) - 3.第三個是
immediate
:其值是 true 或 false;確認(rèn)是否以當(dāng)前的初始值執(zhí)行 handler 的函數(shù)。
一.watch監(jiān)聽一般數(shù)據(jù)的變化(數(shù)值,字符串,布爾值)
舉例說明:
1.數(shù)值
在data
數(shù)據(jù)中心的num
,當(dāng)我們通過點(diǎn)擊事件讓它發(fā)生變化時,通過watch
監(jiān)聽屬性監(jiān)聽它的變化
<div id="app"> <p>{{num}}</p> <button @click="num++">點(diǎn)擊加一</button> </div> let vm = new Vue({ el:'#app', data:{ num:0 }, watch:{ // 當(dāng)前值(已經(jīng)改變的值)newval 舊值 oldval num:function(newval,oldval){ console.log("新值是:"+newval); console.log("舊值是:"+oldval); } } })
當(dāng)我們點(diǎn)擊按鈕時,查看控制臺:
注意:在watch中還有其他兩種方法
watch:{ // 當(dāng)前值(已經(jīng)改變的值)newval 舊值 oldval // num(newval,oldval){ // console.log("新值是:"+newval); // console.log("舊值是:"+oldval); // } num:{ handler(newval,oldval){ console.log("新值是:"+newval); console.log("舊值是:"+oldval); } } }
輸出結(jié)果是一致的,下面的例子統(tǒng)一使用第三種方法,也就是帶handler
的方法。
2.字符串
<div id="app"> <input type="text" v-model="mes"> <p>輸入的內(nèi)容為:{{mes}}</p> </div> let vm = new Vue({ el:'#app', data:{ mes:'' }, watch:{ mes:{ handler(newval,oldval){ console.log("新的內(nèi)容:"+newval); console.log("舊的內(nèi)容:"+oldval); } } } })
當(dāng)我們在文本框內(nèi)輸入內(nèi)容時:
查看輸出結(jié)果:
3.布爾值
<div id="app"> <p v-show="isShow">通過修改布爾值顯示和隱藏</p> <button @click="isShow = !isShow">點(diǎn)擊改變布爾值</button> </div> let vm = new Vue({ el:'#app', data:{ isShow:true }, watch:{ isShow:{ handler(newval,oldval){ console.log("新的值:"+newval); console.log("舊的值:"+oldval); } } } })
當(dāng)點(diǎn)擊按鈕切換時,查看控制臺:
二.watch 監(jiān)聽 復(fù)雜類型數(shù)據(jù)的變化
deep 屬性:深度監(jiān)聽對象變化 (代表是否深度監(jiān)聽),當(dāng)需要監(jiān)聽一個對象的改變時,普通的 watch 方法無法監(jiān)聽到對象內(nèi)部屬性的改變,此時就需要 deep 屬性對對象進(jìn)行深度監(jiān)聽。
1.對象
<div id="app"> <input type="text" v-model="mes.name"> <p>輸入的內(nèi)容是:{{mes.name}}</p> </div> let vm = new Vue({ el:'#app', data:{ mes:{name:''} }, watch: { mes:{ // watch監(jiān)聽屬性監(jiān)聽對象時新舊值時相同的 handler(newval){ console.log("新值為:"+this.mes.name); }, deep:true } } })
在文本框中輸入內(nèi)容后,查看控制臺:
也可以在對象中添加num,通過滑動桿來控制num的值,并監(jiān)聽:
<input type="range" v-model="mes.num"> data:{ mes:{name:'',num:''} }, watch: { mes:{ // watch監(jiān)聽屬性監(jiān)聽對象時新舊值時相同的 handler(newval){ console.log("num新值:"+this.mes.num); }, deep:true } }
滑動時查看輸出結(jié)果:
2.數(shù)組
<body> <div id="app"> <ul> <li v-for="(item,index) in arr">{{item}}</li> </ul> <!-- 添加一個按鈕,點(diǎn)擊時往數(shù)組中添加一個新內(nèi)容 --> <button @click="add()">點(diǎn)擊添加</button> </div> <script src="./js/vue.js"></script> <script> let vm = new Vue({ el:'#app', data:{ arr:[1,2,3,4,5] }, methods:{ add(){ // 獲取當(dāng)前數(shù)組最大值 let cont = this.arr[this.arr.length-1]; // 自增 cont++; // 向數(shù)組最后一位添加元素 this.arr.push(cont); } }, watch: { arr:{ // 監(jiān)聽數(shù)組的時候不需要深度監(jiān)聽,不需要deep handler(newval){ console.log("新數(shù)組為:"+newval); } } } }) </script> </body>
點(diǎn)擊添加元素后,查看輸出結(jié)果:
3.對象數(shù)組
<body> <div id="app"> <ul> <li v-for="item in list"> {{item.id}}--{{item.name}} </li> </ul> <!-- 定義文本框,向數(shù)組中添加新的對象 --> <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: { // 將收到的輸入內(nèi)容添加到數(shù)組中 add(){ this.list.push({id:this.id,name:this.name}); // 清除文本框的內(nèi)容 this.id=this.name='' } }, watch:{ // 注意:watch對象中監(jiān)聽的數(shù)據(jù),一定是數(shù)據(jù)中心data中已經(jīng)存在的數(shù)據(jù) // watch監(jiān)聽數(shù)組對象 新,舊值是相等,但是監(jiān)聽數(shù)組的時候,不需要 深度監(jiān)聽! list:{ handler(newval){ newval.forEach((item)=>{ console.log(item.name); }) } } } }) </script> </body>
添加新元素后查看輸出結(jié)果:
4.對象數(shù)組的屬性
<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)=>{ // 在遍歷的過程中做判斷,如果你點(diǎn)擊的id就是你當(dāng)前編輯的這一條數(shù)據(jù) 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>
點(diǎn)擊修改時,查看輸出結(jié)果:
到此這篇關(guān)于Vue中的 watch監(jiān)聽屬性詳情的文章就介紹到這了,更多相關(guān)Vue中的 watch監(jiān)聽屬性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue輸入框中輸完后光標(biāo)自動跳到下一個輸入框中的實(shí)現(xiàn)方法
最近在工作中遇到了些問題,總結(jié)下分享給同樣遇到這個問題的朋友,這篇文章主要給大家介紹了關(guān)于vue輸入框中輸完后光標(biāo)自動跳到下一個輸入框中的實(shí)現(xiàn)方法,需要的朋友可以參考下2023-03-03Vue.js基礎(chǔ)之監(jiān)聽子組件事件v-on及綁定數(shù)據(jù)v-model學(xué)習(xí)
這篇文章主要為大家介紹了Vue.js基礎(chǔ)之監(jiān)聽子組件事件v-on及綁定數(shù)據(jù)v-model學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06vue編寫的功能強(qiáng)大的swagger-ui頁面及使用方式
swagger是一種標(biāo)準(zhǔn)的數(shù)據(jù)格式的定義,對于不同語言進(jìn)行實(shí)現(xiàn)一些注解API式的東西,能快速生成這種描述restful格式的api信息的json串,本文給大家詳細(xì)介紹vue編寫的功能強(qiáng)大的swagger-ui頁面,感興趣的朋友跟隨小編一起看看吧2022-02-02Vue3+Canvas實(shí)現(xiàn)坦克大戰(zhàn)游戲(二)
本文主要給大家講解一下子彈擊中物體、物體銷毀、敵方坦克構(gòu)建生成、運(yùn)動算法、爆炸效果、以及障礙物的生成,感興趣的小伙伴可以了解一下2022-03-03解決ant design vue中樹形控件defaultExpandAll設(shè)置無效的問題
這篇文章主要介紹了解決ant design vue中樹形控件defaultExpandAll設(shè)置無效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10vue?this.$router和this.$route區(qū)別解析及路由傳參的2種方式?&&?this.$route
this.$router?相當(dāng)于一個全局的路由器對象,包含了很多屬性和對象(比如?history?對象),任何頁面都可以調(diào)用其?push(),?replace(),?go()?等方法,本文給大家介紹Vue中this.$router與this.$route的區(qū)別?及push()方法,感興趣的朋友跟隨小編一起看看吧2023-10-10