React新旧生命周期对比

539 阅读4分钟

摘要

本文章向大家介绍React新旧版本生命周期对比,主要包括React新旧版本生命周期对比使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

react在版本16.3前后存在两套生命周期,16.3之前为旧版,之后则是新版,虽有新旧之分,但主体上大同小异。

react新旧生命周期的区别:

  1. 新生命周期中去掉了三个will钩子,分别为componentWillMount、componentWillReceiveProps、componentWillUpdate;
  2. 新生命周期中新增了两个钩子,分别为getDerivedStateFromProps(从props中得到衍生的state)和getSnapshotBeforeUpdate。

旧版生命周期

旧版生命周期图示:

生命周期阶段:

创建/挂载阶段:

创建/挂载阶段会执行以下钩子函数:

constructor(props)

初始化时调用,在组件整个生命周期中只调用一次

componentWillMount()

在执行render()之前调用,在这里可以访问到组件最新的props和state

render()

渲染组件结构,这里可以访问到props和state

componentDidMount()

当组件渲染完毕并成功将真实DOM挂载到页面上时执行,也是在组件整个生命周期中只调用一次

更新阶段:

以下情况触发组件的更新:

  1. 外部传入的props改变
  2. 执行setState()
  3. 调用组件自身的forceUpdate()方法强制组件重新渲染

更新阶段会执行以下钩子函数:

componentWillReceiveProps(nextProps)

props改变时会调用这个钩子,传入这次更新的props的值

shouldComponentUpdate(nextProps,nextState)

props改变setState() 的情况下触发组件更新时会调用这个钩子,传入这次更新的props和state的值,可以通过this.state和this.props获取旧状态进行对比
注意:这个方法必须显式地返回true或者false来通知React是否要更新组件

componentWillUpdate(nextProps,nextState)

在render()前执行,传入这次更新的props和state的值

render()

componentDidUpdate(prevProps,prevState)

当组件更新完毕时调用,传入上一次的props和state发值

卸载阶段

卸载阶段就简单多了,当React将这个组件销毁之前,会调用下面的钩子函数:

componentWillUnmount

组件销毁之前调用,在这里面可以移除掉一些窗口监听事件、定时器\

新版生命周期

新版生命周期又分为16.3和16.4+版本

16.3图示:

16.4+图示:

生命周期阶段:

创建/挂载阶段:

创建/挂载阶段会执行以下钩子函数:

constructor(props)

初始化时调用,在组件整个生命周期中只调用一次

getDerivedStateFromProps(props,state)

在执行render()之前调用,在这里可以访问到组件最新的props和state

render()

渲染组件结构,这里可以访问到props和state

componentDidMount()

当组件渲染完毕并成功将真实DOM挂载到页面上时执行,也是在组件整个生命周期中只调用一次

更新阶段:

以下情况触发组件的更新:

  1. 外部传入的props改变
  2. 执行setState()
  3. 调用组件自身的forceUpdate()方法强制组件重新渲染

更新阶段会执行以下钩子函数:

getDerivedStateFromProps(props,state)

如果是16.3版本,在props改变的情况下触发组件更新时会调用这个钩子
如果是16.4+版本,只要是更新阶段就会触发

shouldComponentUpdate(nextProps,nextState)

在props改变和setState()的情况下触发组件更新时会调用这个钩子,传入这次更新的props和state的值,可以通过this.state和this.props获取旧状态进行对比
注意:这个方法必须显式地返回true或者false来通知React是否要更新组件

render()

getSnapshotBeforeUpdate(prevProps,prevState)

在render()后执行,传入上一次的props和state,这个方法也需要返回一个值,用于在componentDidUpdate中接收使用,而且这个钩子必须搭配componentDidUpdate一起使用,否则会报错

componentDidUpdate(prevProps,prevState,value)

当组件更新完毕时调用,有三个参数,前两个是上一次的props和state,第三个参数就是getSnapshotBeforeUpdate钩子返回的值

卸载阶段

卸载阶段就简单多了,当React将这个组件销毁之前,会调用下面的钩子函数:

componentWillUnmount

组件销毁之前调用,在这里面可以移除掉一些窗口监听事件、定时器