虚拟dom存在2个非常核心的概念
- 挂载:mount
- 更新:patch
h函数作用,生成vnode
render函数的作用,解析vnode并生成真实dom
h函数
源码地址在:packages/runtime-core/src/h.ts
首先进入h函数
h函数存在3个参数
1 | type:当前节点类型 |
该函数的作用就是处理好以上三个函数的传参的多种情况。
然后再将处理好的type,props,children传入到createVNode函数中
createVNode最终会执行_createVNode函数,只不过开发环境会做一些额外的处理
对于初始化的组件来说,_createVNode的主要目的就是给当前组件增加组件类型标识shapeFlag
然后进入createBaseVNode,在该出构建了完成的VNode,并根据children的字段,重新计算shapeFlag,最终返回vnode
小结:h - createVNode - _createVNode - createBaseVNode
- h函数 处理入参,使其标准化的进入到vnode创建流程
- 根据type类型预先赋值shapeFlag,并增强处理class与style
- 构建VNode基础数据
- 根据children的类型,再次刷新ShapeFalg,完成对组件类型的全部标识。
h函数最终就是要生成可用于render函数渲染的vnode数据
render函数
在h函数中处理过去的vnode,将会在render函数中被渲染为真实dom
render的核心代码在runtime-core中进行实现,核心代码与平台式无关的,runtime-dom中存放所有dom渲染相关的代码
在导出render之前,首先会将dom相关方法放入render函数,我们使用的render其实已经被处理过了
代码执行流程大概如下
render:传入vnode与挂载阶段
patch:判断阶段类型,进入对应渲染函数
processElement:文本组件进入这里,首先判断是更新还是新增
mountElement:新增文本组件进入该函数 (创建节点 填充数据 设置props 插入dom)