watch
用法
watch
接受三个参数
source
可以是一个getter
函数, 可以是一个ref
也可以是一个响应式对象callback
回调函数, 当source
变化时, 会重新执行callback
回调函数options
配置项, 可以配置deep
和immediate
等
ts
const count = ref(0)
watch(count, (newValue, oldValue) => {
console.log(newValue, oldValue)
})
count.value++ // 1 0
实现原理
基于doWatch
方法实现, 首先对source
进行判断,如果source
是一个对象,则需要递归这个对象,产生一个可以给ReactiveEffect
使用的getter
, 如果source
是一个函数, 则直接使用这个函数, 如果source
是一个ref
对象, 则使用ref.value
作为getter
这个getter
会作为ReactiveEffect
的fn
使用, 当getter
内数值变化时就会触发ReactiveEffect
的run
方法, 从而触发callback
回调函数
函数返回一个unWatch
方法, 这个方法会调用ReactiveEffect
的stop
方法, 从而停止监听
callback
的第三个参数是onCleanup
, 可以传入清理方法,该方法会在callback
执行前执行 用于清理资源
- Options
deep
是否深度监视, 原理: 如果传入false
递归遍历对象的时候 只会遍历一层 实现浅层监视immediate
是否立即执行一次回调函数 默认为false
原理: 执行doWatch
时 如果传入选项则会立即执行
watchEffect
用法
watchEffect
接受两个参数
effect
回调函数, 当effect
内的响应式对象变化时, 会重新执行effect
回调函数options
配置项
实现原理
也基于doWatch
实现 不过传入的getter
是effect
本身 callback
传入的是null
watchEffect
实际上是对Vueeffect
Api的一种包装? 存疑