以下面代码为例:
<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;
创建effect后会执行入参的getter函数访问一次number.value,触发number的get从而收集watch的effset,如下图
执行到trackEffect函数把effect添加到number.dep中;现在dep数组中有两个effect,一个是更新视图的effect,一个是watch的effect
二、触发阶段
执行到triggerEffects,遍历dep把watch的effect和更新视图的effect放在queueEffectSchedulers数组中,
循环执行dep中两个effect的scheduler,绑定watch的effect.scheduler是执行watch函数第二个参数,绑定的update函数的会更新视图