React生命周期看起来的勾子很多,各种状态的不同调用,实际上是指可以分为三类:初始化阶段,更新阶段和销毁阶段。下面我们就围绕着这三个阶段来详细讲解一下。
生命周期完整流程图:
第一个阶段:初始化阶段
首先是初始化阶段,constructor()构造函数中,初始化props、state的值。构造函数中通过super(props)继承父类的一些方法,同时也创建this。下图中为component的几个方法,我们需要继承,也需要通过传入props去实例化。
接着是componentWillMount(),此阶段dom元素并未生成,我们可以在这里进行一些前置操作,但平时使用场景极少。
接着就是render阶段,render的过程实质上进行了几部操作。分为:构建虚拟dom树,diff算法,页面渲染这三步。
初始化阶段的最后就是componentDidMount()的生命周期,页面已经生成dom树了,但是我们需要进行一些init的操作,比如说进行一些前置的http请求。 整个初始化阶段,除了render()之外,其他操作在整个生命周期中仅执行此一次。
第二阶段:更新阶段
第二个阶段中主要进行着更新进行的。也是生命周期函数中带有参数的几个勾子。
-
componentWillReceiveProps(nextProps):此方法会接收到来自父组件中变化了nextProps,然后我们拿着nextPorps和this.props进行比对,看是否要进行一些更新操作。
-
shouldComponentUpdate(nextProps, nextState):根据字面意思理解---是否应该更新。该生命周期中会接收nextProps和nextState的两个参数值,我们可以根据里面具体的值,然后再结合场景来判断我是否应该刷新。函数返回boolean值,ture:刷新|false:不刷新,可用于性能优化,写出更多高质量的代码。
-
componentWillUpdate(nextProps, nextState):当shouldComponentUpdate返回true后,会进入该方法中,然后我们再进行业务上的处理,无论是http请求还是页面逻辑调整。
-
接着render.....
-
componentDidUpdate(preProps, preState):和componentDidMount类似,但componentDidMount仅在初始化时执行一次,后面所有的render操作之后都会进入componentDidUpdate。不过平时使用过程中,该组件用得较少。
第三阶段:销毁阶段
componentWillUnmount():此操作主要是在组件销毁阶段进行的一些额外操作。比如销毁removeEventListern、clearInterval、cleaTimeout、以及一些警告。顺便提一下警告,出现警告的原因一般是当我们有一些异步请求完成后,需要我们更新dom,而此时组件已经被卸载后引起的,一般处理方法如下:
总结:react的生命周期没那么复杂,平时多注意总结。(注:代码编写语义化还是很重要的)