Vue3源码:watch

54 阅读1分钟

以下面代码为例:

<script setup>
import {ref, reactive, computed, watch} from "vue";
function changeNumber() {
  number.value++
}
let number = ref(100);
watch(number, (newV, oldV) => {
  console.log(`${newV}---${oldV}`);
})
</script>

<template>
  <div @click="changeNumber">
    {{ number }}
  </div>
</template>

一、定义阶段、收集阶段

watch也会创建ReactiveEffect实例effect,这里source即通过ref定义的number;
image.png 创建effect后会执行入参的getter函数访问一次number.value,触发number的get从而收集watch的effset,如下图 执行到trackEffect函数把effect添加到number.dep中;现在dep数组中有两个effect,一个是更新视图的effect,一个是watch的effect image.png

二、触发阶段

执行到triggerEffects,遍历dep把watch的effect和更新视图的effect放在queueEffectSchedulers数组中, image.png

循环执行dep中两个effect的scheduler,绑定watch的effect.scheduler是执行watch函数第二个参数,绑定的update函数的会更新视图 image.png