5.组件钩子函数

news2024/9/25 17:17:14

目录

1  生命周期与钩子函数

2  创建时

3  更新时

3.1  执行顺序

3.2  触发条件

3.3  componentDidUpdate()

4  卸载时


1  生命周期与钩子函数

类组件从 被挂载到页面中运行,到组件不用时卸载 之间是组件的生命周期

  • 只有类组件才有生命周期

生命周期的每个阶段可以使用一些方法,这些方法称为钩子函数(很像中间件)

生命周期有三个阶段,依次是 创建时,更新时,卸载时。在下图中 constructor,render,componentDidMount,componentDidUpdate.componentWillUnmount 是钩子函数

上面这张图只是常用的钩子函数,还有很多不常用钩子函数可以去看文档

2  创建时

在创建时会依次执行 constructor,render,componentDidMount

我们测试一下这三个钩子函数的执行顺序

这三个函数的触发机制是这样的

render()每一次渲染都会触发,所以在更新的时候也会触发。由于setState()会改变组件状态导致组件渲染,组件渲染会执行render(),所以一般不在render()中调用setState()

如果实在要调用,需要给setState()一个条件,这样就不会陷入死循环,它只会提示一个warning

只有在渲染元素后才能用 document.querySelector()这种方法获取到元素,所以我们一般在componentDidMount进行渲染后的操作

3  更新时

更新时会依次触发 render()与 componentDidUpdate()

componentDidUpdate()在更新后触发,所以在componentDidUpdate()中使用setState()也要放在一个条件中使用,在componentDidUpdate()条件使用setState()不会出现warning

3.1  执行顺序

打开后会先执行父子组件的两个render(),但并不执行componentDidUpdate()

点击按钮后会再次执行render(),子组件先更新完成,所以子组件先执行componentDidUpdate

3.2  触发条件

有三种情况会触发更新

  • New props 接收到外部新的数据
  • setState() 自身设置了新的数据
  • forceUpdate() 调用forceUpdate()时会强制更新一次

在上面的例子中,通过props更新了子组件,通过setState()更新了父组件

使用forceUpdate()也可以更新组件

点击按钮后可以触发render()与componentDidUpdate()

3.3  componentDidUpdate()

componentDidUpdate()可以使用参数prevProps,prevProps表示 本次的上一次更新 的props

我们看一下prevProps顺便验证一下在componentDidUpdate()中条件使用setState(),如果上一次与这一次的props不一致就重新渲染一遍

由于我在子组件的componentDidUpdate()加入了setState(),所以子组件的componentDidUpdate()执行了两次

父组件的componentDidUpdate()没有加入setState(),所以只执行了一次

4  卸载时

测试代码是这样的

class Child extends React.Component {
  componentWillUnmount() {
    console.log('子组件的componentWillUnmount')
  }

  render() {
    return (
      <div>count是{this.props.count}</div>
    )
  }
}

class Father extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      count:0
    }
  }

  add_one = ()=>{
    this.setState({count:this.state.count + 1})
  }

  p_or_Child = ()=>{
    if (this.state.count >=1) {
      return <p>不再渲染Child组件</p>
    }

    else {
      return <Child count={this.state.count}></Child>
    }
  }

  componentWillUnmount() {
    console.log('父组件的componentWillUnmount')
  }

  render() {
    return (
      <div>
        {this.p_or_Child()}
        <button onClick={this.add_one}>+1</button>
      </div>
    )
  }
}

ReactDOM.createRoot(document.querySelector('div')).render(<Father></Father>)

点击一次后用p标签代替组件Child,这样就会触发Child卸载

定义父组件与子组件的 componentWillUnmount()

点击之前是这样的

点击之后只触发了子组件的componentWillUnmount()

通常我们会在componentWillUnmount()中清楚组件遗留的内容,比如使用setInterval()定义的定时器,当组件消失后 使用setInterval()定义的定时器 并不会随组件的消失而消失,

点之前定时器在运行

点之后定时器还在运行

所以我们需要在componentWillUnmount()进行手动清除

这样点击完毕之后定时器就不再运行了

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

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

相关文章

MATLAB算法实战应用案例精讲-【数模应用】概率生成模型(Generative Model)(补充篇)

前言 几个高频面试题目 非概率模型和概率模型的区别 非概率模型 非概率模型指的是直接学习输入空间到输出空间的映射h,学习的过程中基本不涉及概率密度的估计,概率密度的积分等操作,问题的关键在于最优化问题的求解。通常,为了学习假设 ,我们会先根据一些先验知识(pri…

道路千万条,安全第一条

我是腾讯安全的冯帆&#xff0c;主要在MMS安全服务团队负责交通行业保障工作。每年春节对交通行业来说都是一次考验&#xff0c;尤其是今年春运&#xff0c;也是三年来最具规模的一次“大考”。因此我们今年投入的人力&#xff0c;包括值守团队&#xff0c;也是这些年最多的一次…

Eclipse中的Classpath及【其与buildpath之间的关系】

Eclipse中的Classpath及【其与buildpath之间的关系】简介.classpath文件设置和查看方法通过eclipse设置通过Java代码设置通过eclipse菜单查看通过Java代码输出查看classpath及与buildpath之间的关系简介 Classpath .classpath文件 .classpath文件用于记录项目编译环境的所有…

第五届字节跳动青训营 前端进阶学习笔记(九)Node.js 与前端开发实战

文章目录前言Node.js的应用场景1.典型应用场景Node.js运行时结构特点Node.js实战1.搭建一个基本的http服务器2.返回json数据3.编写一个简单的静态服务器4.SSR5.调试6.部署总结前言 本堂课程重点内容&#xff1a; Node.js的应用场景Node.js的运行时结构Node.js实战 Node.js的应…

使用Markdown写出一份漂亮的简历

文章目录背景Markdown编辑器开始写你的简历个人优势项目经历            牧竹子个人技能公司经历项目经验XXXXXX项目 202N.N0.15-202N.N.N导出文档格式高级版修改样式背景 每当你要更新简历时是否因为各个平台不同输入框而陷入适配不同的模板&#xff0c;如此以来为…

全球开源学习平台Moodle

今天是正月初九&#xff0c;老苏开始上班了&#xff0c;起航新程&#xff0c;开工大吉&#xff01; 什么是 Moodle &#xff1f; Moodle 是一个开源的在线教育系统&#xff08;慕课&#xff09;。旨在为教育工作者、管理人员和学习者提供一个强大、安全且集成的系统&#xff0c…

DP背包问题

目录 一、前言 二、0/1背包 1、装箱问题&#xff08;lanqiaoOJ题号763&#xff09; 2、2022&#xff08;2022年国赛填空题&#xff0c;lanqiaoOJ题号2186&#xff09; 三、完全背包 1、小明的背包2&#xff08;lanqiaoOJ题号1175&#xff09; 四、分组背包 五、多重背包…

Kylin 4.0.1 分布式集群安装部署

目录1. 安装依赖2. 安装Kylin(kylin1上操作)2.1 下载解压2.2 修改conf/kylin.properties2.3 下载Mysql驱动包和创建Mysql数据库2.4 hive-site.xml复制到spark的conf目录2.5 配置环境变量(两台kylin服务器)2.6 kylin运行环境检查2.7 ConfigurationException问题(没有则忽略)2.8 …

神经网络--从0开始搭建全连接网络和CNN网络

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何从0开始搭建全连接网络和CNN网络&#xff0c;并通过实验简单对比一下两种神经网络的不同之处&#xff0c;本文目录较长&#xff0c;可以根据需要自动选取要看的内容~ 本文目录&#xff1a;一、搭建4层全…

Spark核心RDD详解(设计与运行原理,分区,创建,转换,行动与持久化)

RDD设计背景与概念 在实际应用中&#xff0c;存在许多迭代式算法&#xff08;比如机器学习、图算法等&#xff09;和交互式数据挖掘工具&#xff0c;这些应用场景的共同之处是&#xff0c;不同计算阶段之间会重用中间结果&#xff0c;即一个阶段的输出结果会作为下一个阶段的输…

go: GOPATH entry is relative; must be absolute path: “F:oocode“.

系列文章目录 文章目录系列文章目录前言一、可以先查看一下啊二、gopath和goroot变量要和设置的一致总结前言 在安装hertz 之类的 总会弹出go 的不合法 等 出现这样的错误 要不就是go的不合法 会爆红 说go无这种命令 go&#xff1a;术语“ go”未被识别为cmdlet&#xff0c;函…

Hystrix断路器

目录 一、概述 &#xff08;一&#xff09;分布式系统面临的问题 &#xff08;二&#xff09;Hystrix是什么 &#xff08;三&#xff09;能干吗 &#xff08;四&#xff09;官网 &#xff08;五&#xff09;Hystrix官宣&#xff0c;停更进维 二、Hystrix重要概念 &…

JAVA开发(springBoot之HikariDataSource)

HikariDataSource是springBoot自带的数据源管理工具。应该是有zaxxer公司提供贡献给spring社区的。它是一款优秀的数据库连接池工具&#xff08;新的东西一般会吹吹牛&#xff09;&#xff0c;号称 Java WEB 当前速度最快的数据源&#xff0c;相比于传统的 C3P0 、DBCP、Tomcat…

【数据结构】认识顺序表

目录 1、先来认识一下线性表 1.1、对非空的线性表或者线性结构的特点&#xff1a; 1.2、线性表的实现方式 2、顺序表 2.1、定义一个类&#xff0c;实现顺序表 2.2、顺序表的操作方法 2.2.1、打印顺序表&#xff08;display&#xff09; 2.2.2、获取顺序表的长度&#x…

Rancher 中使用 Longhorn 备份恢复数据卷

全文目录导航0. 前言1. NFS 安装配置1.1 安装 nfs 及 rpcbind1.2 创建共享目录1.3 配置访问权限1.4 限制 showmount -e 防止漏洞扫描1.5 防火墙配置2. Longhorn 备份配置2.1 在 Longhorn UI 中配置3. 数据卷备份恢复操作3.1 创建示例工作负载3.2 创建测试数据3.3 创建数据卷备份…

车载以太网 - SomeIP测试专栏 - SomeIP Header - 03

前面已经简单的介绍了整帧SomeIP报文的组成部分,由于Ethernet报文头都是通用的,因此不会做详细的介绍,当然后面在介绍TC8中的TCP、UDP、IPv4、IPv6的时候也会做简单的介绍。不过在这里就不做介绍了,我们直接介绍SomeIP。 SomeIP Header 一、Message ID Message ID是由Serv…

Web3中文|构建Web3融资交易:股权和内部代币分配的比例

2017年&#xff0c;首次币发行&#xff08;ICO&#xff0c;Initial Coin Offering&#xff0c;也称首次代币发售、区块链众筹&#xff0c;是用区块链把使用权和加密货币合二为一&#xff0c;来为开发、维护、交换相关产品或者服务的项目进行融资的方式&#xff09;的融资方式激…

聚观早报 | 抖音超市上线;首架国产大飞机 C919 完成首次飞行

今日要闻&#xff1a;抖音超市上线&#xff1b;首架国产大飞机 C919 完成首次飞行&#xff1b;小鹏汽车计划有 5 款车型上市&#xff1b;2023年春节档电影总票房67.58亿元&#xff1b;亚洲首富被空头重创抖音超市上线 1 月 28 日消息&#xff0c;抖音超市已上线抖音 App&#x…

Javadoc(文档注释)详解

Java 支持 3 种注释&#xff0c;分别是单行注释、多行注释和文档注释。文档注释以/**开头&#xff0c;并以*/结束&#xff0c;可以通过 Javadoc 生成 API 帮助文档&#xff0c;Java 帮助文档主要用来说明类、成员变量和方法的功能。文档注释只放在类、接口、成员变量、方法之前…

vue+element高度仿照QQ音乐,完美实现PC端QQ音乐

一.前言 QQ音乐官网&#xff1a;点击访问作者成品效果预览&#xff1a;点击访问作者其他博客成品汇总预览&#xff1a;点击访问 暂时源码并没有提供其他获取渠道&#xff0c;私聊作者获取即可&#xff0c;或通过博客后面名片添加作者&#xff0c;很简单&#xff01; 二.主要…