对于React 17.x版本,生命周期发生了一些变化。主要可以从这三个方面去了解它的改变
- 废除了哪些生命周期?
- 新增了哪些生命周期?
- 生命周期发生了什么变化?
废除了哪些生命周期?
由于Fiber机制的更新,导致未来React将采取异步渲染的方式
因此废弃了未来可能导致bug的生命周期componentWillMount、componentWillUpdate和componentWillRecieveProps。
新增了哪些生命周期?
官方函数及其语义化,从方法名就可以了解到函数的含义,但是使用这些方法有一些细节,需要我们了解
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()
更新阶段
更新阶段指:由任何操作导致的 state 或 props 更新,此时会导致组件重新渲染
触发的生命周期及调用顺序
- static getDerivedStateFromProps() // componentWillRecieveProps
- shouldComponentUpdate()
- render()
- getSnapshotBeforeUpdate() // componentWillUpdate
- componentDidUpdate()
卸载阶段
卸载阶段指:当组件从DOM中移除时
触发的方法
- componentDidUnMount()
错误捕获
错误捕获
- getDerivedStateFromError()
- componentDidCatch()