首頁 > 軟體

Vue3中watch的使用詳解

2022-11-13 14:00:35

Vue3中watch的詳解

Vue2使用watch

<template>
  <div>總合:{{ sum }}<button @click="sum++">點選累加</button></div>
</template>
<script>
import { ref } from "vue";
export default {
  // vue2中使用watch
  watch: {
    sum: {
      deep: true,
      handler(newValue, oldValue) {
        console.log("總合 sum 變化:", newValue, oldValue);
      },
    },
  },
  setup() {
    let sum = ref(0);
    return {
      sum,
    };
  },
};
</script>

<style>
</style>

Vue3使用watch

watch有三個引數:
引數1:監聽的引數
引數2:監聽的回撥函數
引數3:監聽的設定(immediate)

情況1

監視ref所定義的一個響應式資料

<template>
  <div>總合:{{ sum }}<button @click="sum++">點選累加</button></div>
</template>
// 監視ref所定義的一個響應式資料
<script>
import { ref, watch } from "vue";
export default {
  setup() {
    let sum = ref(0);
    // 監視ref所定義的一個響應式資料
    watch(sum, (newValue, oldValue) => {
      console.log("sum ==> ", newValue, oldValue);
    });
    return {
      sum,
    };
  },
};
</script>

情況2

監視ref所定義的多個響應式資料

<template>
  <div>總合:{{ sum }}<button @click="sum++">點選累加</button></div>
  <hr />
  <div>
    msg:{{ msg }}
    <button @click="msg += '~'">改變msg</button>
  </div>
</template>
<script>
import { ref, watch } from "vue";
export default {
  setup() {
    let sum = ref(0);
    let msg = ref("watch使用"):
    // 情況2:監視ref所定義的多個響應式資料
    watch([sum, msg], (newValue, oldValue) => {
      console.log("sum/msg ==> ", newValue, oldValue);
    },{immediate:true});
    return {
      sum,
      msg,
    };
  },
};
</script>

情況3

監視reactive所定義的一個響應式資料
注意:

  • 這裡無法正確獲取oldValue
  • 強制開啟了深度監聽(deep設定不生效)
<template>
  <div>
     <h3>情況3::監視reactive所定義的一個響應式資料</h3>
      <div>姓名:{{person.name}}</div>
      <div>年齡:{{person.age}}</div>
    <button @click="person.name += '~'">修改姓名</button>
    <button @click="person.age ++">修改年齡</button>
  </div>
 </template>
<script>
import { ref, watch,reactive } from "vue";
export default {
  setup() {
    let person = reactive({
      name: "lisa",
      age: 18,
      job: {
        joblist: {
          money: 10,
        },
      },
    });
        // 情況3、監視reactive所定義的一個響應式資料
    /* 
      若watch監視的是reactive定義的響應式資料,則無法正確獲得oldvalue! 
      若watch監視的是reactive定義的響應式資料,則強制開啟了深度監視
    */
    watch(person,(newValue, oldValue) => {
        console.log("person ==> ", newValue, oldValue);
      },{immediate:true,deep:false}//這裡的deep設定不再奏效
    );
    return {
      person,
    };
  },
};
</script>

情況4

監視reactive所定義的一個響應式資料中的某個屬性

<template>
  <div>
     <h3>情況4::監視reactive所定義的一個響應式資料中的某個屬性</h3>
      <div>姓名:{{person.name}}</div>
      <div>年齡:{{person.age}}</div>
    <button @click="person.name += '~'">修改姓名</button>
    <button @click="person.age ++">修改年齡</button>
  </div>
 </template>
<script>
import { ref, watch,reactive } from "vue";
export default {
  setup() {
    let person = reactive({
      name: "lisa",
      age: 18,
      job: {
        joblist: {
          money: 10,
        },
      },
    });
    // 情況4、監視reactive所定義的一個響應式資料中的某個屬性
    watch(()=>person.name,(newValue, oldValue) => {
        console.log("person.name ==> ", newValue, oldValue);
      });

    return {
      person,
    };
  },
};
</script>

情況5

監視reactive所定義的一個響應式資料中的某些屬性

<template>
  <div>
     <h3>情況4::監視reactive所定義的一個響應式資料中的某個屬性</h3>
      <div>姓名:{{person.name}}</div>
      <div>年齡:{{person.age}}</div>
    <button @click="person.name += '~'">修改姓名</button>
    <button @click="person.age ++">修改年齡</button>
  </div>
 </template>
<script>
import { ref, watch,reactive } from "vue";
export default {
  setup() {
    let person = reactive({
      name: "lisa",
      age: 18,
      job: {
        joblist: {
          money: 10,
        },
      },
    });
    // 情況5、監視reactive所定義的一個響應式資料中的某些屬性
    watch([()=>person.name,()=>person.age],(newValue, oldValue) => {
        console.log("person.name/person.age ==> ", newValue, oldValue);
    });
    return {
      person,
    };
  },
};
</script>

特殊情況

watch監聽reactive中物件的巢狀物件

<template>
  <div>
      <div>姓名:{{person.name}}</div>
      <div>年齡:{{person.age}}</div>
      <div>薪資:{{person.job.joblist.money}} K</div>
    <button @click="person.name += '~'">修改姓名</button>
    <button @click="person.age ++">修改年齡</button>
    <button @click="person.job.joblist.money ++">提薪</button>
  </div>
 </template>
<script>
import { ref, watch,reactive } from "vue";
export default {
  setup() {
    let person = reactive({
      name: "lisa",
      age: 18,
      job: {
        joblist: {
          money: 10,
        },
      },
    });
    // 特殊情況、監視reactive所定義巢狀物件
    watch(()=>person.job,(newValue, oldValue) => {
        console.log("person.job物件發生變化 ==> ", newValue, oldValue);
    },{deep:true});//此處由於監視的是reactive素定義的物件中的某個屬性,所以deep設定有效

    return {
      person,
    };
  },
};
</script>

到此這篇關於Vue3中watch的詳解的文章就介紹到這了,更多相關Vue3 watch內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com