React16 之后有三个生命周期被废弃(但并没有删除)
componentWillMount
componentWillReceiveProps
componentWillUpdate
官方计划在17版本完全删除这三个函数,只保留UNSAVE_前缀的三个函数,目的是为了向下兼容,但是对于开发者而言应该尽量避免使用他们,而是使用新增的生命周期函数替代它们。
目前React 16.8+ 的生命周期氛围三个阶段,分别是挂载阶段,更新阶段,卸载阶段
挂载阶段
constructor
: 构造函数,最先被执行,我们通常在构造函数里初始化 state 对象或者给自定义方法绑定thisgetDerivedStateFromProps
:static getDerivedStateFromProps(nextProps, prevState),
这是个静态方法,此方法必须要有返回值,返回一个对象,或者返回 null,返回 null 则不更新任何内容, 当我们接收到新的属性想去修改state, 可以使用getDerivedStateFromProps
- render: render函数是纯函数,只返回需要渲染的东西,不应该包含其他的业务逻辑,可以返回原生的DOM、React 组件、Fragment、Portals、字符串和数字、Boolean 和 null 等内容
- componentDidMount: 组件状态之后调用,此时我们可以获取到 DOM 节点并操作,比如对 canvas svg 的操作,服务器请求,订阅都可以写在这里,但是记得要在 componentWillunMount 中取消订阅
更新阶段
getDerivedStateFormProps
: 此方法在更新挂在阶段都可能回调用shouldComponnetUpdate
:shouldComponentUpdate(nextProps, nextState)
有两个参数 nextProps和 nextState, 标识更新的属性和变化之后的 state, 返回一个布尔值,true 标识会触发重新渲染,false 标识不会触发重新渲染,默认返回 true, 我们通常利用此声明周期来优化 React 程序性能。render
: 更新阶段也会触发此生命周期getSnapshotBeforeUpdate
:getSnapshotBeforeUpdate(prevProps, prevState)
这个方法在 render 之后, componentDidUpdate 之前调用,有两个参数 prevProps 和 prevState,标识之前的属性和之前的 state, 这个函数有一个返回值,会作为第三个参数传给 componentDidUpdate,如果不想要返回值, 可以返回 null, 此生命周期必须与 componentDidUpdate 搭配使用componentDidUpdate
:componentDidUpdate(prevProps, prevState, snapshot),
该方法在getSnapshotBeforeUpdate方法之后被调用,有三个参数prevProps,prevState,snapshot,表示之前的props,之前的state,和snapshot。第三个参数是getSnapshotBeforeUpdate返回的,如果触发某些回调函数时需要用到 DOM 元素的状态,则将对比或计算的过程迁移至 getSnapshotBeforeUpdate,然后在 componentDidUpdate 中统一触发回调或更新状态。
卸载阶段:
componentWillUnmount
: 会在组件卸载以及销毁之前调用,在此方法中执行必要的清理操作,例如,清除定时器,取消网络请求或者清除在 componentDidMount() 中创建的订阅,清理无效的DOM元素等垃圾清理工作
异常处理
static getDerivedStateFromError
: 此声明周期会在渲染阶段后代组件抛出错误后被调用,他将抛出的错误作为参数,并返回一个值以更新 statecomponentDidCatch
: 此生命周期在后代组件抛出错误后背调用,他接受两个参数: error —— 抛出的错误。2. info —— 带有 componentStack key 的对象,其中包含有关组件引发错误的栈信息。componentDidCatch 会在“提交”阶段被调用,因此允许执行副作用。 它应该用于记录错误之类的情况。