React:九、组件的生命周期

 1.生命周期的理解

  1. 组件从创建到死亡它会经历一些特定的阶段。
  2. React组件中包含一系列勾子函数(生命周期回调函数), 会在特定的时刻调用。
  3. 我们在定义组件时,会在特定的生命周期回调函数中,做特定的工作。

2.生命周期小案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ref</title>
</head>
<body>
     <!-- 准备好一个"容器" -->
     <div id="test"></div>

     <!-- 引入react核心库 -->
     <script type="text/javascript" src="./js/react.development.js"></script>
 
     <!-- 引入react-DOM,用于支持react操作DOM -->
     <script type="text/javascript" src="./js/react-dom.development.js"></script>
 
     <!-- 引入bable,用于将jsx转为js -->
     <script type="text/javascript" src="./js/babel.min.js"></script>

     <script type="text/babel">

        //创建组件
        class Life extends React.Component{

          //初始化状态
          state = {opacity:1}

          death = () =>{
            //卸载组件
            ReactDOM.unmountComponentAtNode(document.getElementById('test'))
          }

          //组件挂载完毕 只执行一次
        componentDidMount(){
         this.timer = setInterval(() => {
              //读取原状态
              let{opacity} = this.state
              //减小0.1
              opacity -= 0.1
              if(opacity <=0) opacity = 1
              //设置新的透明度,本来是({opacity,opacity}),参数和参数值名称相同可以简写。
              this.setState({opacity})
            },200)
          }

          componentWillUnmount(){
            //清除定时器
            clearInterval(this.timer)
          }
           


          //初始化渲染,状态更新之后执行
          render(){
            return(
              <div>
                <h2 style={{opacity:this.state.opacity}}>React学不会怎么办</h2>
                <button onClick={this.death}>不活了</button>
                </div>
            )
          }

        }

        ReactDOM.render(<Life/>,document.getElementById("test"))

     </script>
</body>
</html>

上图就是在组件挂载完毕时,写了一个定时器,改变字体透明度从1-0且循环显示的过程。

卸载组件,组件就从页面消失了

3.生命周期流程图

案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ref</title>
</head>
<body>
     <!-- 准备好一个"容器" -->
     <div id="test"></div>

     <!-- 引入react核心库 -->
     <script type="text/javascript" src="./js/react.development.js"></script>
 
     <!-- 引入react-DOM,用于支持react操作DOM -->
     <script type="text/javascript" src="./js/react-dom.development.js"></script>
 
     <!-- 引入bable,用于将jsx转为js -->
     <script type="text/javascript" src="./js/babel.min.js"></script>

     <script type="text/babel">

      //创建组件
      class Count extends React.Component{

        //构造器
        constructor(props){
          console.log(`Count---constructor`)
          super(props)
          //初始化状态
          this.state = {count:0}
        }

       
      //加1按钮
     add = ()=> {
      //获取原状态
      const {count}=this.state
      //更新状态
      this.setState({count:count+1})
     }

       //卸载
       death = ()=> {
        ReactDOM.unmountComponentAtNode(document.getElementById('test'))
     }

       //强制更新
      force = ()=> {
        this.forceUpdate()
     }

     //组件将要挂载的钩子
     componentWillMount(){
      console.log(`Count---componentWillMount`)
     }

     //组件挂载完毕的钩子
     componentDidMount(){
      console.log(`Count---componentDidMount`)
     }

     //组件将要被卸载
     componentWillUnmount(){
      console.log(`Count---componentWillUnmount`)   
     }

     //控制组件更新的阀门
     shouldComponentUpdate(){
      console.log(`Count--- shouldComponentUpdate`)
      return ture
     }

     //组件将要更新的钩子
     componentWillUpdate(){
      console.log(`Count--- componentWillUpdate`)
     }

     //组件更新完毕的钩子
     componentDidUpdate(){
      console.log(`Count--- componentDidUpdate`)
     }

     render(){
      console.log(`Count---render`)
     const {count} = this.state
     return(
      <div>
        <h2>当前求和为:{count}</h2>
        <button onClick={this.add}>点我加1</button><br/>
        <button onClick={this.death}>点我卸载</button><br/>
        <button onClick={this.force}>点我强制更新</button>

        </div>
     )
     }
    }

        ReactDOM.render(<Count/>,document.getElementById("test"))

     </script>
</body>
</html>

组件挂载到页面走下述流程,跟流程图一致,componentWillUnmount,组件将要卸载,只有在卸载组件时才触发。

 

 进行一些更新操作时,有下述三条路线。

setState()路线,shouldComponentUpdate  组件更新的阀门,只有该组件返回true,才能接着往下执行。如下图:

 forceUpdate强制更新路线

父组件render路线

   class A extends React.Component{
        state = {carName:'奔驰'}

        changeCar = () => {
          this.setState({carName:'奥拓'})
        }

        render(){
          return(
          <div>
            <div>我是组件A</div>
            <button onClick={this.changeCar}>换车</button>
            <B carName={this.state.carName}/>
            </div>
          )
        }
      }

      class B extends React.Component{
        componentWillReceiveProps(props){
          console.log('B---componentWillReceiveProps,',props)
        }
        render(){
          return(
          <div>我是组件B,我接受到的车是:{this.props.carName}</div>
          )
        }
      }
        ReactDOM.render(<A/>,document.getElementById("test"))

     </script>

componentWillReceiveProps:组件将要接收props时调用,他在第一次 接受props时不会调用,第二次时才会调用。按照流程图会一直往下走,不演示了。

4.新旧生命周期的对比

左边画对号的三个钩子弃用了,要用也可以会产生警告,UNSAFE_componentWillMount,加上UNSAGE_,警告消失。多了右边红色框的钩子,但及其少用。

后续再补!!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统权限维持(十五)之Linux系统-inetd远程后门

系列文章 操作系统权限维持&#xff08;一&#xff09;之Windows系统-粘贴键后门 操作系统权限维持&#xff08;二&#xff09;之Windows系统-克隆账号维持后门 操作系统权限维持&#xff08;三&#xff09;之Windows系统-启动项维持后门 操作系统权限维持&#xff08;四&…

leaflet加载GPX文件,第2种图形显示方法(119)

第119个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载GPX文件,将图形显示在地图上,这是另外一种方式,看前一种方式请从目录中查找。GPX文件是以GPS数据交换格式保存的GPS数据文件,是一种通用的地图信息文件,可以被众多GPS应用和Web服务更轻松地导入和…

Jenksin pipeline: 全局变量 和 input中的局部变量

在jenkins的流水线中全局变量的定义基本有两种实现方法&#xff1a;参数化构建过程中定义&#xff0c;流水线中直接定义 参数化构建过程中定义 流水线中直接定义(Jenkins 2.x支持代码及即服务) 可以用流水线生成 在配置parameters后&#xff0c;往往需要先构建一遍&#…

耗时 24 小时整理了网络安全学习路线,非常详细!

前言上次发的文章【都2023年了&#xff0c;还在问网络安全怎么入门】很多小伙伴在评论区回复不知道怎么学习&#xff0c;我也反思了一下&#xff0c;确实没写到学习方法和路线&#xff0c;所以这一期就出一一个怎么学习网络安全的学习路线和方法&#xff0c;觉得有用的话三连收…

软件测试入门简单么?入行后如何做职业规划

软件测试的确是入门相对简单的一个学科&#xff0c;他们不常写代码&#xff0c;主要去检查代码&#xff0c;是不是出现了漏洞、程序是否能运行下去&#xff1f;那这部分程序员就是做软件测试。 这个类别没有做Java难没有大数据那么复杂&#xff0c;但还可以拿到程序员的高薪。…

一招解决macOS12 CleanMyMac闪退

距全新的macOS 12 Monterey正式版发布已经过去了快6个月&#xff0c;macOS Monterey 12 新增了同播共享功能、 Apple Music 声控方案、“数字遗产”计划、“照片”中重新设计的“回忆”&#xff0c;以及针对 Mac 的其他功能和错误修复等大量更新和改进。 很多Mac用户也已经升级…

【模板】树状数组

目录&#xff1a; 单点修改&#xff0c;区间查询&#xff1a; 题目描述&#xff1a; lowbit()运算&#xff1a; 插入、修改单点数据&#xff1a; 计算前缀和&#xff1a; 完整代码&#xff1a; 区间修改&#xff0c;单点查询&#xff1a; 计算差分数组&#xff1a; 计算每个点的…

Node.js 入门

转载请注明出处&#xff0c;点击此处 查看更多精彩内容。 什么是 Node.js &#xff1f; Node.js 是一个基于 Chrome V8 引擎的开源的跨平台的 JavaScript 运行时环境。 Node.js 采用了基于事件的、单线程的异步 I/O 架构。 Node.js 的组成部分 V8引擎 V8 引擎就是 JavaScrip…

使用 React 和 GPT-4 技术构建智能语言翻译应用

Midjourney 创作&#xff0c;Language Translation in future在今天的互联世界中&#xff0c;语言翻译在弥合沟通差距和促进全球合作方面发挥着至关重要的作用。随着像 OpenAI 的 GPT-4 这样先进的 AI 模型的出现&#xff0c;我们现在有机会创建高度精确和上下文感知的翻译工具…

USB键盘实现——带指示灯的键盘(九)

文章目录带指示灯的键盘set_report 类特殊请求实现类特殊请求USB 控制端点收到的数据增加一个输出端点实现配置描述符集合输出端点收到的数据带指示灯的键盘 要实现带指示灯的键盘&#xff0c;有两种方式 除控制端点和输入端点外&#xff0c;不额外增加端点&#xff0c;根据 …

不完全微分算法(SCL+ST代码)

PID控制器的基本算法,可以参看专栏的系列文章,链接如下: 三菱FX3U PLC 位置式PID算法(ST语言)_fx3u pid_RXXW_Dor的博客-CSDN博客三菱PLC自带的PID不必多说,大家可以自行查看指令说明。关于FX3U 增量式PID可以参看专栏的另一篇博客三菱PLC增量式PID算法FB(带死区设置和外部…

springCloud学习【3】之Docker完整版

文章目录一 初识Docker1.1 应用部署的环境问题1.2 Docker简介1.3 Docker解决操作系统环境差异1.4 Docker和虚拟机的区别1.5 Docker架构1.5.1 镜像和容器1.5.2 DockerHub1.5.3 Docker架构1.5.4 Docker工作流1.6 Docker的安装和启动1.7 安装步骤1.8 启动Docker1.9 配置镜像加速二…

总结802

早上&#xff1a; 6:23起床 6:43出门 7:00~7:40小湖读书 8:00~9:45机器人控制 9:50~11:30句句真研 11:31~12:10吃饭 12:12~12:22动漫 12:45~2:09午觉 2:00~4:15深度学习 4:26~4:39去图书馆 4:40~6:11高等数学第五讲 6:13~6:40跑步开合跳100胯下击掌100 6:50~7:20吃…

PS基础操作-抠图与导出-学习记录

目录 注&#xff1a;PS版本为2022&#xff0c;有个智能对象选择功能比较方便抠图 第一步&#xff1a;导入图像文件 第二步&#xff1a;基础的画布界面移动 鼠标滚轮上下滑动&#xff0c;可以是上下滚动界面 按住ctrl鼠标滚轮&#xff0c;可以左右滚动界面 按住alt鼠标滚轮…

华为OD机试题,用 Java 解【快递货车】问题 | 含解题说明

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典本篇题目:快递货车 题目 一辆运送快递的…

【python刷题】LeetCode 2057E 值相等的最小索引(5种简单高效的解法)

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…

问答ChatGPT-4:探索未来微数据中心IDC的发展趋势

从去年年底开始到现在&#xff0c;大众对以ChatGPT-4为主的人工智能AI的话题讨论盛况空前。这是一款由OpenAI发布的聊天机器人模型&#xff0c;一经上线&#xff0c;短短5天完成100万用户积累&#xff0c;并在最近实现月活用户破亿。实际上&#xff0c;ChatGPT和智能客服、智能…

CN RedGolf 集团利用 KEYPLUG 后门攻击 Windows 和 Linux 系统

被追踪为 RedGolf 的 CN 国家支持的威胁活动组织被归因于使用名为 KEYPLUG 的自定义 Windows 和 Linux 后门。 Recorded Future 告诉 The Hacker News&#xff1a;“RedGolf 是一个特别多产的CN国家支持的威胁组织&#xff0c;可能多年来一直活跃于全球范围内的广泛行业。” …

HandlerInterceptor拦截器的原理

是什么 HandlerInterceptor拦截的是请求&#xff0c;是springMVC项目中的拦截器&#xff0c;它拦截的目标是请求的地址。也就是说&#xff0c;它可以对请求进行拦截处理&#xff0c;所有实现了HandlerInterceptor&#xff0c;并且进行了配置的的类&#xff0c;都有这个能力&am…

第四章 共享模型之 管程 (下)

JUC并发编程系列文章 http://t.csdn.cn/UgzQi 文章目录JUC并发编程系列文章前言七、wait -- notify1、为什么使用 wait2、 wait -- notify 原理3、API 介绍八、wait -- notify 的正确姿势示例一&#xff1a;sleep会拿着锁睡觉&#xff0c;阻碍其它线程执行示例二&#xff1a;wa…