认识
2023年07月12日
一、认识
patch
用于负责首次渲染和后续更新或者销毁组件, 主要过程如下:
-
如果老的
VNode
是真实元素,则表示首次渲染,创建整棵DOM
树,并插入body
,然后移除老的模版节点 -
如果老的
VNode
不是真实元素,并且新的VNode
也存在,则表示更新阶段,执行patchVnode
-
首先是全量更新所有的属性
-
如果新老
VNode
都有孩子,则递归执行updateChildren
,进行diff
过程-
同层比较(降低时间复杂度)深度优先(递归)
-
而且前端很少有完全打乱节点顺序的情况,所以做了四种假设,假设新老
VNode
的开头结尾存在相同节点,一旦命中假设,就避免了一次循环,降低了diff
的时间复杂度,提高执行效率。如果不幸没有命中假设,则执行遍历,从老的VNode
中找到新的VNode
的开始节点 -
找到相同节点,则执行
patchVnode
,然后将老节点移动到正确的位置 -
如果老的
VNode
先于新的VNode
遍历结束,则剩余的新的VNode
执行新增节点操作 -
如果新的
VNode
先于老的VNode
遍历结束,则剩余的老的VNode
执行删除操纵,移除这些老节点
-
-
如果新的
VNode
有孩子,老的VNode
没孩子,则新增这些新孩子节点 -
如果老的
VNode
有孩子,新的VNode
没孩子,则删除这些老孩子节点 -
剩下一种就是更新文本节点
-
-
如果新的
VNode
不存在,老的VNode
存在,则调用destroy
,销毁老节点