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

溫馨提示×

溫馨提示×

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

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

Vue中的computed和watch的區別是什么

發布時間:2021-12-07 19:48:56 來源:億速云 閱讀:150 作者:柒染 欄目:編程語言

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

下面帶大家認識Vue中的computed 和 watch,介紹一下computed 和 watch的區別。

一、computed

1、用途:被計算出來的屬性就是計算屬性

2、計算屬性的好處:它可以讓一些是根據其他屬性計算而來的屬性變成一個屬性

computed有一個依賴緩存,如果computed的依賴屬性沒有變化,那么computed就不會重新計算。如果一個數據依賴于其他數據,那么把這個數據設計為 computed。

示例(用戶名展示):

Vue.config.productionTip = false;

new Vue({
  data: {
    user: {
      email: "jade@qq.com",
      nickname: "jade",
      phone: "18810661088"
    }
  },
  computed: {
    displayName: {
      get() {
        const user = this.user;
        return user.nickname || user.email || user.phone;
      },
      set(value) {
        console.log(value);
        this.user.nickname = value;
      }
    }
  },
  // DRY don't repeat yourself
  // 不如用 computed 來計算 displayName
  template: `
    <div>
      {{displayName}}
      <div>
      {{displayName}}
      <button @click="add">set</button>
      </div>
    </div>
  `,
  methods: {
    add() {
      console.log("add");
      this.displayName = "圓圓";
    }
  }
}).$mount("#app");

3、緩存: 如果依賴的屬性沒有變化,就不會重新計算getter/setter默認不會做緩存,Vue做了特殊處理

如何緩存?可以參考以下示例:

二、watch(監聽/偵聽)

1、用途:當數據變化時,執行一個函數,watch是完美實現歷史功能的一個函數(方法)

示例(撤銷)

import Vue from "vue/dist/vue.js";

Vue.config.productionTip = false;

new Vue({
  data: {
    n: 0,
    history: [],
    inUndoMode: false
  },
  watch: {
    n: function(newValue, oldValue) {
      console.log(this.inUndoMode);
      if (!this.inUndoMode) {
        this.history.push({ from: oldValue, to: newValue });
      }
    }
  },
  // 不如用 computed 來計算 displayName
  template: `
    <div>
      {{n}}
      <hr />
      <button @click="add1">+1</button>
      <button @click="add2">+2</button>
      <button @click="minus1">-1</button>
      <button @click="minus2">-2</button>
      <hr/>
      <button @click="undo">撤銷</button>
      <hr/>

      {{history}}
    </div>
  `,
  methods: {
    add1() {
      this.n += 1;
    },
    add2() {
      this.n += 2;
    },
    minus1() {
      this.n -= 1;
    },
    minus2() {
      this.n -= 2;
    },
    undo() {
      const last = this.history.pop();
      this.inUndoMode = true;
      console.log("ha" + this.inUndoMode);
      const old = last.from;
      this.n = old; // watch n 的函數會異步調用
      this.$nextTick(() => {
        this.inUndoMode = false;
      });
    }
  }
}).$mount("#app");

加了immediate: true ,一次渲染的時候會觸發watch

Vue.config.productionTip = false;

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(){
        console.log("obj 變了");
      },
      deep:true
    },
    "obj.a": function() {
      console.log("obj.a 變了");
    }
  }
}).$mount("#app");
  • 語法1:

Vue中的computed和watch的區別是什么

上面箭頭函數的外層的函數是全局作用域,全局作用域的this就是全局對象window/global,所以你無法在這里獲取this.n/this.xxx,所以,watch里面是絕對不能使用箭頭函數的

  • 語法2:

vm.$watch('xxx',fn,{deep:...,immediate:...})

watch前面加$這樣的寫法是為了避免和一個叫watch的data名重復

2、deep:true是干什么的?

如果object.a變了,請問object算不算也變了 如果需要答案是【也變了】,就用deep:true如果需要答案是【沒有變】,就用deep:false

deep就是往不往里面去看,去深入的看,true就是深入進入看,默認是false(只看表層的地址)。

不光要比較obj的地址,而且要比較里面任何一個數據變了,都要認為是obj變了。

三、總結

  • computed:就是計算屬性的意思

  • watch:就是監聽的意思

  • watch 支持異步代碼而computed不行

computed這個值在調用的時候,不需要加括號,它會根據依賴自動緩存,就是說如果依賴不變,這個computed的值就不會重新再計算。

watch它有兩個選項,第一個是immediate,表示在第一次執行時要渲染這個函數;另一個是deep,意思是如果我們要監聽一個對象,是否要看它里面屬性的變化。

  • 如果一個數據依賴于其他數據,那么把這個數據設計為computed;

  • 如果你需要在某個數據變化時做一些事情,使用watch來觀察這個數據的變化。

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

向AI問一下細節

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

AI

武平县| 大名县| 汕尾市| 长岛县| 聂荣县| 梅河口市| 怀来县| 灯塔市| 道真| 两当县| 江油市| 宿州市| 涞水县| 全州县| 全椒县| 镇巴县| 枣阳市| 呼和浩特市| 萍乡市| 都兰县| 大宁县| 福清市| 田阳县| 昌黎县| 嘉善县| 宜宾市| 林周县| 八宿县| 城固县| 勐海县| 米脂县| 张家界市| 合作市| 都江堰市| 平江县| 大冶市| 五常市| 墨竹工卡县| 开阳县| 凤阳县| 富平县|