初始化阶段
(constructor:如果不初始化state或不进行方法绑定,可以不需要为组件实现构造函数,是类的构造函数)
componentWillMount:render之前最后一次修改状态的机会
render:只能访问this.props和this.state,不允许修改状态和DOM输出
componentDidMount:成功render并渲染完成真实DOM之后触发,可以修改DOM,推荐在这个函数中完成数据请求、订阅函数的调用、设置setInterval等
运行阶段
componentWillReciveProps:父组件修改属性触发
shouldComponentUpdate:返回false会阻止render调用
componentWillUpdate:不能修改属性和状态
render:只能访问this.props和this.state,不允许修改状态和DOM输出
componentDidUpdate:可以修改DOM
销毁阶段
componentWillUnmount:在删除组件之前进行清理操作,比如计时器和事件监听器
老生命周期的问题
componentWillMount:新版本的React采用的是异步渲染,在render执行之前,这个函数可能会被执行多次,同时如果在这里绑定事件,将无法解绑,导致内存泄漏,不够安全和高效。
componentWillReciveProps外部组件多次频繁更新传入多次不同的props,会导致不必要的异步请求。
componentWillUpdate更新前记录DOM状态,在这个函数中进行一些数据处理,如果与componentDidUpdate相隔时间过长,会导致状态不准确
新生命周期的替代
getDerivedStateFromProps(nextProps,prevState):第一次的初始化组件以及后续的更新过程中(包括自身状态更新以及父传子),返回一个对象作为新的state,返回null则说明不需要再这里更新state。是一个静态方法,内部的this指向的是类而不是对象实例,所以不能通过this来访问class的属性,要保持其纯函数的特点。
getSnapshotBeforeUpdate(prevProps, prevState):取代了componentWillUpdate,触发事件为update发生的时候,在渲染dom之前返回一个值,它使得组件能在发生更改之前从 DOM 中捕获一些信息(例如,滚动位置),作为componentDidUpdate的第三个参数。
react中性能优化
shouldComponentUpdate(nextProps, nextState):返回一个布尔值,控制组件自身或者子组件是否需要更新,尤其在子组件非常多的情况下,需要通过该方法进行性能优化。
PureComponent:可以比较新props跟旧props,新的state和旧的state(值相等,或者对象含有相同的属性且属性值相等(浅比较)),决定shouldComponentUpdate返回true或者false,从而决定要不要调用render。(如果state或props会一直发生改变,PureComponent并不会比较快,shallowEqual也需要花时间)