08. watch

2022-11-16 15:26:46发布
71

watch基本数据类型

监听单个数据例子

<script setup>
import { ref, watch } from "vue";
const num = ref(0);
watch(num, (newVal, oldVal) => {
  console.log(`num的值被修改了,新值是:${newVal},旧值是${oldVal}`);
});
</script>

监听多个数据例子

<script setup>
import { ref, watch } from "vue";

const num1 = ref(0);
const num2 = ref(0);
watch(
  [num1, num2],
  ([newNum1, newNum2], [oldNum1, oldNum2]) => {
    console.log(`num1或者num2的值被修改了,`, [newNum1, newNum2], [oldNum1, oldNum2]);
  });
</script>

监听多个数据,watch用数组的形式接收被监听的数据,回调函数的参数也是数组


watch对象类型

监听对象的某一个属性

import { ref, watch } from "vue";
const data = ref({
  num: 0,
});
watch(
  () => data.value.num, // 注意这里的差异!!!
  (newVal, oldVal) => {
    console.log(`data.num的值被修改了,新值是:${newVal},旧值是${oldVal}`);
  }
);
</script>

监听整个数据

<script setup>
import { ref, watch } from "vue";
const data = ref({
  num: 0,
});
watch(
  () => data,
  (newVal, oldVal) => {
    console.log(`data被修改了,新值是:${JSON.stringify(newVal.value)},旧值是${JSON.stringify(oldVal.value)}`);
  }, {
    deep: true
  }
);
</script>

tips:需要注意点是,监听对象里的数组是深度监听,需要添加deep

运行上面的例子会发现oldVal.value和newVal.value的值一模一样,这里需要按以下的方式处理下。

<script setup>
import { ref, watch, computed } from "vue";
const data = ref({
  num: 0,
});
const cdata = computed(() => ({
  dataNew: JSON.stringify(data.value)
}))
watch(
  () => cdata.value.dataNew,
  (newVal, oldVal) => {
    console.log(`data被修改了,新值是:${newVal},旧值是${oldVal}`);
  }, {
  deep: true
}
);
</script>

原理和vue2是一样的。vue2的处理方式看这里 http://111.230.246.226:8080/article/56


watchEffect

watchEffect是监听当前组件的所有数据,如果有某一个数据发生改变,则立即执行。

<template>
  <div>
    <p>{{ data.num }}</p>
    <button @click="add">+</button>
  </div>
</template>
<script setup>
import { ref, reactive, watchEffect } from "vue";

const data = reactive({
  num: 0,
  list: [],
});
const flag = ref(false);

const add = () => {
  data.num++;
  if (data.num > 5) {
    data.list.push(data.num);
    flag.value = true;
  }
};
watchEffect(() => {
  console.log(data.num);
  console.log(data.list);
  console.log(flag.value)
});
</script>

flag变量以及data对象中的num、list,这3个值只要发生改变,都会触发watchEffect执行回调函数。

tips:注意watchEffect会自己先调用一次