Diff 算法
对比 Diff 的话,最初的算法时间复杂度为 O(n3)
React 在以下两个假设的基础上提出了一套 O(n) 的启发式算法
- 两个不同类型的元素会产生不同的树
- 对于同一层级的子节点,可以通过 key 属性进行唯一标识。通过给子节点添加唯一 key 值,React 可以快速定位到发生变化的节点,而不需要对整个子树进行 diff
完全对比 O(n3)无法接受,故降级为同层对比的 O(n)方案
为什么降级可行?因为跨层级很少发生可以忽略
VirtualDOM Diff 算法
一般的设计思路都是页面等于页面状态的映射,即 UI = render(state)。当需要更新页面的时候,无需关系 DOM 具体的变换方式,只需要改变 state 即可,剩下的事情(render)将由框架代劳。
所以思路就是改变 state,生成新的 VD - 新的 VD 与旧的 VD 进行对比 - 生成差异对象(patch) - 遍历差异对象并更新
patch(container, vnode) 第一次渲染
patch(vnode, newVnode) 更新数据