React 16.8前后生命周期的变化

247 阅读3分钟

React 16.8前后的生命周期发生了显著的变化,这些变化主要是为了引入Hooks并改进组件的性能和可维护性。以下是对React 16.8前后生命周期变化的详细解释:

React 16.8之前的生命周期

在React 16.8之前,组件的生命周期主要包括以下几个阶段:

  1. 挂载阶段(Mounting):

• constructor():构造函数,最先被执行,用于初始化state或绑定方法。

• componentWillMount():组件即将挂载到DOM之前调用,但通常不推荐在这里进行副作用操作,因为React可能会在未来的版本中废弃这个方法。

• render():渲染函数,返回需要渲染的JSX。

• componentDidMount():组件挂载到DOM后立即调用,适合进行网络请求、订阅等副作用操作。

  1. 更新阶段(Updating):

• shouldComponentUpdate():决定组件是否应该重新渲染,返回true或false。

• componentWillReceiveProps():当组件接收到新的props时调用,但同样不推荐在这里进行副作用操作。

• componentWillUpdate():组件即将更新之前调用。

• render():再次渲染组件。

• componentDidUpdate():组件更新后立即调用,适合进行DOM操作或更新后的副作用处理。

  1. 卸载阶段(Unmounting):

• componentWillUnmount():组件即将从DOM中移除时调用,适合进行清理操作,如取消网络请求、清除定时器等。

React 16.8及之后的生命周期

在React 16.8及之后的版本中,生命周期发生了一些变化,主要引入了Hooks,并对一些旧的生命周期方法进行了废弃或修改:

  1. 挂载阶段(Mounting):

• constructor():仍然保留,用于初始化state或绑定方法。

• static getDerivedStateFromProps():这是一个静态方法,用于在render之前根据props更新state。它会在每次渲染之前调用,包括初始化和更新阶段。

• render():渲染函数,没有变化。

• componentDidMount():仍然保留,用于进行副作用操作。

  1. 更新阶段(Updating):

• static getDerivedStateFromProps():同样会在更新阶段调用,用于根据新的props更新state。

• shouldComponentUpdate():仍然保留,用于决定是否重新渲染组件。

• getSnapshotBeforeUpdate():这是一个新的生命周期方法,它在最近一次渲染输出(提交到DOM节点)之前调用,允许组件在更改之前从DOM中捕获一些信息(如滚动位置)。

• render():渲染函数,没有变化。

• componentDidUpdate():仍然保留,用于进行更新后的副作用处理。

  1. 卸载阶段(Unmounting):

• componentWillUnmount():仍然保留,用于进行清理操作。

废弃的生命周期方法

在React 16.8之后的版本中,以下生命周期方法被废弃或计划废弃:

• componentWillMount():已被废弃,并在React 17中添加了UNSAFE_前缀。

• componentWillReceiveProps():已被废弃,并在React 17中添加了UNSAFE_前缀。

• componentWillUpdate():已被废弃,并在React 17中添加了UNSAFE_前缀。

这些被废弃的方法通常不推荐在新代码中使用,因为它们可能会导致性能问题或难以维护的代码。相反,建议使用新的Hooks API或现有的生命周期方法(如componentDidMount、componentDidUpdate等)来实现相同的功能。

总的来说,React 16.8及之后的版本通过引入Hooks和修改生命周期方法,为开发者提供了更灵活、更强大的组件开发方式。