React生命周期整理

之前对React的生命周期的理解一直比较浮于表面,今天有空来梳理一下。发现React的新版本对生命周期也做了改动,更有必要搞清楚了。

参考资料:

Mounting阶段

  • constructor

constructor方法在组件建立前被调用:

  1. 在这个方法里面,应该先调用super(props),否则this.props就会未定义。
  2. 这个方法的主要用途是,初始化props,state和绑定方法。
  3. 如果在里面用props为state赋值,那么最好把state提升,也可以在getDerivedStateFromProps()里面用props为state赋值。
  • static getDerivedStateFromProps

关于static,可以看另一篇博客: class中的static

在下列三种情况下,会调用getDerivedStateFromProps方法:

  1. 组件实例化。
  2. 组件的props发生变化。
  3. 父组件重新渲染。

this.setState()不会触发getDerivedStateFromProps(),但是this.forceUpdate()会。

  • UNSAFE_componentWillMount (将废弃)

这个方法在render方法执行前被调用。官方不建议用这个方法,所以给它加了一个UNSAFE前缀。官方建议把要在这里面写的内容放到constructor()或者componentDidMount()里面。
另外,这个方法是唯一的服务端渲染钩子。

  • render

当调用render的时候,组件会检查props和state并返回下列类型中的一个:

  1. react元素。
  2. 字符串或者数字。
  3. Portals。
  4. null。(不渲染)
  5. Booleans。(不渲染)
  6. react.Fragment。
  • componentDidMount

这个方法会在组件建立之后立即调用。需要DOM节点的初始化应该放在这里。
页面初始化请求数据应该放在这里。
需要注意的是,在这里调用setState()会发生第二次render,但是这第二次render会发生在浏览器渲染之前,所以用户往往看不到第二次渲染,即使这样,也要小心使用这个方法,因为它会造成性能问题。

Updating阶段

  • UNSAFE_componentWillReceiveProps(nextProps) / static getDerivedStateFromProps(props, state)

在下列三种情况下,会调用UNSAFE_componentWillReceiveProps方法,但是官方不建议使用这个方法,官方建议使用static getDerivedStateFromProps方法。

  1. 组件的props发生改变。
  2. 父组件发生重新渲染。

需要注意的是,在初始化props的时候并不会调用这个方法,this.setState()也不会触发这个方法。

  • static getDerivedStateFromProps(props, state)

在update阶段也会调用一次这个方法。

  • shouldComponentUpdate(nextProps, nextState)

这个方法的默认行为是每当state发生改变的时候就重新渲染组件。
当初始化的时候,这个方法不会被调用,当使用forceUpdate()的时候,这个方法也不会调用。
如果要提升性能的话,建议使用React.PureComponent,它在shouldComponentUpdate()的默认行为中使用了浅比较。你也可以在里面自己写比较方法。

  • UNSAFE_componentWillUpdate(nextProps, nextState)

这个方法会在接受新props和state之后调用。官方不建议在里面调用setState(),要使用的话,建议在getDerivedStateFromProps方法里面使用。

  • render

在update阶段也会调用一次这个方法。

  • getSnapshotBeforeUpdate(preProps, preState)

这个方法会在把渲染结果提交到DOM之前被调用。它可以返回一个参数,这个参数被componentDidUpdate(preProps, preState, snapshot)方法的第三个参数接收。

  • componentDidUpdate(preProps, preState, snapshot)

这个方法会在组件更新前被调用,所以最好在这里面操作DOM。

Unmounting阶段

  • componentWillUnmount

这个方法会在组件被销毁时调用,所以在这里面做一些必要的清理,比如计时器,网络请求,订阅等等。

Error阶段

  • static getDerivedStateFromError

这也是个静态方法

  • componentDidCatch(error, info)

这个方法在组件catch到各种error之后调用,并进行处理。不要在里面改变数据流,它也不能处理本身抛出的错误。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值