介绍Diff算法的概念
目录:
一、Diff算法tree diff
二、Diff算法 component diff
三、Diff算法element diff
diff算法就是进行虚拟节点对比,并返回一个patch对象,用来存储两个节点不同的地方,最后用patch记录的消息去局部更新Dom。
目的:寻找差异
特点:
比较只会在同层级进行, 不会跨层级比较
在diff比较的过程中,循环从两边向中间比较
一、tree diff
treediff:新旧两棵DOM树,逐层对比的过程,就是Tree Diff;当整颗DOM逐层对比完毕,则所有需要被按需更新的元素,必然能够找到
二、Component diff
component diff:在进行TreeDiff的时候,每一层中,组件级别的对比叫做Component Diff;
如果对比前后,组件的类型相同,则暂时认为此组件不需要被更新;
如果对比前后,组件类 型不同,则需要移除旧组件,创建新组件,并追加到页面上
React是基于组件构建应用的,对于组件间的比较所采取的策略也是非常简洁、高效的。
如果是同一类型的组件,按照原策略继续比较 Virtual DOM 树即可如果不是,则将该组件判断为 dirty component,从而替换整个组件下的所有子节点
对于同一类型下的组件,有可能其 Virtual DOM 没有任何变化,如果能确切知道这一点,那么就可以节省大量的diff 算法时间。因此, React 允许用户通过shouldComponentUpdate()来判断该组件是否需要大量 diff 算法分析。
三、Element diff
element diff:在进行组件对比的时候,如果两个组件类型相同,则需要进行元素级别的对比,这叫做Element Diff
当节点处于同一层级时,diff 提供三种节点操作:
INSERT_MARKUP(插入):如果新的组件类型不在旧集合里,即全新的节点,需要对新节点执行插入操作。
MOVE_EXISTING(移动):旧集合中有新组件类型,且 element 是可更新的类型,generatorComponentChildren 已调用receiveComponent,这种情况下 prevChild=nextChild,就需要做移动操作,可以复用以前的 DOM 节点。
REMOVE_NODE(删除):旧组件类型,在新集合里也有,但对应的 elememt 不同则不能直接复用和更新,需要执行删除操作,或者旧组件不在新集合里的,也需要执行删除操作。
