React 17.x 之 Component 生命周期

479 阅读2分钟

对于React 17.x版本,生命周期发生了一些变化。主要可以从这三个方面去了解它的改变

  • 废除了哪些生命周期?
  • 新增了哪些生命周期?
  • 生命周期发生了什么变化?

废除了哪些生命周期?

由于Fiber机制的更新,导致未来React将采取异步渲染的方式

因此废弃了未来可能导致bug的生命周期componentWillMountcomponentWillUpdatecomponentWillRecieveProps

新增了哪些生命周期?

官方函数及其语义化,从方法名就可以了解到函数的含义,但是使用这些方法有一些细节,需要我们了解

getDerivedStateFromProps(nextProps, preState)

简单的理解:从props中获取state,这个生命周期的功能实际上就是将传入的props映射到state上面

因废除了componentWillRecieveProps,在React17版本中引入了静态方法getDerivedStateFromProps用来替代原来componentWillRecieveProps实现的功能。由于是静态方法,因此无法访问Component类实例中的方法和属性

该方法会返回一个对象表示新的state如果不需要更新,返回null即可

在每次渲染之前都会调用,不管初始挂载阶段还是后面的更新都会调用,这一点和componentWillReceiveProps不同(只有当父组件造成重新渲染时才调用)

注:该方法必须有返回值。如无,返回null即可

getSnapshotBeforeUpdate(nextProps, nextState)

简单的理解:更新前获取快照

因废除了componentWillUpdate,新增了getSnapshotBeforeUpdate用于替换

该方法会在组件更新阶段,输出渲染(提交到 DOM 节点)之前触发。使得组件能在发生更改之前从 DOM 中捕获一些信息(例如,滚动位置)

此生命周期方法的返回值将传递给componentDidUpdate(),作为其第三个参数

注:该方法必须有返回值。如无,返回null即可

getDerivedStateFromError(error)

简单的理解:从错误中获取state

此生命周期会在后代组件抛出错误后被调用。 它将抛出的错误作为参数,并返回一个值以更新state

该方法会在渲染阶段调用,因此不允许出现副作用。根据官方文档,该静态方法推荐在页面发生错误时,来处理降级渲染,展示降级UI

生命周期发生了什么变化?

宏观上看,类组件的生命周期阶段没有变化

仍是:

挂载 -> 更新 -> 卸载

挂载阶段

挂载阶段指:组件被插入DOM中时

触发的生命周期及调用顺序

  • constructor()
  • static getDerivedStateFromProps()
  • render()
  • componentDidMount()

更新阶段

更新阶段指:由任何操作导致的 stateprops 更新,此时会导致组件重新渲染

触发的生命周期及调用顺序

  • static getDerivedStateFromProps() // componentWillRecieveProps
  • shouldComponentUpdate()
  • render()
  • getSnapshotBeforeUpdate() // componentWillUpdate
  • componentDidUpdate()

卸载阶段

卸载阶段指:当组件从DOM中移除时

触发的方法

  • componentDidUnMount()

错误捕获

错误捕获

  • getDerivedStateFromError()
  • componentDidCatch()