中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

computed與watch在Vue中有什么不同

發布時間:2020-12-19 16:51:22 來源:億速云 閱讀:222 作者:Leah 欄目:開發技術

computed與watch在Vue中有什么不同?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

計算屬性computed:

  • 支持緩存,只有依賴數據發生改變,才會重新進行計算

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

  • computed 屬性值會默認走緩存,計算屬性是基于它們的響應式依賴進行緩存的,也就是基于data中聲明過或者父組件傳遞的props中的數據通過計算得到的值

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

  • 如果computed屬性屬性值是函數,那么默認會走get方法;函數的返回值就是屬性的屬性值;在computed中的,屬性都有一個get和一個set方法,當數據變化時,調用set方法。

var vm = new Vue({
 el: '#app',
 data: {
  message: 'hello'
 },
 template: `
 <div> <p>我是原始值: "{{ message }}"</p> <p>我是計算屬性的值: "{{ computedMessage}}"</p> // computed 在 DOM 里直接使用不需要調用 </div> `,
 computed: {
  // 計算屬性的 getter   computedMessage: function () {
   // `this` 指向 vm 實例    return this.message.split('').reverse().join('')
  }
 }
})

結果:

我是原始值: "Hello"
我是計算屬性的值: "olleH"

如果不使用計算屬性,那么 message.split('').reverse().join('') 就會直接寫到 template 里,那么在模版中放入太多聲明式的邏輯會讓模板本身過重,尤其當在頁面中使用大量復雜的邏輯表達式處理數據時,會對頁面的可維護性造成很大的影響

而且計算屬性如果依賴不變的話,它就會變成緩存,computed 的值就不會重新計算

所以,如果數據要通過復雜邏輯來得出結果,那么就推薦使用計算屬性

偵聽屬性watch

  • 不支持緩存,數據變,直接會觸發相應的操作。

  • watch支持異步;監聽的函數接收兩個參數,第一個參數是最新的值;第二個參數是輸入之前的值;

  • 當一個屬性發生變化時,需要執行對應的操作;一對多;

  • 監聽數據必須是data中聲明過或者父組件傳遞過來的props中的數據,當數據變化時,觸發其他操作,函數有兩個參數:

new Vue({
 data: {
  n: 0,
  obj: {
   a: "a"
  }
 },
 template: `
 <div> <button @click="n += 1">n+1</button> <button @click="obj.a += 'hi'">obj.a + 'hi'</button> <button @click="obj = {a:'a'}">obj = 新對象</button> </div> `,
 watch: {
  n() {
   console.log("n 變了");
  },
  obj:{
   handler: function (val, oldVal) { 
   console.log("obj 變了")
  },
   deep: true // 該屬性設定在任何被偵聽的對象的 property 改變時都要執行 handler 的回調,不論其被嵌套多深   },
  "obj.a":{
   handler: function (val, oldVal) { 
   console.log("obj.a 變了")
  },
   immediate: true // 該屬性設定該回調將會在偵聽開始之后被立即調用   }
 }
}).$mount("#app");

不應該使用箭頭函數來定義 watcher 函數,因為箭頭函數沒有 this,它的 this 會繼承它的父級函數,但是它的父級函數是 window,導致箭頭函數的 this 指向 window,而不是 Vue 實例

  • deep 控制是否要看這個對象里面的屬性變化

  • immediate 控制是否在第一次渲染是執行這個函數

vm.$watch() 的用法和 watch 回調類似

  • vm.$watch('data屬性名', fn, {deep: .., immediate: ..})

vm.$watch("n", function(val, newVal){
   console.log("n 變了");
},{deep: true, immediate: true})

總結

  • 如果一個數據需要經過復雜計算就用 computed

  • 如果一個數據需要被監聽并且對數據做一些操作就用 watch

關于computed與watch在Vue中有什么不同問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

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

AI

边坝县| 奉化市| 潜江市| 三明市| 平塘县| 灵宝市| 宁陵县| 平武县| 福安市| 贵德县| 永新县| 武山县| 光泽县| 景谷| 扶绥县| 石景山区| 威远县| 长治县| 仁寿县| 称多县| 宜春市| 浦县| 鹤山市| 宝丰县| 长沙市| 华容县| 墨脱县| 泽州县| 临泽县| 彭州市| 广汉市| 来安县| 肇州县| 西和县| 马山县| 上栗县| 开原市| 南皮县| 延安市| 郧西县| 霍州市|