Open Hongbusi opened 2 years ago
默认已通过 createApp() 创建基于 DOM 的渲染器
createApp()
调用 createVNode 函数将传入的 rootComponent 根组件转换为 VNode。在 createVNode 函数中,将通过不同的 children 类型打上不同的 ShapeFlag
createVNode
rootComponent
children
然后调用 renderer 渲染器函数,将根组件的 VNode 进行渲染。这里不使用 Vue 提供的 CustomRenderer 来自定义渲染器,Vue 将会使用内部的 DOM 接口进行挂载。Vue3 挂载流程的重头戏,就是 render 阶段了。
renderer
CustomRenderer
render
在 renderer 函数中,会调用 patch 函数。
patch
在 patch 函数内部,首先会根据 VNode 不同的类型走不同的处理程序。
如果说一个 VNode 是 Fragment 类型,那就走 processFragment 函数,由于 Fragment 类型不渲染父级元素,那么就会直接走处理 children 的流程。
Fragment
processFragment
如果说一个 VNode 是 TextNode 类型,那么就说明是字符串,直接创建一个 TextNode 节点,并挂载就可以了。
TextNode
如果一个 VNode 不是上述的两种类型,那么就要走正常的挂载流程了。正常的挂载流程,会根据组件的 ShapeFlag 分为两种情况:
由于对生命周期钩子研究不深,这里就不提了,如果大家对这个有了解的,可以写个 comment,我来加一下
生命周期是在函数单一执行原则的前提下由patch函数衍生出的生命函数,如果想看调用原理还需围绕patch函数去看。 由vue的这个生命周期来看,再次强调了函数单一执行原则的重要性
这里说一下 Vue3 的挂载流程:
1. 生成根组件 VNode
调用
createVNode
函数将传入的rootComponent
根组件转换为 VNode。在createVNode
函数中,将通过不同的children
类型打上不同的 ShapeFlag2. 进行 render
然后调用
renderer
渲染器函数,将根组件的 VNode 进行渲染。这里不使用 Vue 提供的CustomRenderer
来自定义渲染器,Vue 将会使用内部的 DOM 接口进行挂载。Vue3 挂载流程的重头戏,就是render
阶段了。在
renderer
函数中,会调用patch
函数。2.1 patch 函数
在 patch 函数内部,首先会根据 VNode 不同的类型走不同的处理程序。
如果说一个 VNode 是
Fragment
类型,那就走processFragment
函数,由于 Fragment 类型不渲染父级元素,那么就会直接走处理 children 的流程。如果说一个 VNode 是
TextNode
类型,那么就说明是字符串,直接创建一个 TextNode 节点,并挂载就可以了。如果一个 VNode 不是上述的两种类型,那么就要走正常的挂载流程了。正常的挂载流程,会根据组件的 ShapeFlag 分为两种情况:
2.2 初始化
2.3 挂载
3. 注意
由于对生命周期钩子研究不深,这里就不提了,如果大家对这个有了解的,可以写个 comment,我来加一下