diff算法?
组件并不是真是的DOM节点,而是存在与内存中的一种数据结构,叫做虚拟DOM,只有当它真正插入文档中的时候才会真的变成DOM。
React的设计时所有的DOM变动都先在虚拟的DOM上发生,然后再将实际变动的部分反映在真是DOM上。这就是DOM diff算法,它可以大大提升网页性能表现。
一:diff算法的作用域是什么?
diff算法存在patchChildren方法中,而patchChildren方法用在Flagment类型和element类型的vnode中。
- 什么类型的vnode存在children?
element元素类型vnode和flagment碎片类型vnode
(什么是碎片?创建一个vue组件,它只有一个根节点。
<template><span></span><span></span></template>这样会报错。flagement的出现是虚拟的,根本不会在dom树中呈现。而vue组件的vue实例需要绑定到一个单一的DOM元素中。processFlagment用于处理Flagment类型的vnode)
- patchChildren方法
1:patch每一个children vnode依次向下遍历
2:patchChildren方法根据是否存在key进行真正的diff或者直接patch
二:diff算法的作用?
diff算法的作用:在patch子vnode的过程中,找到新的vnode对应的老vnode,复用真是的DOM节点
如果没有diff算法:会浪费性能开销。因为没有diff算法,而是依次patch虚拟dom,那么稍微修改一下dom树,就会在patch过程没有一对正确的新老vnode,
老的vnode没有一个可以复用,就需要重新创造新的节点,浪费性能开销。
三:diff算法具体做了什么?