1. 作用域的修改放在constructor中
2. setState异步函数
setState内置了性能优化的机制,它是一个异步函数,可以把多次的数据改变结合成一次来做,这样的话降低虚拟DOM的对比频率,来提高性能
3.借助shouldComponentUpdate生命周期函数
避免无谓的组件的render函数的运行
4.聪明组件和傻瓜组件
软件设计有一个原则,叫做“责任分离”,就是一个模块的责任尽量小,如果一个模块的功能过多,就分拆成多个模块,让一个模块专注于一个功能。
根据 UI = f(data) 公式。使用React做UI界面,无非是获取驱动界面的数据,然后进行数据渲染界面。把获取和管理数据的逻辑放在父组件,即聪明组件;把渲染界面的逻辑放在子组件,即傻瓜组件。这样的好处是如果管理数据的方式需要从redux改成mobx,那只需要修改聪明组件即可。
5.PureComponent结合immutable.js
PureComponent是在内部封装了shouldComponentUpdate的方法,每次组件的state或者props发生变化时,render都会重新执行。shouldComponentUpdate会在render函数执行之前被调用,如果返回true,就继续,如果返回false,渲染过程就立刻停止。
但是PureComponent和shouldComponentUpdate都对props做浅比较,不是深比较,所以props是一个深层对象的话,就容易产生问题。比如两次渲染传入的是同一个对象,只是对象中的某个属性值不同。但是在PureComponent和shouldComponentUpdate看来,props没有发生变化,所以不会重新渲染,这就尴尬了。这就可以使用immutable.js(likeFloworTypeScript)来解决这个问题。
6.React.memo()
虽然shouldComponentUpdate能够避免重复渲染,提高性能,但是如果子组件是一个纯函数呢?不继承React.Component,不是class, 那么它也就没有shouldComponentUpdate。So,React16.6.0版本更新了一个重要的功能React.memo()。
React.memo()是一个高阶组件,它类似于PureComponent功能组件而不是class。React.memo()通过记忆化将函数返回结果存储起来,以提高性能。