「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」。
打开VSCode
老标准,从setupRenderEffect开始
代码页面大概1200行
comand + p 可以直接跳转到第1200行
这个方法主要用来安装渲染函数的副作用
内部componentUpdateFn函数用来做组件更新,此函数对patch产生了调用,在调用之前会获取渲染函数的结果 ,即当前组件的vnode,在首次执行渲染函数的时候其实依赖关系已经建立完成了。
下面部分的effect目的是,为组件的渲染创建一个响应式的副作用,它new了一个ReactiveEffect,入参是执行函数、scheduler(定时器任务)、作用域(暂时不关心)
数据执行执行queueJob,执行effect.run.bind(effect)即响应式副作用的run函数。
接下来 queueflush() 冲洗、冲刷,批量任务执行
这里运行开始之后,就启动了一个promise异步任务,启动了一个微任务队列
执行方式是按照顺序依次使用callWithErrorHandling来调用,之前run部分加入的方法在这里被运行,effect.run开始生效
fn是入参的第一个参数,因此入参就是componentUpdateFn,即更新方法
上面红框框部分就是新老node节点进行diff更新运行的地方。
因此总流程其实是:
componentUpdateFn —> queueJob —> effect.run —> ReactiveEffect —> queueflush() —> run部分加入队列的在这里执行 —> 执行componentUpdateFn组件更新函数
整体流程
分两个部分,更新机制建立,以及更新过程,详情如下图:
整个流程分为了两部分三张图,全局的将整个的流程都归纳了进去,我们可以依据这张图进行整体的学习以及复习。更新机制的建立就是
mountComponent --> setupRenderEffect --> new ReactiveEffect()
更新过程:
anonymouse --> set --> trigger --> triggerEffects --> queueJob --> queueFlush --> flushJobs --> effect.run --> componentUpdateFn组件更新函数 --> patch
整理完毕,更新流程就到这里哦~