patch
将VNode转换成真实的node节点,需要通过patch函数来实现
在Vue.prototype._update的定义中有如下调用
1 | vm.$el = vm.__patch__(prevVnode, vnode) |
__patch__的定义如下:(platforms/runtime/index.js)
1 | import { patch } from './patch' |
patch:
1 | import { createPatchFunction } from 'core/vdom/patch' |
createPatchFunction的主要代码如下
1 | export function createPatchFunction (backend) { |
这里通过createPatchFunction函数,来创建返回一个patch函数。path接收6个参数:
- oldVnode: 旧的虚拟节点或旧的真实dom节点
- vnode: 新的虚拟节点
- hydrating: 是否要跟真是dom混合
- removeOnly: 特殊flag,用于组件
- parentElm:父节点
- refElm: 新节点将插入到refElm之前
具体解析看代码注释~抛开调用生命周期钩子和销毁就节点不谈,
我们发现代码中的关键在于sameVnode、 createElm 和 patchVnode 方法。
sameVnode - 判断2个节点,是否是同一个节点
1 | function sameVnode (a, b) { |
createElm - 创建真实的 DOM 对象
1 | function createElm (vnode, insertedVnodeQueue, parentElm, refElm, nested) { |