React的渲染机制:Reconciliation
很多人翻译为 “一致化处理过程”,直译为 “协调”
React 采用的是虚拟 DOM 即 VDOM
每次属性 props 和状态 state 发生变化时,render 函数返回不同的元素树
React 会检测当前返回的元素树和上次渲染的元素树之前的差异,然后针对差异的地方进行更新操作,最后渲染为真实 DOM
核心就是就是进行新旧 DOM 树对比的 diff 算法
性能优化,首当其冲的工作就是 减少 diff 的过程
利用 shouldComponentUpdate 这个生命周期函数
默认的 shouldComponentUpdate 会在 props 或 state 发生改变时返回 true,表示组件会重新渲染,从而调用 render 函数,进行新旧 DOM 树的 diff 比对。
但是我们可以在这个生命周期函数里面做一些判断,然后返回一个布尔值,返回 true 则表示立即更新当前控件,false 则不更新当前组件
换句话说,我们可以通过 shouldComponentUpdate 控制是否发生 VDOM 树的 diff 过程
如果一个节点的 shouldComponentUpdate 返回 false,则该节点和该节点下面所有的后代节点都不需要进行 VDOM 节点对比。
如果一个节点的 shouldComponentUpdate 返回 true
如果该节点的类型相同,则继续进入到下一层进行对比。
如果该节点的类型不同,React 会直接将 原 VDOM 树上该节点以及该节点下所有的后代节点全部删除,然后替换为新 VDOM 树上同一位置的节点。
能够合理利用 shouldComponentUpdate 可以避免不必要的 Reconciliation 过程,使得应用性能可以更加优秀
一般 shouldComponentUpdate 会比较 props 和 state 中的属性是否发生改变 浅比较 来判定是否返回 true,从而触发 Reconciliation 过程
类组件中可以使用 PureComponent 这个 API
函数组件中提供了一个 memo 方法,但是它只进行了 props 的浅比较
最后更新于
这有帮助吗?