vue3原理和源码分析 - watch 源代码

news/2024/11/8 20:48:37/

https://github.com/vuejs/vue-next/blob/master/packages/runtime-core/src/apiWatch.ts

目录

Watch

@/packages/runtime-core/src/apiWatch.ts

 watch.dot


https://github.com/vuejs/vue-next/blob/master/packages/runtime-core/src/apiWatch.ts

Watch

@/packages/runtime-core/src/apiWatch.ts

watch和watchEffect都是在调用doWatch函数,所以文核心就是doWatch函数

export function watchEffect(effect: WatchEffect,options?: WatchOptionsBase
){return doWatch(effect, null, options)  
}
export function watchPostEffect(effect: WatchEffect,options?: DebuggerOptions
){options.plush = 'post'return doWatch(effect, null, options)  
}
export function watchSyncEffect(effect: WatchEffect,options?: DebuggerOptions
){options.plush = 'sync'return doWatch(effect, null, options)  
}
// 上面几个函数都指向doWatch()
// 对watch函数进行重载,4次
export function watch<T extends MultiWatchSources,Immediate extends Readonly<boolean> = false
>(sources:[...T],cb: WatchCallback<MapSources<T,false>,MapSources<T,Immediate>>,options?: WatchOptions<Immediate>
): WatchStopHandle
// ...
export function watch<T = any,Immediate extends Readonly<boolean> = false
>(sources: T | WatchSource<T>,cb: any,options?: WatchOptions<Immediate>
): WatchStopHandle {return doWatch(source as any, cb, options)
}
// 核心函数 doWatch
function doWatch(// source:// WatchSource是个ref// WatchEffect是个副作用// cb:// watch独有的,watchEffect时是nullsource: WatchSource | WatchSource[] | WatchEffect | object,cb: WatchCallback | null,{ immediate, deep, flush, onTrack, onTrigger }: WatchOptions = EMPTY_OBJ
): WatchStopHandle {let getter:()=> any // 获取值// 会有不同的回调if(isRef(source)) {getter = () => source.value    } else if (isReactive(spurce)) {getter = () => source    } else if (isArray(source)) {getter = () => source.map(s => {if(isRef(s)) {return s.value            } else if (isReactive(s)) {return traverse(s)            } else if (isFunction(s)) {// 报错return callWithErrorHandling(s, instance, ErrorCodes.WARCH_GETTER)            } else {__DEV__ && warnInvalidSource(s)  // 报错      }})    } else if (isFunction(source)) {if(cb) {// watch        } else {// watchEffect        } }// ...// job是effect具体要做的事情const job: SchedulerJob = () => {if(cb) {// watch(source, cb)const newValue = effect.run() // 执行一下,拿到新的值 ,基于getter拿到的effect         // 一些验证条件,通过之后会执行cb// if...// 	if.... hasChanged(newValue, oldValue) // 发送变化才执行callWithAsyncErrorHandling(cb, ...)}   }let scheduler: EffectSchedulerif (flush === 'sync') {scheduler = job as any // 直接调用调度程序函数} else if (flush === 'post') {// 放队列里,一项一项执行scheduler = () => queuePostRenderEffect(job, instance && instance.suspense)} else {// default: 'pre' //也放到一个队列里scheduler = () => {if (!instance || instance.isMounted) {queuePreFlushCb(job)             } else {// 使用“pre”选项,第一次呼叫必须在// 组件已安装,因此可以同步调用它。job()             }        }     }// new 一个 effect;scheduler:控制执行时机,实际执行的就是schedulerconst effect = new ReactiveEffect(getter, scheduler)}

 watch.dot

digraph {watchEffect -> doWatch;watch -> doWatch;doWatch -> reactiveWrapper -> initialGet;activeEffect[color=green]reactiveWrapper -> activeEffect[dir=none]initialGet -> trackAll_refs_reactivestrigger -> activeEffect -> job
}
// dot language
// graphviz

 

 


http://www.ppmy.cn/news/673940.html

相关文章

【单片机】STM32单片机频率计程序,外部脉冲计数程序,基于脉冲计数的频率计程序,STM32F103

文章目录 定时器外部脉冲计数功能程序实现TIM1 定时一秒钟中断TIM2 外部脉冲计数配置TIM3 PWM产生总程序 定时器外部脉冲计数功能 两种方法用于在单片机中实现频率计的功能。 第一种方法是通过定时器来衡量信号的周期&#xff0c;然后将周期转换为频率。在这种方法中&#xf…

LoadRunner创建脚本时提示下载或保存文件且提示“已取消到该页面的导航”

1、问题&#xff1a; LoadRunner创建脚本时提示下载或保存文件且页面不能显示&#xff0c;页面提示“已取消到该页面的导航” 2、产生原因&#xff1a;动态链接库文件受损 3、解决方法&#xff1a; 重新注册受损的动态链接库&#xff0c;在dos下执行&#xff1a; 1&#xff09;…

chm 已取消到该网页的导航,打不开

方法 11. 双击此 .chm 文件。 2. 在“打开文件安全警告”对话框&#xff0c;单击以清除“打开此文件前始终询问”复选框。 3. 单击“打开”。 方法 21. 右键单击该 CHM 文件&#xff0c;然后单击“属性”。 2. 单击“取消阻止”或者“解除锁定”。 3. 双击此 .chm 文件以打开…

chm打不开,提示 :已取消到该网页的导航。

右键文件属性&#xff0c;解除锁定即可&#xff01;

chm文件打不开:提示已取消到该网页的导航的解决办法

问题 打开chm文件时&#xff0c;一片空白&#xff0c;只是提示&#xff1a;已取消到该网页的导航 解决办法 方法1&#xff1a; 双击此 .chm 文件。 在“打开文件安全警告”对话框&#xff0c;单击以清除“打开此文件前始终询问”复选框。 单击“打开”。 方法2&#xff1a…

解决api打开显示“已取消到该网页的导航”问题或者api里面没有内容

碰到这样情况&#xff0c;原因是电脑不能识别文件来源&#xff0c;对文件进行了锁定&#xff0c;解除锁定就可以了 很简单&#xff0c;只需要一步&#xff0c; 右键文件属性 点击【解除锁定】&#xff0c;好了&#xff0c;再次打开文件看看效果

chm取消导航

下载CHM文档&#xff0c;双击打开 提示&#xff1a; chm 已取消到该网页的导航,打不开! 解决方法&#xff1a; 方法 1 1. 双击此 .chm 文件。 2. 在“打开文件安全警告”对话框&#xff0c;单击以清除“打开此文件前始终询问”复选框。 3. 单击“打开”。 方法 2 1. 右…

为什么有的chm会显示“已取消到该网页的导航”?

右键单击chm文件&#xff0c;选择属性 在最下面点击“解除锁定”并确定后&#xff0c;再次打开chm&#xff0c;就正常了