React的diff算法通过两个核心假设将复杂度从O(n3)优化到O(n),其策略可概括为以下三点:
一、分层比较策略- 层级限制:React仅比较同一层级的节点,忽略跨层级移动(如节点A从父节点1移动到父节点2)。若发现层级差异,直接删除旧节点及其指含子树,在新位置重建。
- 传统算法对比:传统diff需遍历整棵树(O(n2)节点对比+O(n)查找填充),而React通过层级隔离避免全局遍历。
二、组件类型差异处理- 类型决定树结构:当比较两个组件时,若类型不同(如<div>变为<span>),React会销毁旧组件及其子树,并新建组件。此策略基于假设1:不同类型元素生成不同树结构。
- 性能优化:避免递归对比不同结构睁耐的子树,直接重置该分支。
三、同级节点列表的Key优化示例说明假设渲染列表从[A, B, C]变为[C, A, B]:
- 无Key:React误判所有节点类型相同(均为ListItem),按索引对比后逐个更新内容,导致三次DOM操作。
- 有Key:通过key识别出C移动到首位,仅需一次DOM插入操作,其余节点复用。
总结React的启发式diff通过以下假设实现高效更新:
- 结构稳定假设:跨层级操作罕见,层级内比较足够。
- Key标识假设:开发者通过key提供节点稳定性线索。
这些策略将复杂度降至O(n),同时要求开发者遵循约定(如避免无意义跨层级移动、合理使用key)以最大化性能收益。