美文网首页react-native之旅
浅谈React16组件的生命周期

浅谈React16组件的生命周期

作者: 想要飞的蜗牛 | 来源:发表于2018-10-15 21:35 被阅读0次

React在16版本的时候对组件的生命周期函数作出了一些修改,这里我们简单来了解一下新的生命周期函数。

组件生命周期概述

1、初始化

在组件初始化阶段会执行

  1. constructor
  2. static getDerivedStateFromProps()
  3. render()
  4. componentDidMount()

componentWillMount() / UNSAFE_componentWillMount() 函数可能会被废弃,所以尽量避免在新的代码中使用

2.更新阶段

props或state的改变可能会引起组件的更新,组件重新渲染的过程中会调用以下方法:

  1. static getDerivedStateFromProps()
  2. shouldComponentUpdate()
  3. render()
  4. getSnapshotBeforeUpdate()
  5. componentDidUpdate()

componentWillReceiveProps() / UNSAFE_componentWillReceiveProps() 和componentWillUpdate() / UNSAFE_componentWillUpdate() 可能会被废弃所以尽量避免在新的代码中使用

3.卸载阶段

1.componentWillUnmount()

4.错误处理

1.componentDidCatch()

以上生命周期我们可以通过下图更加直观的查看

react 生命周期图
由于其他的生命周期函数我们都比较熟悉,所以这里主要讲一下新的两个函数getDerivedStateFromProps()和getSnapshotBeforeUpdate();

当我们需要基于Props更新State时,之前我们通常都做法是使用如下代码

class ExampleComponent extends React.Component{
  state = {
    isSuccess: false,
  };

  componentWillReceiveProps(nextProps) {
    if (this.props.currentRow !== nextProps.currentRow) {
      this.setState({
        isSuccess:true
      });
    }
  }
}

尽管上面的代码本身并没有问题,但componentWillReceiveProps生命周期通常会被错误地用于解决问题。因此,该方法将被弃用。

既然 componentWillReceiveProps 要被废除了,那么,还有其他的方法能根据 prop 的改变更新 state 吗?这里就要用到新引进的那个静态方法了。这里说的静态和其他语言的概念是一样的,它是存在于类自身的方法,不依赖实例的创建。与一般的类方法的区别在于它不能访问 this 关键字,还有就是方法前面有个 static 修饰符。但是有一个问题,既然访问不到 this 了,那还怎么用 this.setState 来更新状态呢?答案是,“压根就不需要用这个方法了”,你只需要返回新的状态就行了,直接 return 出去,不需要用方法去设置。如果不需要更新状态,返回 null 就行了,此外,返回值的机制和使用 setState 的机制是类似的 —— 你只需要返回发生改变的那部分状态,其他的值会保留

class ExampleComponent extends React.Component{
  state = {
    isSuccess: false,
  };

  static getDerivedStateFromProps(nextProps, prevState) {
    if (nextProps.currentRow !== prevState.lastRow) {
      return {
        isSuccess:true,
      };
    }
    return null;
  }
}

如果同时定义了 getDerivedStateFromProps 和 componentWillReceiveProps,只有 getDerivedStateFromProps 会被调用,同时 React 还会打印出警告信息。


同时定义两个方法.png

新的生命周期 getSnapshotBeforeUpdate()

class Example extends React.Component{

  getSnapshotBeforeUpdate(prevProps, prevState) {

    // ...  }

}

新的getSnapshotBeforeUpdate生命周期在更新之前被调用(例如,在DOM被更新之前)。此生命周期的返回值将作为第三个参数传递给componentDidUpdate。 (这个生命周期不是经常需要的,但可以用于在恢复期间手动保存滚动位置的情况。)

与componentDidUpdate一起,这个新的生命周期将覆盖旧版componentWillUpdate的所有用例。

总结

在React16中即将被废除的方法如下:

componentWillMount —— 即将废除,使用 componentDidMount 作为替代

componentWillUpdate—— 即将废除,使用 componentDidUpdate 作为替代

componentWillReceiveProps—— 即将废除,使用新引进的方法 static getDerivedStateFromProps

不过我们也不用慌,这些方法现在都可以正常使用,不影响,到 16.4 版本才会正式打上“已废除”的标记,真正移除可能要到 17.0 以后。

如果你开启了 StrictMode 或是 AsyncMode,它只会提示你方法已经废除了,不想看到这些提示信息可以使用如下方法替代:

UNSAFE_componentWillMount

UNSAFE_componentWillReceiveProps

UNSAFE_componentWillUpdate

这些改变旨在引导开发者作出最佳实践,这也有益于适应将来全面开放的异步渲染模式(这也是 React 16 “Fiber” 的首要目标)

相关文章

  • React生命周期及减少render次数

    React生命周期 环境:react16 常用生命周期的钩子分类后,分布3个阶段内 初始化阶段 - 组件创建阶段才...

  • 浅谈React16组件的生命周期

    React在16版本的时候对组件的生命周期函数作出了一些修改,这里我们简单来了解一下新的生命周期函数。 组件生命周...

  • React中类组件与函数组件

    类组件 React 16.8+的生命周期分为三个阶段,分别是挂载阶段、更新阶段、卸载阶段。 react16之后有三...

  • ReactV16.3+新增的api

    React16新的生命周期弃用了componentWillMount、componentWillReceivePo...

  • 学习react hook的总结

    react16推出了react hook,react hook使得functional组件拥有了class组件的一...

  • react的生命周期钩子@郝晨光

    本人之前写在CSDN上的文章,原创转载至此;react的生命周期钩子 1、React16新的生命周期弃用了comp...

  • Activity从建立到显示、一些问题

    浅谈Activity从建立到显示: 1,Activity 是一个组件:掌控着一群View控件的逻辑和生命周期 2,...

  • 1组件的生命周期

    组件的生命周期:组件从创建到销毁的过程称为组件的生命周期。组件的生命周期通常分为三个阶段: 组件的挂在阶段。 组件...

  • 进阶react.js

    组件生命周期 组件的生命周期有助于理解组件的运行方式,完成更复杂的组件功能、分析组件错误原因等组件的生命周期: 组...

  • Flutter 生命周期研究与应用

    Flutter 生命周期包括了组件的生命周期以及App的生命周期。 一、组件生命周期 一个flutter组件主要分...

网友评论

    本文标题:浅谈React16组件的生命周期

    本文链接:https://www.haomeiwen.com/subject/phpqzftx.html