组件生命周期的三个阶段
Mounting(创建阶段)
Updating(更新阶段)
Unmounting(卸载阶段)
旧的生命周期函数:如下图
备注:lnitialization (初始化阶段),会执行constructor()初始化组件需要state,props和函数的绑定(bind)。但constructor属于ES6的语法,本身不属于react。所以严格来讲不算是react的生命周期函数,但是又和生命周期函数的特性符合。在官方文档在示例代码中将其纳入了组件的生命周期函数。
本文,不探究16版本以前的生命周期函数,因为有一些要在17版本废除:
即将的废除的生命周期函数:
官网文档指出使用这些生命周期的代码会在未来版本的react中更容易产生bug,尤其是对于异步渲染的版本
由于未来采用异步渲染机制,所以即将在17版本中去掉的生命周期钩子函数
componentWillMount
componentWillRecieveProps
componentWIllUpdate
新增的生命周期函数
Mounting (挂载阶段)
1. static getDerivedStateFromProps(nextProps, prevState)
这个生命周期函数只要页面update就会被触发
这个生命周期的意思就是根据从props中获取state,实际上就是将传入的props映射到state上面
返回值是一个对象,这个对象的作用和setState一样用于更新state,返回值为null时,不更新state状态。提供给我们一个在渲染之前操作state的机会(慎用!)
该方法在每次render(渲染)被调用之前调用,意味着即使你的props没有任何变化,但因为state发生了变化,导致组件重新的render,这个生命周期函数依然会被调用。(父组件渲染导致了组件的重新渲染,即使子组件接收的属性没有更新,这一方法也会被调用)。
因为该方法为静态方法,所以内部不能使用this关键字。也就是这个函数不能通过this访问到class的属性,也并不推荐直接访问属性。而是应该通过参数提供的nextProps以及prevState来进行判断,根据新传入的props来映射到state。
Updating (更新阶段)
getSnapshotBeforeUpdate(prevProps, prevState)
触发时间: update发生的时候,在render之后可以读取但无法使用DOM的时候。它使您的组件可以在可能更改之前从DOM捕获一些信息(在虚拟DOM转化为真实DOM的前一刻自动调用。这个时间点getSnapshotBeforeUpdate可以用于读取即将被改变的数据);
这一生命周期返回的任何值将会 作为componentDidUpdate的第三个参数。配合componentDidUpdate, 可以覆盖componentWillUpdate的所有用法
错误边界
当任何一个子组件在渲染过程中、在一个生命周期方法中、或在构造函数中发生错误时,这些方法会被调用
static getDerivedStateFromError(error)
在后代组件抛出错误后调用getDerivedStateFromError生命周期。它接收作为错误信息作为参数,并应该返回一个值去更新状态。
被调用是在 “渲染” 阶段,所以不允许副作用。
componentDidCatch(error, info)
任何一处的javascript报错会触发 类似于JS原生的try/catch。可以捕获错误,并处理
关于错误边界和捕获异常的生命周期函数,可以参考
https://stackoverflow.com/questions/52962851/whats-the-difference-between-getderivedstatefromerror-and-componentdidcatch
https://react.docschina.org/docs/error-boundaries.html#component-stack-traces