博主头像
<CodeEra />

心存敬畏 行有所止

React 生命周期钩子(旧)

React 生命周期钩子(Lifecycle Hooks)是 React 类组件中用于管理组件生命周期的方法。在 React 16.3 之前,React 的生命周期钩子分为三个阶段:挂载(Mounting)、更新(Updating)和卸载(Unmounting)。以下是这些生命周期钩子的详细说明:

1. 挂载阶段(Mounting)

挂载阶段是指组件被创建并插入到 DOM 中的过程。这个阶段涉及以下生命周期钩子:

  • constructor(props)

    • 调用时机:组件被创建时调用。
    • 作用:初始化组件的状态(this.state)和绑定事件处理函数。
    • 注意:在 constructor 中必须调用 super(props),否则 this.props 将会是 undefined
  • componentWillMount()

    • 调用时机:在组件挂载到 DOM 之前调用。
    • 作用:可以在这里进行一些准备工作,如设置初始状态或进行异步操作。
    • 注意:在 React 16.3 之后,这个钩子被标记为不推荐使用(UNSAFE_componentWillMount),建议使用 componentDidMount 替代。
  • render()

    • 调用时机:在组件挂载和更新时调用。
    • 作用:返回组件的 JSX 结构,描述组件应该如何渲染。
    • 注意render 必须是纯函数,不能在其中修改组件的状态或执行副作用。
  • componentDidMount()

    • 调用时机:在组件挂载到 DOM 之后调用。
    • 作用:可以在这里执行 DOM 操作、发起网络请求或设置定时器等。
    • 注意:这是执行副作用的理想位置,因为此时组件已经挂载到 DOM 中。

2. 更新阶段(Updating)

更新阶段是指组件的 propsstate 发生变化,导致组件重新渲染的过程。这个阶段涉及以下生命周期钩子:

  • componentWillReceiveProps(nextProps)

    • 调用时机:在组件接收到新的 props 时调用。
    • 作用:可以根据新的 props 更新组件的状态。
    • 注意:在 React 16.3 之后,这个钩子被标记为不推荐使用(UNSAFE_componentWillReceiveProps),建议使用 static getDerivedStateFromProps 替代。
  • shouldComponentUpdate(nextProps, nextState)

    • 调用时机:在组件接收到新的 propsstate 时调用。
    • 作用:决定组件是否需要重新渲染。返回 true 表示需要重新渲染,返回 false 表示不需要。
    • 注意:可以通过这个钩子优化性能,避免不必要的渲染。
  • componentWillUpdate(nextProps, nextState)

    • 调用时机:在组件即将重新渲染之前调用。
    • 作用:可以在这里执行一些准备工作,但不能调用 this.setState
    • 注意:在 React 16.3 之后,这个钩子被标记为不推荐使用(UNSAFE_componentWillUpdate),建议使用 componentDidUpdate 替代。
  • render()

    • 调用时机:在组件更新时调用。
    • 作用:返回组件的 JSX 结构,描述组件应该如何重新渲染。
  • componentDidUpdate(prevProps, prevState)

    • 调用时机:在组件重新渲染之后调用。
    • 作用:可以在这里执行 DOM 操作、发起网络请求或更新状态等。
    • 注意:可以在这里比较 prevPropsprevState,以确定是否需要执行某些操作。

3. 卸载阶段(Unmounting)

卸载阶段是指组件从 DOM 中移除的过程。这个阶段涉及以下生命周期钩子:

  • componentWillUnmount()

    • 调用时机:在组件即将从 DOM 中移除之前调用。
    • 作用:可以在这里执行清理操作,如取消网络请求、清除定时器或移除事件监听器等。
    • 注意:这是执行清理操作的理想位置,因为此时组件即将被销毁。

4. 错误处理(Error Handling)

React 16 引入了错误边界(Error Boundaries)的概念,用于捕获子组件中的 JavaScript 错误,并显示备用 UI。错误处理涉及以下生命周期钩子:

  • componentDidCatch(error, info)

    • 调用时机:在子组件抛出错误时调用。
    • 作用:可以在这里记录错误信息或显示备用 UI。
    • 注意:错误边界只能捕获子组件中的错误,不能捕获自身抛出的错误。

总结

React 生命周期钩子为开发者提供了在组件不同阶段执行代码的能力。然而,随着 React 的演进,一些生命周期钩子被标记为不推荐使用(如 componentWillMountcomponentWillReceivePropscomponentWillUpdate),建议使用新的生命周期钩子(如 getDerivedStateFromPropsgetSnapshotBeforeUpdate)或 Hooks API 来替代。

在 React 16.3 之后,推荐使用以下生命周期钩子:

  • static getDerivedStateFromProps(props, state)
  • getSnapshotBeforeUpdate(prevProps, prevState)
  • componentDidMount()
  • shouldComponentUpdate(nextProps, nextState)
  • componentDidUpdate(prevProps, prevState, snapshot)
  • componentWillUnmount()
  • componentDidCatch(error, info)

对于新项目,建议使用 React Hooks(如 useEffect)来管理组件的生命周期,因为它们提供了更简洁和灵活的方式来处理副作用和状态管理。

发表新评论