react 实用的性能优化方式

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

下面有几条优化的建议:

  1. this.handleChange.bind(this,id) (请将方法的bind一概置于constructor);
  2. 复杂的页面不要在一个组件里面写完;
  3. map里面添加key,而且key不要使用index(可变的);
  4. 请尽可能使用const element;
  5. 尽可能少用setTimeOut或不可控的refs、DOM操做;
    6.props和state的数据尽量简单明了,扁平化;

官方提供的性能检测工具:React.addons.Perf和react-perf-tool ;react

性能优化方法:1)es6写法;

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 ,感谢分享;性能

相关文章
相关标签/搜索