91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue 中的computed和watch的區別是怎樣的

發布時間:2021-09-26 09:49:56 來源:億速云 閱讀:217 作者:柒染 欄目:開發技術

本篇文章為大家展示了Vue 中的computed和watch的區別是怎樣的,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

    一、computed介紹

    computed 用來監控自己定義的變量,該變量在 data 內沒有聲明,直接在 computed 里面定義,頁面上可直接使用。

    //基礎使用
    {{msg}}
    <input v-model="name" /> 
      
     //計算屬性 
    computed:{
     msg:function(){
      return this.name
     }
    }

    在輸入框中,改變 name 值得時候,msg 也會跟著改變。這是因為 computed 監聽自己的屬性 msg,發現 name 一旦變動,msg 立馬會更新。

    注意:msg 不可在 data 中定義,否則會報錯。

    1.1、get 和 set 用法

    <input v-model="full" ><br>
    <input v-model="first" > <br>
    <input v-model="second" > 
    
    data(){
     return{
      first:'美女',
      second:'姐姐'
     }
    },
    computed:{
     full:{
      get(){ //回調函數 當需要讀取當前屬性值是執行,根據相關數據計算并返回當前屬性的值
       return this.first + ' ' + this.second
       },
       set(val){ //監視當前屬性值的變化,當屬性值發生變化時執行,更新相關的屬性數據
        let names = val.split(' ')
        this.first = names[0]
        this.second = names[1]
      }
     }
    }

    get 方法:first second 改變時,會調用 get 方法,更新 full 的值。

    set 方法:修改 full 的值時,會調用 set 方法,val full 的最新值。

     1.2、計算屬性緩存

    我們通過方法,拼接數據,也可以實現該效果,代碼如下。

    <div> {{ full() }} </div>
      
    data(){
     return{
      first:'美女',
      second:'姐姐'
     }
    },
    methods:{
     full(){
     return this.first + ' ' + this.second
     }
    },

    一個頁面內,數據有可能多次使用,我們把 computed method 兩個方法放一起實現,并把這個數據在頁面內多次引用,試看以下效果。

    <div>
      computed計算值:
      {{full}} {{full}} {{full}} {{full}}
    </div>
    
    <div>
      methods計算值:
      {{fullt}} {{fullt}} {{fullt}} {{fullt}}
    </div>
    
    data(){
     return{
      first:'美女',
      second:'姐姐'
     }
    },
    computed:{
     full:function(){
      console.log('computed')
      return this.first + ' ' + this.second
     }
    },
    methods:{
     fullt(){
      console.log('方法')
      return this.first + ' ' + this.second
     }
     }

    運行結果為:

    Vue 中的computed和watch的區別是怎樣的

    根據結果,我們不難發現,根據方法獲取到的數據,使用幾次就需要重新計算幾次,但計算屬性不是,而是基于它們的響應式依賴進行緩存的,之后依賴屬性值發生改變的時候,才會重新計算。由于它計算次數少,所以性能更高些。

    二、watch介紹

    watch 是監測 Vue 實例上的數據變動,通俗地講,就是檢測 data 內聲明的數據。不僅可以監測簡單數據,還可以監測對象或對象屬性。

    Demo1:監測簡單數據

    <input v-model="first" > <br>
      
    data(){
     return{
      first:'美女',
      }
     },
    watch:{
     first( newVal , oldVal ){
     console.log('newVal',newVal) // first 的最新值
     console.log('oldVal',oldVal) // first上一個值
     }
    },
    // 修改 first的值的時候,立馬會打印最新值

     Demo2:監測對象

    監聽對象的時候,需要使用深度監聽。

    <input v-model="per.name">
      
    data(){
     return{
      per:{
       name:'倩倩',
       age:'18'
       }
      }
     },
    watch:{
     per:{
      handler(oldVal,newVal){
       console.log('newVal',newVal)
       console.log('oldVal',oldVal)
      },
      deep:true,
     }
    },

    修改 per.name 的時候,發現 newVal oldVal 的值是一樣的,是因為他們存儲的指針指向的是同一個地方,所以深度監聽雖然可以監聽到對象的變化,但是無法監聽到具體的是哪個屬性發生變化了。

    Demo3:監聽對象的單個屬性

    // 方法1:直接引用對象的屬性
    <input v-model="per.name">
      
    data(){
     return{
      per:{
       name:'倩倩',
       age:'18'
       }
      }
     },
    watch:{
     'per.name':function(newVal,oldVal){
       console.log('newVal->',newVal)
       console.log('oldVal->',oldVal)
      }
    },

    也可以借助 computed 作為中間轉換,如下:

    // 方法2:借助computed
    <input v-model="per.name">
      
    data(){
     return{
      per:{
       name:'倩倩',
       age:'18'
       }
      }
     },
    watch:{
     perName(){
      console.log('name改變了')
      }
    },
    computed:{
     perName:function(){
      return this.per.name
     }
    },

    Demo4:監聽 props 組件傳過來的值

    props:{
     mm:String
    },
    //不使用 immediate
    watch:{
     mm(newV,oldV){
       console.log('newV',newV)
       console.log('oldV',oldV)
     }
    }
    
    //使用 immediate
    watch:{
     mm:{
      immediate:true,
      handler(newV,oldV){
       console.log('newV',newV)
       console.log('oldV',oldV)
      }
    }

    不使用 immediate 時,第一次加載頁面時,watch 監聽的 mm 中的打印并沒有執行。

    使用 immediate 時,第一次加載時也會打印結果:newV 11 oldV undefined

    immediate 主要作用就是組件加載時,會立即觸發回調函數。

    三、兩者區別

    3.1、對于 computed

    • computed 監控的數據在 data 中沒有聲明

    • computed 不支持異步,當 computed 中有異步操作時,無法監聽數據的變化

    • computed 具有緩存,頁面重新渲染,值不變時,會直接返回之前的計算結果,不會重新計算

    • 如果一個屬性是由其他屬性計算而來的,這個屬性依賴其他屬性,一般使用 computed

    • computed 計算屬性值是函數時,默認使用get方法。如果屬性值是屬性值時,屬性有一個getset方法,當數據發生變化時會調用set方法

    computed:{
     //屬性值為函數
     perName:function(){
      return this.per.name
     },
     //屬性值為屬性值
     full:{
      get(){  },
      set(val){  }
     }
    },

    3.2、對于 watch

    • 監測的數據必須在 data 中聲明或 props 中數據

    • 支持異步操作

    • 沒有緩存,頁面重新渲染時,值不改變時也會執行

    • 當一個屬性值發生變化時,就需要執行相應的操作

    • 監聽數據發生變化時,會觸發其他操作,函數有兩個參數:

    immediate :組件加載立即觸發回調函數
    deep:深度監聽,主要針對復雜數據,如監聽對象時,添加深度監聽,任意的屬性值改變都會觸發。
    注意:對象添加深度監聽之后,輸出的新舊值是一樣的。

    computed 頁面重新渲染時,不會重復計算,而 watch 會重新計算,所以 computed 性能更高些。

    四、應用場景

    當需要進行數值計算,并且依賴于其它數據時,應該使用 computed ,因為可以利用 computed 的緩存特性,避免每次獲取值時都要重新計算。

    當需要在數據變化時執行異步操作或開銷較大的操作時,應該使用 watchcomputed 不支持異步。如果需要限制執行操作的頻率,可借助 computed 作為中間狀態。

    上述內容就是Vue 中的computed和watch的區別是怎樣的,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    张家口市| 钦州市| 盐亭县| 金沙县| 丰原市| 满城县| 西青区| 武胜县| 宜章县| 宁德市| 徐水县| 长治县| 拉萨市| 讷河市| 轮台县| 田阳县| 朝阳市| 子洲县| 开鲁县| 小金县| 高邑县| 靖江市| 田阳县| 积石山| 台中县| 夏津县| 夏邑县| 固原市| 柳林县| 虹口区| 扎赉特旗| 金溪县| 文登市| 石狮市| 罗田县| 浦县| 龙游县| 滦南县| 来宾市| 大竹县| 凉城县|