React 生命周期详解

128 阅读2分钟

介绍

生命周期分为三个阶段:

  • 挂载:已经插入真实dom
  • 渲染(更新):正在被重新渲染
  • 卸载:已经移出真实dom

那么,在这些阶段,会有哪些生命周期函数呢?

  • 挂载
    • constructor
    • getDerivedStateFromProps
    • render
    • componentDidMount
  • 渲染(更新)
    • getDerivedStateFromProps
    • shouldComponentUpdate
    • render
    • getSnapshotBeforeUpdate
    • componentDidUpdate
  • 卸载
    • componentWillUnmount

本篇讲的是React v16.3之后的组件生命周期函数

详解各个阶段生命周期函数

constructor

顾名思义,就是React组件的构造函数,通常,仅用于以下两种情况

  • 初始化state
  • 为事件处理函数绑定实例

不能在构造函数内调用this.setState()

因为this.setState会调用this.updater中的enqueueSetState, 而this.updater是注入的方式,在刚开始时(即constructor阶段,还没有注入新的updater),使用的是默认的updater,即会抛出一个error(warning)。而注入updater是在实例化组件后立即注入的,所以只有在constructor中使用this.setState无效。

getDerivedStateFromProps

static getDerivedStateFromProps(nextProps, state)

静态方法,在初始化和后续更新前被调用。

参数:第一个参数为即将更新的 props, 第二个参数为上一个状态的 state , 可以比较props 和 state来加一些限制条件,防止无用的state更新。

返回值:返回一个对象来更新 state, 如果返回 null 则不更新任何内容。

render

在React class组件唯一必须实现的方法,用于渲染DOM。

不要在 render 里面 setState, 否则会触发死循环导致内存崩溃。

componentDidMount

该生命周期方法在挂载后立即调用。可以在该方法发送网络请求,启用事件监听,调用this.setState()

shouldComponentUpdate

shouldComponentUpdate(nextProps, nextState)

该方法在组件更新前调用,可以控制组件是否更新,返回true则组件更新,false则不更新。

参数:第一个是即将更新的 props 值,第二个是即将更新后的 state 值。可以根据更新前后的 props 或 state 来比较加一些限制条件,决定是否更新,进行性能优化。

不要在 shouldComponentUpdate 里面 setState, 否则会触发死循环导致内存崩溃。

getSnapshotBeforeUpdate

在最近一次的渲染输出被提交之前调用。也就是说,在 render 之后,即将对组件进行挂载时调用。

它可以使组件在 DOM 真正更新之前捕获一些信息,此生命周期返回的任何值都会作为参数传递给 componentDidUpdate()。如不需要传递任何值,那么请返回 null

componentDidUpdate

该方法会在更新后会被立即调用。首次渲染不会执行。

参数:参数,第一个是上一次props值。 第二个是上一次state值。如果组件实现了 getSnapshotBeforeUpdate() 生命周期(不常用),第三个是“snapshot” 参数传递

componentWillUnmount

该方法在组件即将被卸载或销毁时调用。该方法主要用于移除事件监听,取消定时器等。