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)
更新阶段是指组件的 props
或 state
发生变化,导致组件重新渲染的过程。这个阶段涉及以下生命周期钩子:
componentWillReceiveProps(nextProps)
- 调用时机:在组件接收到新的
props
时调用。 - 作用:可以根据新的
props
更新组件的状态。 - 注意:在 React 16.3 之后,这个钩子被标记为不推荐使用(
UNSAFE_componentWillReceiveProps
),建议使用static getDerivedStateFromProps
替代。
- 调用时机:在组件接收到新的
shouldComponentUpdate(nextProps, nextState)
- 调用时机:在组件接收到新的
props
或state
时调用。 - 作用:决定组件是否需要重新渲染。返回
true
表示需要重新渲染,返回false
表示不需要。 - 注意:可以通过这个钩子优化性能,避免不必要的渲染。
- 调用时机:在组件接收到新的
componentWillUpdate(nextProps, nextState)
- 调用时机:在组件即将重新渲染之前调用。
- 作用:可以在这里执行一些准备工作,但不能调用
this.setState
。 - 注意:在 React 16.3 之后,这个钩子被标记为不推荐使用(
UNSAFE_componentWillUpdate
),建议使用componentDidUpdate
替代。
render()
- 调用时机:在组件更新时调用。
- 作用:返回组件的 JSX 结构,描述组件应该如何重新渲染。
componentDidUpdate(prevProps, prevState)
- 调用时机:在组件重新渲染之后调用。
- 作用:可以在这里执行 DOM 操作、发起网络请求或更新状态等。
- 注意:可以在这里比较
prevProps
和prevState
,以确定是否需要执行某些操作。
3. 卸载阶段(Unmounting)
卸载阶段是指组件从 DOM 中移除的过程。这个阶段涉及以下生命周期钩子:
componentWillUnmount()
- 调用时机:在组件即将从 DOM 中移除之前调用。
- 作用:可以在这里执行清理操作,如取消网络请求、清除定时器或移除事件监听器等。
- 注意:这是执行清理操作的理想位置,因为此时组件即将被销毁。
4. 错误处理(Error Handling)
React 16 引入了错误边界(Error Boundaries)的概念,用于捕获子组件中的 JavaScript 错误,并显示备用 UI。错误处理涉及以下生命周期钩子:
componentDidCatch(error, info)
- 调用时机:在子组件抛出错误时调用。
- 作用:可以在这里记录错误信息或显示备用 UI。
- 注意:错误边界只能捕获子组件中的错误,不能捕获自身抛出的错误。
总结
React 生命周期钩子为开发者提供了在组件不同阶段执行代码的能力。然而,随着 React 的演进,一些生命周期钩子被标记为不推荐使用(如 componentWillMount
、componentWillReceiveProps
和 componentWillUpdate
),建议使用新的生命周期钩子(如 getDerivedStateFromProps
和 getSnapshotBeforeUpdate
)或 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
)来管理组件的生命周期,因为它们提供了更简洁和灵活的方式来处理副作用和状态管理。