传统 diff 算法
传统 diff 算法通过循环递归对节点进行依次对比,效率低下,算法复杂度达到O(n^3),其中n是树中节点的总数
react diff 策略
- Web UI 中 DOM 节点跨层级的移动操作特别少,可以忽略不计
- 拥有相同类的两个组件将会生成相似的树形结构,拥有不同类的两个组件将会生成不同的树形结构
- 对于同一层级的一组子节点,它们可以通过唯一 key 进行区分
react diff 算法
- 基于
tree diff策略,React 对虚拟 DOM 树进行分层比较、层级控制,只对同一父节点的子节点进行比较,当发现某一子节点不在了直接删除该节点以及其所有子节点 - 基于
component diff策略,React 对于同一类型的组件,通过shouldComponentUpdate方法优化,减少组件不必要的比较,对于非同一类型的组件,则替换整个组件下的所有子节点 - 基于
element diff策略,React 通过唯一 key 来判断老集合中是否存在相同的节点,如果有,则判断是否可复用,如果没有,则创建新的节点
总结
- React 通过分层比较、层级控制策略,对
tree diff进行算法优化 - React 通过相同类生成相似树形结构,不同类生成不同树形结构以及
shouldComponentUpdate策略,对component diff进行算法优化 - React 通过设置唯一 key 的策略,对
element diff进行算法优化 - React 通过制定大胆的diff策略,将O(n3)复杂度的问题转换成O(n)复杂度的问题
- 开发时保持稳定的 DOM 结构有助于性能的提升