什么是 dom diff
dom diff 指的是两个虚拟 dom 之间的差异点。使用 dom diff(而不是完整的新 dom) 来更新真实 dom,可以提高性能。
dom diff 算法
react 会通过下面方法算出 dom diff:
首先对比根元素:
根元素类型不同时,根节点及子组件会被销毁重建
根元素属性不同时,会保留根节点仅更新根节点属性
- 然后循环对比子元素
- 当子元素没有 key 属性时时,react 会将相同位置的子元素进行对比。新增子元素时,将新增子元素追加到结尾,要比插入到头部性能更好。
- 当子元素有 key 属性时,react 会将 key 相同的子元素进行对比,进而避免由插入位置带来的性能问题。
- key 值在列表中应该具有稳定、可预测、唯一的特质。否则会导致组件产生不必要的重建
- 当数组下标作为 key 时,如果数组重新排序,组件的 state 可能会产生一些无法预期的问题
- 然后循环对比子元素