1.watch和watchEffect
这两都是直接调用doWatch方法,唯一区别就是第二个参数不同。
export function watchEffect(
effect: WatchEffect,
options?: WatchOptionsBase
): WatchStopHandle {
return doWatch(effect, null, options)
}
export function watch<T = any>(
source: WatchSource<T> | WatchSource<T>[],
cb: WatchCallback<T>,
options?: WatchOptions
): WatchStopHandle {
// 省略参数校验
return doWatch(source, cb, options)
}
2.doWatch
function doWatch(
source: WatchSource | WatchSource[] | WatchEffect,
cb: WatchCallback | null,
{
immediate, deep, flush, onTrack, onTrigger }: WatchOptions = EMPTY_OBJ
): WatchStopHandle {
// 当前组件实例
const instance = currentInstance
// 将不同类型的监视对象封装成函数,并在函数内部触发相关get,类似计算属性
let getter: () => any
if (isArray(source)) {
getter = () =>
source.map(s => {
if (isRef(s)) {
return s.value