React 学习笔记:组件生命周期

news2024/11/17 5:39:11

组件生命周期

生命周期一个事物从创建到最后消亡经历的过程,在这个过程中会有不同的状态(新生儿、少年···),所以在 16.8 版本以前生命周期只有类组件才有,函数组件是没有这个概念的,因为它没有状态,本文就是总结类组件生命周期。

了解生命周期有助于我们理解组件的运行方式、完成更复杂的组件功能、分析组件错误原因。

挂载阶段

本阶段是首次渲染 DOM ,按以下顺序执行

  1. constructor 创建组件时,最先执行(不能在这里调用 setState 方法)。如果不初始化 state 或不进行方法绑定,就不需要实现构造函数。此时可以做以下事情:
    • 初始化 state
    • 使用 bind 解决 this 指向问题等
  2. getDerivedStateFromProps 这是一个静态方法,不常用。接收两个参数:
    • 第一个参数为即将更新的props
    • 第二个参数为上一个状态的state
  3. render 每次组件渲染都会触发 渲染UI(注意: 不能调用setState() ),此时还不能在浏览器上看到。
  4. componentDidMount 组件挂载(完成DOM渲染)后立即调用。此时可以做以下事情:
    • 发送网络请求
    • DOM操作

注意

  • 如果实现了 constructor 则应该在其他语句之前调用 super(props)。否则,this.props 在构造函数中可能会出现未定义的 bug。
  • 组件创建和更新阶段会调用 getDerivedStateFromProps,该方法需要返回一个新的对象作为新的 state 或者返回 null 表示 state 状态不需要更新。
  • 在 componentDidMount 中直接调用 setState(),会再次调用 render 方法,但不会看到中间态。
import { Component } from 'react'
export default class App extends Component {
  constructor () {
    super()
    console.log('1. constructor执行')
  }
  componentDidMount () {
    console.log('3. componentDidMount执行')
  }
  render() {
    console.log('2. render执行')
    return <div>App组件</div>
  }
}

更新阶段

触发更新的操作

  • setState()
  • forceUpdate() 强制组件更新
  • 组件接收到新的props
  • 父组件更新,子组件就会重新渲染

本阶段会按照以下顺序执行生命周期钩子函数

  1. getDerivedStateFromProps 同上。
  2. shouldComponentUpdate 告知组件本身基于当前的 props 和 state 是否需要重新渲染组件,默认为 true。不能调用 setState,否则会导致无限循环调用更新。
  3. render 每次组件渲染都会触发, 渲染UI(与 挂载阶段 是同一个render)。
  4. getSnapshotBeforeUpdate 该周期函数在 render 后执行,执行之时 DOM 元素还没有被更新,该方法返回的一个 Snapshot 值,作为 componentDidUpdate 第三个参数传入。此方法的目的在于获取组件更新前的一些信息,比如组件的滚动位置之类的
  5. componentDidUpdate 组件更新(完成DOM渲染)后立即调用(首次渲染不会执行此方法)。可以获取到更新后的DOM内容。

注意
在 componentDidUpdate 中可以直接调用 setState(),但它必须被包裹在一个条件语句里,否则会导致死循环。

import { Component } from 'react'
class Child extends Component {
  render() {
    return <h1>111</h1>
  }
}
export default class App extends Component {
  state = {
    count: 0
  }	
	handleClick = () => {
    this.setState({
      count: this.state.count + 1
    })
  }
  componentDidUpdate() {
    console.log('2. componentDidUpdate执行')
  }
  render() {
    console.log('1. render执行')
    return (
      <div>
        <Child />
        <button onClick={this.handleClick}>click</button>
      </div>
    )
  }
}

卸载阶段

在组件被移除的时候(消失)触发卸载阶段

  1. componentWillUnmount 组件卸载(从页面中消失) 执行清理工作(比如:清理定时器等)。
import { Component } from 'react'
class Child extends Component {
  componentWillUnmount () {
    console.log('componentWillUnmount执行')
  }
  render() {
    return <h1>{this.props.count}</h1>
  }
}
export default class App extends Component {
  state = {
    count: 0
  }
	handleClick = () => {
    this.setState({
      count: this.state.count + 1
    })
  }
  render() {
    return (
      <div>
        { this.state.count < 5 && <Child count={this.state.count} />}
        <button onClick={this.handleClick}>打豆豆</button>
      </div>
    )
  }
}

在这里插入图片描述
我是孤城浪人,一名正在前端路上摸爬滚打的菜鸟,欢迎你的关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Diffusion-LM Improves Controllable Text Generation 扩散语言模型改善可控文本生成

论文链接&#xff1a;https://arxiv.org/abs/2205.14217 代码链接&#xff1a;https://github.com/XiangLi1999/Diffusion-LM 一、简介 无需重训模型控制语言模型的表现是自然语言生成&#xff08;NLG&#xff09;的一个重要开放问题&#xff0c;近期工作已经在简单句子属性控…

解读小红书2022年母婴行业报告:心智种草的流量密码

母婴用户代际更迭&#xff0c;90后晋升为母婴消费主力军。新一代宝爸宝妈的关注点在哪里&#xff1f;品牌该如何通过小红书满足ta们的进阶需求&#xff0c;为母婴消费注入新活力&#xff1f; 本文将解读小红书官方发布的《2022年母婴行业人群洞察报告》&#xff0c;基于上千名用…

Ubuntu20运行SegNeXt代码提取道路水体(二)——SegNeXt源代码安装到测试环境配置全过程摸索

首先我们在第一篇里面已经下载了SegNeXt代码 打开源代码 查看readme文件 我们先安装一下里面提到的torchprofile 链接在这 其实只要这个语句就能安装 pip install torchprofile这一步没什么问题 很顺利 接下来继续按照他的教程走 我们在&#xff08;一&#xff09;已经安装了…

快手小程序怎么开发

快手小程序开发很简单&#xff0c;直接找一个快手小程序开发平台就可以。 大家可以按照下面这个步骤去完成&#xff0c;完成后就能开发出一个快手小程序啦。 操作像玩消消乐那么简单&#xff01; 不过在开发快手小程序前&#xff0c;需要先检查以下这几样东西有没有准备好&a…

小白学流程引擎-FLowable(五) — BPMN2.0模型规范

前言&#xff1a; 不用到处百度BPMN2的博客了&#xff0c;本篇文章带你系统掌握BPMN2规范的核心知识点。全文2万字&#xff0c;全覆盖BPMN2知识点&#xff0c;图文并茂&#xff0c;泡杯咖啡&#xff0c;慢慢细品&#xff5e; 一、BPMN是什么 BPMN&#xff08;Business Proces…

ChatGPT的理解

参考 李宏毅老师讲解 思维导图 ChatGPT 对标 instruct GPT 本质 GPT的社会化 训练过程 1 学习文字接龙 无监督学习 大量的自我学习 生成的答案具有随机性 自己修炼 2 人类老师引导文字接龙的方向 监督学习 标注:(问题提示&#xff0c;答案)对&#xff0c;引导gpt生…

10万字208道Java经典面试题总结(附答案)一

11、String 类的常用方法都有那些&#xff1f; equals、length、contains、replace、split、hashcode、indexof、substring、trim、toUpperCase、toLowerCase、isEmpty等等。 12、普通类和抽象类有哪些区别&#xff1f; 抽象类不能被实例化&#xff1b; 抽象类可以有抽象方法&…

分享米筐量化的使用方法

米筐量化都是量化金融分析经常会用到的数据提供平台&#xff0c;今天主要是来讲一下关于米筐量化的使用方法&#xff1a; 基本操作&#xff1a; 在这里把tushare和rqdatac是import为ts和rq&#xff0c;这import as会对之后的缩写产生影响。 例如&#xff1a; rq.get_price(o…

Docker网络模式

目录 网络模式 bridge模式(默认模式) host模式&#xff08;仅主机模式&#xff09; 初识网络模式 查看桥接模式 查看仅主机模式的特点 host模式 自定义网络 数据卷挂载tomcat 4.2自定义网络 网络模式 bridge模式(默认模式) docker run时使用–netbridge&#xff0c;这…

MySQL RR级别下,什么场景会产生不可重复读、幻读?

1 背景 最近在复习MySQL相关知识&#xff0c;忽然想到MVCC真的能完全解决不可重复读、幻读问题吗&#xff1f;于是做了下述测试。 2 准备环境 MySQL版本&#xff1a; ➜ ~ mysql --version mysql Ver 8.0.31 for macos12 on x86_64 (MySQL Community Server - GPL)MySQL隔…

Python学习-8.2.2 库(wordcloud库的基础与实例)

第三方库的介绍及安装方式见&#xff1a;&#xff1a;Python学习-8.库&#xff08;第三方库介绍与下载安装&#xff09; wordcloud库概述 词云概念 是由词汇组成类似云的彩色图形&#xff0c;可以过滤掉大量的文本信息&#xff0c;使读者只要一眼扫过文本就可以领略文本的主旨…

风控并行组合模型及其额度定价场景实践

昨天&#xff0c;我们分享过一篇文章《串行组合模型及信用评估场景实践》&#xff0c;里边详细介绍了串行组合模型的原理逻辑&#xff0c;以及在信用风险评估场景的具体实现过程。同时&#xff0c;从模型串联数量、排列顺序等多个维度验证了串行组合模型的合理性与有效性&#…

区块链赋能的6G零信任车联网可信接入方案

&#xff08;一&#xff09;文章素材摘录于 单位信息&#xff5c;广东工业大学北京邮电 郝敏博士团队 数据来源&#xff5c;电子与信息学报 基金项目&#xff5c;国家重点研发计划 &#xff08;二&#xff09;正文 随着三大运营商 5G 套餐于2019年底的相继上线&#xff0c;宣…

【C语言程序设计】实验 6

目录 1. 无理数e 2. 平面镜反数 3. 整数分解质因数 4. 素数回文 5. 阶乘和数 6. 输出星号图案 7. 验证哥德巴赫猜想 1. 无理数e 【问题描述】输入一个正整数&#xff0c;由下式e11/1!1/2!...1/n!求无理数e&#xff0c;保留9位小数。 【输入形式】一个正整数n(<…

pytorch基础操作(三)梯度下降(小批量)计算线性回归

1、线性模型 线性假设是指⽬标&#xff08;房屋价格&#xff09;可以表⽰为特征&#xff08;⾯积和房龄&#xff09;的加权和&#xff0c;如下⾯的式⼦&#xff1a; price warea area wage age b. 其中: warea和wage 称为权重&#xff08;weight&#xff09;&#xff0c;…

JAVA SCRIPT设计模式--结构型--设计模式之Composite组合模式(8)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能&#xff0c;所以不可能像C&#xff0c;JAVA等面向对象语言一样严谨&#xff0c;大部分程序都附上了JAVA SCRIPT代码&#xff0c;代码只是实现了设计模式的主体功能&#xff0c;不代…

进阶 - Git的Bug分支

本篇文章&#xff0c;是基于我自用Linux系统中的自定义文件夹“test_rep”&#xff0c;当做示例演示 具体Git仓库的目录在&#xff1a;/usr/local/git/test_rep Git的Bug分支 软件开发中&#xff0c;bug 就像家常便饭一样。有了 bug 就需要修复&#xff0c;在 Git 中&#xff…

LabVIEW与工具包版本的不兼容问题

前面的文章有介绍过&#xff0c;LabVIEW可以看做是一种编程语言&#xff0c;同时NI也在LabVIEW里提供了非常多的可快速构建专业应用的工具包模块&#xff0c;这些模块有的是用于专业数据采集的&#xff0c;有的是用于图像处理的&#xff0c;还有的可能是工业控制的。个人觉得这…

记一次InputStream流读取不完整留下的惨痛教训

前言 首先&#xff0c;问问大家下面这段流读取的代码是否存在问题呢&#xff1f; inputStream .... try {// 根据inputStream的长度创建字节数组byte[] arrayOfByte new byte[inputStream.available()];// 调用read 读取字节数组inputStream.read(arrayOfByte, 0, arrayOfB…

计算机毕业设计ssm+vue基本微信小程序的健康管理系统 uniapp 小程序

项目介绍 本文介绍了使用微信小程序技术开发健康管理系统的设计与实现过程,首先对实现该系统的技术进行分析,说明选择Java后台技术和MySQL数据库的必要性,然后对基于微信小程序的健康管理系统的需求进行分析。并接着对系统进行设计,包括架构设计、功能设计、数据库设计。最后进…