vue watch詳解


watch的詳細用法:

watch:常規用法1

<input type="text" v-model="uerName"/> data(){ return { userName:'qdleader' } }, watch:{ userName(newName, oldName) { //... } } 

也可以寫一個監聽處理函數, 當每次監聽到 cityName 值發生改變時,執行函數。也可以在所監聽的數據后面直接加字符串形式的方法名:

watch: {
    userName: 'nameChange' } } 

這樣使用watch時有一個特點,就是當值第一次綁定的時候,不會執行監聽函數,只有值發生改變才會執行。如果我們需要在最初綁定值的時候也執行函數,則就需要用到immediate屬性。

因此當我門在子組件props首次獲取父組件傳過來的默認值時候,需要立即執行一次函數,這就引出第二種immediate

2.immediate和handler

data(){ return { userName:'qdleader' } }, watch: { userName:{ handler(newName, oldName) { //.. }, immediate:true,//immediate表示在watch中首次綁定的時候,是否執行handler,值為true則表示在watch中聲明的時候,就立即執行handler方法,值為false,則和一般使用watch一樣,在數據發生變化的時候才執行handler。 } } 

3.deep

還有很多時候,我們是要監聽對象某一屬性變化的,這時候就可以用deep

data(){ return { userInfo:{ id:1, name:'qdleader' } } }, watch:{ userInfo: { handler (newName, oldName) { //... }, deep:true, immediate:true } } 

這里有個不太好的地方。雖然設置了deep:true,我們可以堅挺到userInfo.name的變化。但是此時會給userinfo的所有屬性都加上這個監聽器,當對象屬性較多時,每個屬性值的變化都會執行handler。如果只需要監聽對象中的一個屬性值,則可以做以下優化:使用字符串的形式監聽對象屬性:

watch:{
	'userInfo.name': { handler (newName, oldName) { //... }, deep:true, immediate:true } } 

同學問了,監聽對象屬性還有沒有別的方法呢?

別着急呀!

監聽對象屬性computed也可以幫幫忙的。

computed: {
  getName: function() { return this.userInfo.name } }, watch:{ getName:{ handler:function(){ //do something } } } 

//延伸。。 監聽路由變化:

watch:{
      '$route.path':function(newVal,oldVal){ //console.log(newVal+"---"+oldVal); if(newVal === '/login'){ console.log('歡迎進入登錄頁面'); } else if(newVal === '/register'){ console.log('歡迎進入注冊頁面'); } } } 或者: watch:{ $route(to,from){ console.log(to.path); } }, 

即使道路坎坷不平,車輪也要前進;即使江河波濤洶涌,船只也航行。 最后,前端有興趣的可以關注下,也可以加群,一起成長。還有https://github.com/qdleader/qdleader[https://github.com/qdleader/qdleader]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM