【React】: React的生命周期

news2024/11/19 6:21:20

概述

生命周期的每个阶段总是伴随着一些方法的调用,这些方法就是生命周期的钩子函数
钩子函数的作用:为开发人员在不同操作阶段提供了十几
只有 类组件 才有生命周期
生命周期的图片:

 同时有:

1.1 创建时 的生命周期执行顺序

 编写以下代码,从而验证constructor,render,componentDidMount的顺序:

class App5 extends React.Component
{
  constructor(props)
  {
    super(props)

    console.warn("生命周期钩子函数:constructor")
  }

  componentDidMount()
  {
    console.warn("生命周期钩子函数:componentDidMount")
  }

  render()
{
  console.warn("生命周期钩子函数:render")
  return (
<div>
<h3></h3>
<h1>统计豆豆被打的次数:</h1>
<button id='btn'>打豆豆</button>
</div>

  )
}
}

ReactDOM.render(<App5/>,document.getElementById('root9'))

在开发者工具中发现执行顺序为:

当然我们对这三个状态还有以下总结:

备注:不能在render里调用setstate的原因是:在render里既能够更新状态,也会更新ui,具体可以参考前面的生命周期图,render里调用setstate,而setstate也会继续调用render,这样就会导致递归调用,从而导致error。

一定要在render里进行调用setstate,我们可以采用箭头函数,同时可以将this从render当中抽离出来,这样相当于在生命周期的“更新时”再继续更新Ui,代码如下:

class AppThree extends React.Component
{

  state={
    count:0
  }

  //组件当中的state,可以通过this.state来进行调用
  //使用setState,来修改数据,直接使用this.state.count+1,来修改是行不通的
  //备注:如果直接使用事件抽离的方法,把render函数当中的逻辑抽离出来,但是在当前class的其他
  //的函数当中,是无法调用到this的。 因此在其他函数中无法调用this.setState是肯定的。

  render(){
    return (
      <div>
        <h1>计数器</h1>

        <button onClick={() => {
          this.setState({
            count:this.state.count+1
          })

        } }>
        +1</button>
        <div>这是一个有状态组件当中的数据count。{this.state.count}</div>
      </div>
    )
  }
 
}

这样就可以保证这里的this不是指的render里的this,而是render外部的this。当然还可以将这个this.setstate的逻辑进行抽离出来:

class AppSix extends React.Component
{


  state={
    count:0
  }

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

  render(){
    return (
      <div>
        <h1>计数器</h1>
        {/*在react当中,onclick方法都需要用花括号括起来,再来表示其中的方法,这里的箭头函数可以直接实现调用,只是没有对这个箭头函数
        进行命名,也就是令 hello = () => this.onIncrement(),是否命名都一样的
        */}
        <button onClick={this.onIncrement}>+1</button>
    )
  }
 
}


ReactDOM.render(<AppSix />, document.getElementById('event_six'))

对于componentDidMount,我们可以在里面进行网络请求和dom操作,因为它是等渲染完成后,才开始进行这个生命进程。

1.2 更新时的生命周期

在更新时,也就是值的初始的渲染都完成了,在渲染完成后,用户如果点击了界面,网页如何使用钩子函数对不同状态下的网页进行检测和更新。有三种情况都会导致组件进行重新渲染,分别是调用:

  1. New props(新参数被调用)
  2. setState() 
  3. forceUpdate() : 也就是强制更新
class App6 extends React.Component{

constructor(props)
{
  super(props)

  this.state={
    count:0
  }
}

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


render()
{
  return (
    <div>
      <h3>5.2 更新时的生命周期</h3>
      <Counter2 count={this.state.count }/>
      <button onClick={this.handleClick}>打豆豆</button>
    </div>

  )

}

}

class Counter2 extends React.Component
{
  render()
  {
    return <h3>统计豆豆被打的次数:{this.props.count}</h3>
  }


}


ReactDOM.render(<App6/>,document.getElementById('root10'))

 这里用到了子组件counter2,并且子组件接受到了参数props,因此在接受到了参数props后,确实会对ui进行更新,也就是进行重新渲染,我们点击一次按钮,子组件都会接受到一次参数,这样打豆豆的次数就会发生变化。

我们可以看到ComponentDidUpdate()是在render函数之后,才开始执行的,因此有以下的的图片:

1.3 卸载时的生命周期

 我们在打完豆豆超过3次后,子组件消失,因此可以使用compomentWillUnmount函数,执行清理工作。代码如下:

class App6 extends React.Component{

constructor(props)
{
  super(props)

  this.state={
    count:0
  }
}

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


render()
{
  return (
    <div>
      <h3>5.2 更新时的生命周期</h3>
        {
          this.state.count > 3 ? (
            <p>豆豆被打死了</p>

          ) :(
            <Counter2 count={this.state.count }/>
          )

        }

     
      <button onClick={this.handleClick}>打豆豆</button>
    </div>

  )

}

}

class Counter2 extends React.Component
{
  render()
  {
    console.warn("子组件--更新时--render函数被渲染")
    return <h3>统计豆豆被打的次数:{this.props.count}</h3>
  }

  componentDidUpdate()
  {
    console.warn("子组件--更新时--componentDidUpdate函数被渲染")
    
  }

  componentWillUnmount()
  {
    //我们在父组件当中规定了这个子组件在超过3次之后销毁,因此销毁后应该调用这个函数
    console.warn("子组件--生命周期钩子函数: componentWillUnmount")
  }


}


ReactDOM.render(<App6/>,document.getElementById('root10'))

 我们在发现子组件消失后,确实compomentWillUnmount函数被执行了,warning被打印出。

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

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

相关文章

计划任务使用介绍

作者:lly 文章目录 前言一、使用说明1.1 发布模型1.2 创建并设置计划任务1.3 开启计划任务1.4 管理计划任务 二、结语 前言 iServer 11i(2023)对于处理自动化服务新增计划任务功能&#xff0c;该功能支持定时触发和监听文件变化触发执行模型&#xff0c;因此计划任务适用于以下…

Vite构建工具下Tinymce踩坑指南

背景 "vue": "^3.2.41","vite": "^3.2.3","tinymce": "^6.4.2","tinymce/tinymce-vue": "^5.1.0",坑1: 找不到zh-Hans.js等配置的文件 使用Tinymce需要配置中文汉化包、样式等。这些文件都是…

安全问题我们需要重视,立刻升级fastjson2

一、前言 小伙伴大家好&#xff0c;我是开源字节快速开发平台的作者。fastjson2.0 是fastjson的重要升级&#xff0c;目标是为下一个十年提供一个高性能的JSON库&#xff0c;同一套API支持JSON/JSONB两种协议。 近期fastjson 再报安全漏洞&#xff0c;直接给我们发送了高危告…

FastReport 2023.2新版, Delphi 和 Lazarus 核心产品将统一整合, 一起来看!

FastReport 是功能齐全的报表控件&#xff0c;可以帮助开发者可以快速并高效地为.NET&#xff0c;VCL&#xff0c;COM&#xff0c;ActiveX应用程序添加报表支持&#xff0c;由于其独特的编程原则&#xff0c;现在已经成为了Delphi平台最优秀的报表控件&#xff0c;支持将编程开…

风景类Midjouney prompt提示词

稳定输出优美风景壁纸的Midjouney prompt提示词。 1\在夏夜&#xff0c;有淡蓝色的星空&#xff0c;海边&#xff0c;流星&#xff0c;烟花&#xff0c;海滩上全是蓝色的玫瑰和绿色的植物&#xff0c;由Ivan Aivazovsky和Dan Mumford&#xff0c;趋势在cgsociety&#xff0c;柔…

HEIC→JPG

问题描述&#xff1a;图片格式由HEIC转JPG 解决办法&#xff1a;在网上找一个在线图片转格式的软件

我理解的参与开源贡献

坐标上海的E人&#xff0c;还在新手村练级的前端开发。曾闯荡过教育培训和零售管理行业&#xff0c;经历过大公司、外企&#xff0c;也和朋友的工作室合作过&#xff0c;斩获过一些能吓唬人的标签。好奇心很足&#xff0c;精力也很充沛&#xff0c;代码世界就是我现实生活中的霍…

【前后端实现文件下载或浏览】

前后端实现文件下载或浏览 背景前端后端java其他IO流分两种&#xff1b;字符流&字节流 背景 前端html\js\css,使用a标签或者iframe,笔者使用window.open(url)—重新打开标签页地址栏显示的接口路径;后端返回客户端[HttpServletResponse] 文件流&#xff08;以附件的方式[a…

建设现代化智慧十防档案室所需要的技术性方案

一、库房温湿度对档案的影响 库房的温湿度&#xff0c;过高过低都会影响档案制成材料的耐久性。高温高湿会加速纸张的老化水解&#xff0c;使危害档案制成材料的霉菌、细菌繁殖&#xff0c;并增强光化作用&#xff0c;使有害气体、灰尘吸附能力增大。但低温低湿会使纸张变脆&a…

VXLAN 主机VTEP(EVPN)

EVE环境模拟搭建一个基于主机VTEP的VXLAN数据中心网络。 实验里vtep是在linux主机上&#xff0c;同时linux主机还得有路由功能使VTEP的端点IP可达&#xff0c;所以两台linux服务器需要安装FRR。 数据转发平面使用VXLAN封装&#xff1b;在控制平面我打算选择使用EVPN和OVN两种不…

数据中台的商机

阿里拆中台了&#xff0c;很多人来问数据中台还要不要的问题&#xff0c;我认为中台总是要有的&#xff0c;无非是薄厚的问题。然后又有人来问数据中台价值创造的问题&#xff0c;这个其实是数据中台最核心的问题&#xff0c;我就来正式聊一聊&#xff0c;里面有很多的批判&…

T900:可以完美替代P900的国产900MHz无线跳频模块

目录 国产T900模块及其系列成品 T900模块 T900成品 国产T900模块及其系列成品 T900模块及其系列成品&#xff0c;是专门针对无人机及机器人行业设计的&#xff0c;尺寸小、性能优越&#xff0c;可以完美替代microhard的P900产品。下面向大家介绍下T900的相关情况&#xff1…

Dubbo负载均衡策略之 一致性哈希 | 京东云技术团队

本文主要讲解了一致性哈希算法的原理以及其存在的数据倾斜的问题&#xff0c;然后引出解决数据倾斜问题的方法&#xff0c;最后分析一致性哈希算法在Dubbo中的使用。通过这篇文章&#xff0c;可以了解到一致性哈希算法的原理以及这种算法存在的问题和解决方案。 一、负载均衡 …

STM32单片机(五)第二节:EXTI外部中断练习(对射式红外传感器计次和旋转编码器计次)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

深入学习 Linux 操作系统的存储 IO 堆栈

一、Linux 存储堆栈图 当使用 read() 和 write() 系统调用向内核提交读写 I/O 请求操作时需要经历的步骤&#xff1a; 1&#xff09;首先&#xff0c;请求经过虚拟文件系统&#xff0c;虚拟文件系统提供了统一的文件和文件系统的相关接口&#xff0c;屏蔽了不同文件系统的差异…

Applied soft computing期刊投稿流程

爱斯唯尔账户注册问题: 账号所属作者即默认通讯作者 刚开始应该会进入这个页面,这里的用户名和密码一般是导师(通讯作者)的账号密码,可以询问老师,然后点击author login登陆就好。 注册里面强调一点,这里面的Title 一般是职称的意思,如果是学生可以填Mr.或者Mrs. 投…

Python 网络舆情分析系统,舆论可视化界面

1 简介 舆情管理系统&#xff0c;这不仅仅可以帮助当地的管理人员迅速的排查跟本地有关的负面言论&#xff0c;还可以避免网民因为本身意识不到位而评论或发布一些不好的观点的情况&#xff0c;最终的目的就是帮助社会更好的发展。 2 技术栈 说明技术栈备注后台Python前端HT…

多线程:Lamda表达式

Lamda表达式 希腊字母表中第十一个字母&#xff0c;英文名字为lambda避免匿名内部类定义过多其实质是函数类编程的概念new Thread (() -->System.out.println(“多线程的学习…”)).start();为什么要使用Lamda表达式&#xff1f; 1、避免匿名内部类定义过多 2、可以让你的代…

Vue中如何进行移动端适配与响应式布局?

Vue中如何进行移动端适配与响应式布局&#xff1f; 如今&#xff0c;移动端适配与响应式布局已经成为Web开发中不可或缺的一部分。Vue.js作为一款流行的JavaScript框架&#xff0c;也提供了许多有用的工具和技术来实现移动端适配和响应式布局。在这篇文章中&#xff0c;我们将…

阿里云服务器ESSD PL-0云盘与ESSD PL-1云盘区别及选择参考

在我们选购阿里云服务器的时候&#xff0c;通常系统盘与数据盘类型都是ESSD云盘&#xff0c;而云盘的性能又分为PL-0和PL-1&#xff0c;虽然都属于ESSD云盘&#xff0c;但是它们之间的性能是有区别的&#xff0c;收费标准也不一样&#xff0c;本文为大家介绍一下阿里云服务器ES…