h函数用来生成vNode,patch方法用于将vNode上树
目的:利用对人类编程习惯的理解,精细化比对,实现最小量更新
只有同一个层级才精细化比较,不做跨层级比较
判断是否同一个节点: newNode.elm === oldNode.elm && newNode.key === oldNode.key
新旧vNode不是同一个节点,直接暴力删除旧的,替换新的
新旧vNode是同一个节点,且新旧节点的内存地址一样,则什么都不做
新旧节点相同但地址不同,新节点仅有文本属性,没有children,直接修改旧节点的
旧节点没有children , 清空旧节点的文本,将新节点的children赋给旧节点
新旧节点都有children
四指针遍历
新前与旧前:命中则 新前旧前指针均 ++ 更改节点中的数据(patchNode) 新后与旧后:命中则 新后旧后指针均 -- 更改节点中的数据(patchNode) 新后与旧前:命中则 新后-- 旧前++ 旧前的节点插入到旧后之后 新前与旧后:命中则 新前++ 旧后-- 旧后的节点插入到旧前之前
四种都没命中,利用map存储 key 和旧节点的对应关系,遍历查找该节点 如果在map中没查到新节点的key,则直接在旧前处插入 如果找到了该节点,则把该节点在旧前处插入,且该节点标记为undefined
遍历走完后,
新前 < 新后 把之间的节点都插入到旧前之后
旧前 < 旧后 把之间的节点都删除