react 组件渲染分为初始化渲染和更新渲染,当咱们更新某个组件的时候,只是想关键路径上组件的render,但react的默认作法是调用因此组件的reder,再生成虚拟dom进行对比,如不变则不进行更新。这样的render和虚拟DOM的对比明显是在浪费。
React的优化是基于shouldComponentUpdate的,该生命周期默认返回true,因此一旦prop或state有任何变化,都会引发从新render。shouldComponentUpdate 有两个参数,一个是nextProps,一个nextState 。根据渲染流程,首先会判断shouldComponentUpdate(SCU)是否须要更新。若是须要更新,则调用组件的render生成新的虚拟DOM,而后再与旧的虚拟DOM对比(vDOMEq),若是对比一致就不更新,若是对比不一样,则根据最小粒度改变去更新DOM;若是SCU不须要更新,则直接保持不变,同时其子元素也保持不变。html
官方提供的性能检测工具:React.addons.Perf和react-perf-tool ;react
var shallowCompare = require('react-addons-shallow-compare');
export class SampleComponent extends React.Component {
shouldComponentUpdate(nextProps, nextState) {
return shallowCompare(this, nextProps, nextState);
}
}es6
2)es7 修饰符:
import pureRender from "pure-render-decorator"
...segmentfault
@pureRender性能优化
3)更简便的方式:
function shallowCompare(instance, nextProps, nextState) {
return !shallowEqual(instance.props, nextProps) || !shallowEqual(instance.state, nextState);
}dom
4)使用react-addons-pure-render-mixin 插件,代码以下:
;
5)react 15.3之后用React.PureComponent - 一个可继承的新的基础类, 用来替换react-addons-pure-render-mixin;代码以下:
;
以上的方法都是浅比较,若是结构比较复杂,则须要使用immutable.js 。工具
本文参考:https://segmentfault.com/a/1190000007811296 和 https://wulv.site/2017-05-31/react-purecomponent.html ,感谢分享;性能