简单的手写了diff算法,用比较简单的方法理解diff算法
- 匹配成功,将新前的虚拟节点插入旧前在真实DOM中的位置,然后新前++ , 旧前++ ,跳出当前循环继续下一次循环
- 匹配失败,继续下一个比较
- 匹配成功,将新前的虚拟节点插入旧后在真实DOM中的位置,然后新前++,旧后--,跳出当前循环继续下一次循环
- 匹配失败,继续下一个比较
- 匹配成功,将新后的虚拟节点插入旧前在真实DOM中的位置,然后新后--,旧前++,跳出当前循环继续下一次循环
- 匹配失败,继续下一个比较
- 匹配成功,将新后的虚拟节点插入旧后在真实DOM中的位置,然后新后--,旧后--,跳出当前循环继续下一次循环
- 匹配失败,进行最后一个判断(第五点)
- 都存在key值,创建一个对象,存储旧子节点,将新前节点与这个循环匹配,匹配成功判断两个节点是否相同,相同则将该节点插入到真实DOM的最前方,将该旧虚拟节点设置为undefined,否则,将新前拆入到旧虚拟节点的匹配的位置,然后前原本的旧虚拟节点设置为null,新前++
- 上面一种还有一种理解是,新前和旧虚拟节点对象匹配,成功则通过patchVnode.js判断真实节点(旧虚拟节点的一个属性elm)和新前节点,然后插入到真实节点中
- 不存在key值,直接将新子节点插入到真实DOM中
- (ps:这下可以解释为什么v-for的时候需要设置key了,如果没有key那么就只会做四种匹配,就算指针中间有可复用的节点都不能被复用了)