vue中computed和watch


computed 計算屬性

能夠監聽vue數據上的變化,頁面上來就執行一次,每改變一次數據就又觸發。在操作數據的時候,會派生出另一個事情

1、函數形式
computed:{
    listenArr(){
    /*
    使用data中數據,自動幫你監聽數據的變化
    返回的結果就是通過改變數據 做的另一件事情(當數據變化時候需要做的事情)
    */
    }
}
2、對象形式
computed:{
    listenArr:{
        get(){
            //獲取時候
        },
        set(newVal){
            //修改時候
        }
    }
}

 

get是獲取的時候執行的操作。set是修改時候執行的操作

應用場景:

比如在用戶輸入框改變數據的時候過濾數字;

通過數據的變化,來進行累計;

通過單選按鈕的變化,來進行判斷是否全選等等

 

優點:指定看哪個數據,就只看哪個數據

PS:需要注意的是  函數名,不要和data中的數據一樣。

<div id="app">      
        全選
        <input type="checkbox" v-model="all">
        <hr>
        <input type="checkbox" v-for="(val,key) in arr" v-model="val.checked">{{arr}}
</div>
 new Vue({
        el:'#app',
        data:{
            arr:[
                {checked:true},
                {checked:false},
                {checked:false},
                {checked:true}
            ]
        },
        //當使用get和set時候,computed中定義的屬性為一個對象
        //當不使用get和set時候,computed中定義的屬性可以是一個函數
        computed:{
           /*
            all(){
                return this.arr.every(e=>e.checked);
            }
           */
            all:{
                get(){
                    //獲取的時候執行的操作
                   return this.arr.every(e=>e.checked);
                },
                set(newVal){
                    //修改時候執行的操作。其中newVal 是改變之后的結果
                    return this.arr.forEach(e=>e.checked = newVal)
                }
            }
        }
        
    });

 

watch 指定數據監聽器

當指定數據發生變化時候觸發。一開始不會觸發,只有指定的數據發生變化就又觸發一次
 
第一種寫法:
watch:{
  要監聽的數據名(新的數據,舊的數據){
  //只能監聽一層,兩層或者深層監聽不到,需要deep為true(深度監聽)
  }
}
 
第二種寫法
watch:{
  要監聽的數據名(新的數據,舊的數據){
  handler(){
     //執行的操作
  },
  deep:true
  }
}

應用場景:

監聽路由參數的變化

種localStorage的時候,深度添加等等

 <div id="app">      
       <input type="text" v-model="val">
       <ul>
           <li v-for="(val,key) in arr">
               <input type="checkbox" v-model="val.checked">
           </li>
       </ul>
       {{arr}}
 </div>
new Vue({
        el:'#app',
        data:{
            val:'hao123',
            arr:[
                {checked:true},
                {checked:false},
                {checked:false},
                {checked:false}
            ]
            
        },
        watch:{
            arr:{
                handler(v){
                    localStorage.setItem('data',JSON.stringify(v))
                },
                deep:true
            }
        }

    });
    function getStorage(name){
        //存儲到本地
        let data = localStorage.getItem(name) || '[{"checked":false},{"checked":false},{"checked":false}]';
        return  JSON.parse(data); //[] -> [{}]
    }

 

總結:computed和watch都起到監聽一個數據,並進行處理的作用 

計算屬性會根據依賴的屬性進行緩存,只有依賴的屬性發生變化,下次獲取的值才會重新計算

watch用於觀察和監聽vue實例,每當監聽的數據變化時都會執行回調進行后續操作

computed 是一個數據受多個數據影響,當進行數值計算並且依賴其他數據時應使用computed,可以利用其緩存特性 避免每次獲取值時重新計算

watch 是一個數據影響多個數據,主要用於數據變化時異步操作或者開銷較大的情況

computed在監聽數據變化時候,上來就會執行一次。而watch頁面上來是不會執行的,只有指定數據發生變化才會觸發

computed具有緩存性,值不變化會讀取緩存,watch無緩存性,值不變化也會執行

 


免責聲明!

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



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