当前位置: 首页 > news >正文

React组件的生命周期函数

文章目录

    • React组件生命周期
      • 认识生命周期
      • 生命周期函数
      • 不常用生命周期函数

React组件生命周期

认识生命周期

很多的事物都有从创建到销毁的整个过程,这个过程称之为是生命周期;

React组件也有自己的生命周期,了解组件的生命周期可以让我们在最合适的地方完成自己想要的功能;

生命周期和生命周期函数的关系如下:

生命周期是一个抽象的概念,在生命周期的整个过程,分成了很多个阶段

比如装载阶段(Mount),组件第一次在DOM树中被渲染的过程;

比如更新过程(Update),组件状态发生变化,重新更新渲染的过程;

比如卸载过程(Unmount),组件从DOM树中被移除的过程;

React内部为了告诉我们当前处于哪些阶段,会对我们组件内部实现的某些函数进行回调,这些函数就是生命周期函数

比如实现componentDidMount函数:组件已经挂载到DOM上时,就会回调;

比如实现componentDidUpdate函数:组件已经发生了更新时,就会回调;

比如实现componentWillUnmount函数:组件即将被移除时,就会回调;

我们可以在这些回调函数中编写自己的逻辑代码,来完成自己的需求功能;

我们谈React生命周期时,主要谈的类的生命周期,因为函数式组件是没有生命周期函数的;(后面我们可以通过hooks来模拟一些生命周期的回调)


生命周期函数

我们先来学习一下最基础、最常用的五个生命周期函数

Constructor

组件中第一个调用的生命周期函数, 如果不初始化 state 或不进行方法绑定,则不需要为 React 组件实现构造函数。

constructor中通常只做两件事情:

  1. 通过给 this.state 赋值对象来初始化内部的state;
  2. 为事件绑定实例(this);

render

render函数也是组件的生命周期函数, 它的使用方法上一篇文章有讲解过, 这里不再过多赘述

componentDidMount

componentDidMount() 会在组件挂载后(插入 DOM 树中)立即调用。

componentDidMount中通常进行哪里操作呢?

  1. 依赖于DOM的操作可以在这里进行;
  2. 在此处发送网络请求就最好的地方;(官方建议)
  3. 可以在此处添加一些订阅(会在componentWillUnmount取消订阅);

componentDidUpdate

componentDidUpdate() 会在更新后会被立即调用,首次渲染不会执行此方法。

当组件更新后,可以在此处对 DOM 进行操作;

如果你对更新前后的 props 进行了比较,也可以选择在此处进行网络请求;(例如,当 props 未发生变化时,则不会执行网络请求)。

componentWillUnmount

componentWillUnmount() 会在组件卸载及销毁之前直接调用。

在此方法中执行必要的清理操作;

例如,清除 timer,取消网络请求或清除在 componentDidMount() 中创建的订阅等;

上面这五个生命周期函数是我们最常用的, 它们的执行时机可以参考下面这幅图片

首先执行constructor函数

其次执行render函数, 将render函数的结果进行渲染

紧接着会将组件挂载到DOM上, 挂载完成执行componentDimMount函数

当数据发生改变, 会重新调用render函数, 等待数据更新完成后会调用componentDidUpdate函数

组件卸载或销毁之前, 调用componentWillUnmount

在这里插入图片描述

演示代码

export class App extends Component {
  constructor() {
    console.log("constructor被调用")
    super()

    this.state = {
      message: "Hello World"
    }
  }

  btnClick() {
    this.setState({ message: "你好啊" })
  }

  render() {
    console.log("render被调用")
    const { message } = this.state
    return (
      <div>
        <button onClick={() => this.btnClick()}>按钮</button>
        <h2>{ message }</h2>
      </div>
    )
  }

  componentDidMount() {
    console.log("componentDidMount被调用")
  }

  componentDidUpdate() {
    console.log("componentDidUpdate被调用")
  }

  componentWillUnmount() {
    console.log("componentWillUnmount被调用")
  }
}

不常用生命周期函数

除了上面介绍的生命周期函数之外,还有一些不常用的生命周期函数(注意这个不常用不是我说的, 实在React官网中, 官方列举的)

  • 下面三个不常用的生命周期getSnapshotBeforeUpdateshouldComponentUpdate是相对有用的

getDerivedStateFromProps:state 的值在任何时候都依赖于 props时使用;该方法返回一个对象来更新state;

getSnapshotBeforeUpdate:在React更新DOM之前回调的一个函数,可以获取DOM更新前的一些信息(比如说滚动位置);

shouldComponentUpdate:该生命周期表示, 是否需要重新更新render函数进行渲染, 返回true表示需要, 返回false表示不需要, 这个生命周期函数还是很常用,但是我们等待讲性能优化时再来详细讲解;

在这里插入图片描述

另外,React中还提供了一些过期的生命周期函数,这些函数已经不推荐使用

更详细的生命周期相关的内容,可以参考官网: https://zh-hans.reactjs.org/docs/react-component.html

相关文章:

  • FFmpeg源码分析:avformat_open_input()打开媒体流
  • 深入理解关键字 一(auto,register,static,sizeof)
  • 基于Springboot+vue的停车场管理系统(Java毕业设计)
  • 详解CAN总线:CAN总线报文格式—数据帧
  • mysql进阶:canal实现mysql数据同步到redis|实现自定义canal客户端
  • React路由三种渲染方式、withRouter高阶组件、自定义导航组件
  • FaceNet-pytorch(fixing data imbalance-CASIA)
  • 【内核的设计与实现笔记】| 【01】初步了解内核
  • 【HDLBits 刷题】所有答案直达链接汇总
  • portswigger 目录遍历文件上传
  • 【微信小程序入门到精通】— swiper 超详细的属性值讲解!确定不来看看?
  • [单片机框架][device层] fuelgauge 电量计
  • 基于linux的web服务器(问题)
  • 【leetcode top100】两数相加。无重复字符的最长子串,盛水最多的容器,三数之和
  • PIE-Engine 教程:水稻面积提取1(宿迁市)
  • ES6指北【2】—— 箭头函数
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • eclipse(luna)创建web工程
  • HTTP--网络协议分层,http历史(二)
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • spring-boot List转Page
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 服务器从安装到部署全过程(二)
  • 将回调地狱按在地上摩擦的Promise
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 一个JAVA程序员成长之路分享
  • #1014 : Trie树
  • (1)Nginx简介和安装教程
  • (AngularJS)Angular 控制器之间通信初探
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (ros//EnvironmentVariables)ros环境变量
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (南京观海微电子)——COF介绍
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)菜鸟学数据库(三)——存储过程
  • .NET MVC第三章、三种传值方式
  • .NET/C# 使用反射注册事件
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @RequestMapping-占位符映射
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [AIGC] MySQL存储引擎详解
  • [C/C++]数据结构 栈和队列()
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [EFI]DELL XPS13 9360电脑 Hackintosh 黑苹果efi引导文件
  • [ES-5.6.12] x-pack ssl
  • [javaee基础] 常见的javaweb笔试选择题含答案
  • [JAVA设计模式]第二部分:创建模式
  • [jQuery]div滚动条回到最底部
  • [LeetCode] Contains Duplicate
  • [Linux打怪升级之路]-信号的保存和递达
  • [luoguP1666] 前缀单词(DP)
  • [MFC] MFC消息机制的补充