React 生命周期函数详解

React 是一种流行的前端框架,它让开发者更快更方便地创建并管理 Web 应用程序。在 React 中,生命周期函数是至关重要的部分,它们可以方便地控制组件的加载、更新和销毁的过程。本文将深入探讨 React 生命周期函数的作用、使用方法、钩子函数执行的顺序,以及常见使用场景。

生命周期函数用途

在 React 组件中使用生命周期函数可以帮助开发者处理不同的场景。例如,在组件渲染到页面之前,我们可以在生命周期函数中添加一些逻辑,例如从后端获取数据、初始化状态等;在组件更新时,我们可以使用生命周期函数来检测数据变换、更新组件状态等。

生命周期图表

在深入研究 React 生命周期函数工作原理之前,我们需要先了解一下不同的生命周期函数的执行顺序。以下是一个图表展示。

根据图表,我们可以将 React 生命周期函数分为以下几种不同的类别:

  • Mounting:组件从 HTML 中构建成 DOM。这个过程只会执行一次。
  • Updating:组件被更新,通常是由于 props 或者 state 改变而导致。
  • Unmounting:组件从 DOM 中卸载,通常是因为它不再被需要了。
  • Error Handling:当 React 组件发生错误时,这些函数会被调用。

现在,我们来逐一讨论这些生命周期函数。

Mounting

在组件的生命周期中,Mounting 阶段是最先执行的。这个阶段发生在组件第一次加载时。以下是 React Mounting 阶段中所有可能被执行的生命周期函数:

constructor()

构造函数是一个 React 组件中的非常重要的函数,它是组件实例化时执行的第一个函数。构造函数通常用于初始化组件的状态(State),并通过 super(props) 继承引入 props 对象。

----- ----------- ------- --------------- -
  ------------------ -
    -------------
    ---------- - ------- ---
  -
-

static getDerivedStateFromProps(props, state)

组件的 getDerivedStateFromProps 生命周期函数的主要作用是让组件在更新前,state 对象(或者说组件状态)能够通过传入的新 props 对象进行更新、重新赋值。

该函数返回值对象会与原 state 进行合并,具体过程需要注意以下几点:

  • 该方法是静态方法,因此不能访问 this 对象
  • 在挂载阶段和更新阶段均会被调用
  • 若返回值为 null,则表示不暴露 state 对象
  • 如果应该更新则返回新的 state 对象,否则返回 null,表示不进行更新
----- ----------- ------- --------------- -
  ------------------ -
    -------------
    ---------- - ------- ---
  -

  ------ ------------------------------- ------ -
      -- -- -----
      -- ------------ --- ------------ -
        ------------------------ -------------
        ------ -
          ------ -----------
        --
      -
      -- -----
      ------ -----
  -
-

render()

React 的 render 函数是必须的,它是组件的最主要部分。React 会用它来创造实际的 DOM 元素并返回一个 React 元素的描述对象,可理解为 React-land 中的虚拟 DOM。

该函数的返回值应该是唯一的根节点,而且必须被包含在一个盒子里(这通常是一个 div 对象)。在该函数的调用内部,可以使用 this.props 来获取传递给组件的属性(props)和 this.state 访问定义在函数内部的组件状态。

----- ----------- ------- --------------- -
  ------------------ -
    -------------
    ---------- - ------- ---
  -

  ------ ------------------------------- ------ -
    -- -- -----
  -

  -------- -
    ------ -
      -----
        --------- ----------------------
      ------
    --
  -
-

componentDidMount()

组件挂载已经完成,并且元素已经在 DOM 中显示,componentDidMount 被调用。在这个函数内部,可以做一些基于 DOM 的操作,例如从远程接口(API)中获取数据、添加事件(event)监听、获取 URL 参数等等。

----- ----------- ------- --------------- -
  ------------------ -
    -------------
    ---------- - ------- ---
  -

  ------ ------------------------------- ------ -
    -- -- -----
  -

  -------- -
    ------ -
      -----
        --------- ----------------------
      ------
    --
  -

  ------------------- -
    -- -------------- --- --
    ------------------------------ -- -
      --------------- ----- ------ ---
    ---
  -
-

Updating

在 React 中,“Updating” 是指组件根据变化而更新。在组件的生命周期中,更新阶段发生在更新后。更新阶段涉及以下的生命周期函数:

static getDerivedStateFromProps(props, state)

如前所述, getDerivedStateFromProps 函数也能够在更新阶段中运行,它会在组件接收新的 props 值或者 state 值时被调用。

shouldComponentUpdate(nextProps, nextState)

该函数用于判断是否继续更改组件状态。它必须返回一个布尔值,指示是否应该调用 render() 函数并使 DOM 保持一致。如果返回 false,则 React 将通过跳过更新阶段优化性能。

----- ----------- ------- --------------- -
  -------------------------------- ---------- -
    -- ----------------- --- ---------------- -
        ------ ------
    -
    ------ -----
  -
-

render()

在 componentWillMount() 函数之前运行,render() 函数在更新阶段中能够显示组件的新状态,并使用 React 描述 DOM 元素。在更新阶段中,使用相同的 props 和 state 重新运行 render() 函数,并使用该函数返回的描述对象更新 UI。

componentDidUpdate(prevProps, prevState, snapshot)

在组件的更新阶段中,将在“Updating”阶段结束后调用 componentDidUpdate() 函数。该函数与 componentDidMount() 函数类似,都可执行一些操作,例如从 API 获取数据、修改 DOM 等。

----- ----------- ------- --------------- -
  ----------------------------- ---------- --------- -
    -- ------------- --- -------------- -
      ------------------------------
    -
  -
-

Unmounting

在组件的生命周期过程中,Unmounting 阶段表示该组件不再需要,并从 DOM 中卸载。以下函数是 Unmounting 阶段中的生命周期函数:

componentWillUnmount()

该函数在组件被卸载时运行,执行一些基于 DOM 对象的操作,如释放事件监听器或取消定时器。

----- ----------- ------- --------------- -
  ---------------------- -
    ------------------------------------- ------------------
  -
-

Error Handling

在 React 组件开发中,可能会出现一些错误,包括捕获到的 JavaScript 错误或 React 可能的错误等。如果组件中执行的某些函数抛出错误,那么 React 会照顾到它,进入 Error Handling 阶段。

以下是与 Error Handling 阶段中的挂钩函数:

static getDerivedStateFromError(error)

该函数将在组件的子项或组件自身抛出异常时被调用。该函数的参数是已被抛出异常的对象。该函数将返回一个状态对象,以指示该组件遇到错误。

componentDidCatch(error, info)

该函数用于在组件发生错误时捕获相关信息,例如错误信息、发生错误的代码位置以及函数调用栈。这些信息可能用于帮助调试代码,但是不能对用户发送错误信息。

----- ----------- ------- --------------- -
  ------ ------------------------------- -
    ------ - --------- ---- --
  -

  ------------------------ ----- -
    -------------------------- ---------------------
  -

  -------- -
    -- --------------------- -
      ------ --------- --------- ---- ------------
    -
    ------ --------------------
  -
-

结论

React 生命周期函数可以帮助开发人员在多个场景下更好地管理组件的构建和销毁过程,并优化组件加载的性能。通过深入了解每个生命周期函数的用途,我们可以更好地应用这些函数到我们自己的 React 组件中。希望你通过本文详细了解 React 生命周期函数的使用方法,并成功运用到你的 React 项目中去。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671df6d92e7021665ef4b3c0