vue2和vue3的計算屬性(computed)和偵聽器(watch)

  • computed 是vue獨有的特性計算屬性,可以對data中的值再進行一個重新的計算,computed是支持緩存的,只有依賴數(shù)據(jù)發(fā)生改變,才會重新進行計算

  • watch 我感覺就是監(jiān)聽data里面的所有屬性的新舊值的變化吧

一、計算屬性

1. vue2計算屬性
  • 變量不在 data中定義,而是定義在computed中,寫法跟寫方法一樣,有返回值。函數(shù)名直接在頁面模板中渲染,不加小括號
  • 如果是在methods里面聲明的話,在調(diào)用的時候需要加上小括號例如:fullName()
<div id="home">
  <input type="text" v-model="firstName" /><br />  //我是
  <input type="text" v-model="lastName" /><br />   //計算屬性
  <input type="text" v-model="fullName" /><br />   //我是計算屬性
</div>
 data() {
    return {
      firstName: "我是",
      lastName: "計算屬性",
    };
  },
  computed: {
    fullName() {
      return this.firstName + "" + this.lastName;
   },
 },
2. vue3 計算屬性
  • 首先需要引入,才可以進行使用
  • 和methods 最大的區(qū)別就是緩存和不可緩存
 <p>{{count}}</p>

 <p>{{double}}</p>

 <button @click="changeData">+</button>

import { computed } from "vue"

 setup(){
     const count = ref(100);
     const double = computed(()=>{
      return count.value* 2;
    })
    const add = ()=>{
      count.value ++;
    }
    return {
      count,
      double,
      add
    }
  }

一、偵聽器(watch)

1. vue2偵聽器
  • watch是一個對象所以用的時候要使用watch:
  • 有三種使用的方式
  • 第一個handler:其值是一個回調(diào)函數(shù)。即監(jiān)聽到變化時應(yīng)該執(zhí)行的函數(shù)。
  • 第二個是deep:其值是true或false;確認(rèn)是否深度監(jiān)聽。(一般監(jiān)聽時是不能監(jiān)聽到對象屬性值的變化的,數(shù)組的值變化可以監(jiān)聽到。)
  • 第三個是immediate:其值是true或false;確認(rèn)是否以當(dāng)前的初始值執(zhí)行handler的函數(shù)。
普通方式
<div>
     <p>FullName: {{fullName}}</p>
     <p>FirstName: <input type="text" v-model="firstName"></p>
</div>
data: {
    firstName: 'Dawei',
    lastName: 'Lou',
    fullName: ''
  },
  watch: {
   //普通的watch監(jiān)聽
    firstName(newName, oldName) {
      this.fullName = newName + ' ' + this.lastName;
    }
  } 
// 現(xiàn)在我們對于firstName監(jiān)聽了。在進行input框輸入的時候,就會觸發(fā)到watch,改變data中的fullName
使用handler&immediate
  • 在上面這個方法中第一次綁定watch是不會執(zhí)行的,可以使用這兩個屬性進行在第一次綁定的時候就會執(zhí)行了
firstName: {
    handler(newName, oldName) {
      this.fullName = newName + ' ' + this.lastName;
    },
    // 代表在wacth里聲明了firstName這個方法之后立即先去執(zhí)行handler方法
    immediate: true
 }
deep進行深度監(jiān)聽
  • watch 監(jiān)聽的時候會返回一個obj新的obj對象和改變前的obj對象
  <p>obj.a: {{ obj.a }}</p>
  <p>obj.a: <input type="text" v-model="obj.a" /></p>
data() {
    return {
      obj: {
        a: 123,
      },
    };
  },
  watch: {
    obj: {
      handler(newName, oldName) {
        console.log(newName, oldName);
      },
      immediate: true,
      deep: true,
    },
  },
2. vue3偵聽器
  • watch(指定監(jiān)聽數(shù)據(jù)) 如果監(jiān)聽reactive屬性,必須使用函數(shù)來指定,監(jiān)聽多個數(shù)據(jù)的話,需要卸載數(shù)組里面
  • watchEffect(不指定監(jiān)聽數(shù)據(jù)) 默認(rèn)初始化執(zhí)行一次
  • watch和watchEffect都是需要引入的
watch

import { watch } from "vue"

  • 普通數(shù)據(jù)類型
 setup() {
    let msg = ref("abc");
    watch(msg, (newVal, oldVal) => {
      console.log(newVal, oldVal);
    });
    return {
      msg,
    };
  }, 
  • reactive 數(shù)據(jù)類型,通過函數(shù)來指定
setup() {
    let user = reactive({
      firstName: "zhang",
      lastName: "san",
    });
    watch(() => user.firstName,(newVal,oldVal) => {
      console.log(newVal,oldVal);
    })
    return {
      user,
    };
  }
  • 監(jiān)聽多個數(shù)據(jù)需要數(shù)組來指定,watch返回的也是一個數(shù)組
setup() {
    let user = reactive({
      firstName: "zhang",
      lastName: "san",
    });
    watch(
      [() => user.firstName,() => user.lastName],
      (newVal, oldVal) => {
        console.log(newVal, oldVal);
      }
    );
    return {
      user,
    };
  },
  • 立即執(zhí)行 添加immediate 還有深度監(jiān)聽在immediate后面加上deep:true 就可以
    setup() {
    let user = reactive({
    firstName: "zhang",
    lastName: "san",
    });
    let fullName = ref(""); //在聲明的時候是一個空,如果初始化不執(zhí)行他還是一個空
    watch([() => user.firstName, () => user.lastName], (newVal, oldVal) => {
    fullName.value = newVal[0] +' '+ newVal[1]
    },{
    immediate:true,
    //deep:true
    });
    return {
    user,
    fullName
    };
    },
watchEffect 初始化執(zhí)行一次
  • 不用指定監(jiān)聽的普通數(shù)據(jù)類型或者是復(fù)雜數(shù)據(jù)類型,像下面這個案例就是默認(rèn)監(jiān)聽了 user.firstName和user.lastName,個人感覺watchEffect比watch好用點吧

import { watchEffect } from "vue"

watchEffect(() => {
    fullName.value = user.firstName+" "+user.lastName
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容