React diff是什么?
跟Vue一致,React通过引入Virtual DOM的概念,极大地避免无效的Dom操作,使我们的页面的构建效率提到了极大的提升
而diff算法就是更高效地通过对比新旧Virtual DOM来找出真正的Dom变化之处
原理
react中diff算法主要遵循三个层级的策略:
- tree层级
- conponent 层级
- element 层级
tree层级
- DOM节点跨层级的操作不做优化,只会对相同层级的节点进行比较
- 只有删除、创建操作,没有移动操作
- react发现新树中,节点下没有了节点1,那么直接删除节点1,在需要添加节点1位置下创建节点1以及下属节点
conponent层级
- 如果是同一个类的组件,则会继续往下diff运算,如果不是一个类的组件,那么直接删除这个组件下的所有子节点,创建新的
element层级
- 对于比较同一层级的节点们,每个节点在对应的层级用唯一的key作为标识
- 提供了 3 种节点操作,分别为 INSERT_MARKUP(插入)、MOVE_EXISTING (移动)和 REMOVE_NODE (删除)
- 通过key可以准确地发现新旧集合中的节点都是相同的节点,因此无需进行节点删除和创建,只需要将旧集合中节点的位置进行移动,更新为新集合中节点的位置