07-Vue3.0源码阅读之更新流程分析下

172 阅读2分钟

「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」。

打开VSCode

老标准,从setupRenderEffect开始

代码页面大概1200行

image.png

comand + p 可以直接跳转到第1200行

这个方法主要用来安装渲染函数的副作用

内部componentUpdateFn函数用来做组件更新,此函数对patch产生了调用,在调用之前会获取渲染函数的结果 ,即当前组件的vnode,在首次执行渲染函数的时候其实依赖关系已经建立完成了。

下面部分的effect目的是,为组件的渲染创建一个响应式的副作用,它new了一个ReactiveEffect,入参是执行函数、scheduler(定时器任务)、作用域(暂时不关心)

数据执行执行queueJob,执行effect.run.bind(effect)即响应式副作用的run函数。

image.png

接下来 queueflush() 冲洗、冲刷,批量任务执行

这里运行开始之后,就启动了一个promise异步任务,启动了一个微任务队列

image.png

执行方式是按照顺序依次使用callWithErrorHandling来调用,之前run部分加入的方法在这里被运行,effect.run开始生效

image.png

fn是入参的第一个参数,因此入参就是componentUpdateFn,即更新方法

image.png

上面红框框部分就是新老node节点进行diff更新运行的地方。

因此总流程其实是:

componentUpdateFn —> queueJob —> effect.run —> ReactiveEffect —> queueflush() —> run部分加入队列的在这里执行 —> 执行componentUpdateFn组件更新函数

整体流程

分两个部分,更新机制建立,以及更新过程,详情如下图:

image.png

image.png

image.png

整个流程分为了两部分三张图,全局的将整个的流程都归纳了进去,我们可以依据这张图进行整体的学习以及复习。更新机制的建立就是

mountComponent --> setupRenderEffect --> new ReactiveEffect()

更新过程:

anonymouse --> set --> trigger --> triggerEffects --> queueJob --> queueFlush --> flushJobs --> effect.run --> componentUpdateFn组件更新函数 --> patch

整理完毕,更新流程就到这里哦~