react类组件生命周期基础总结

组件的生命周期是指组件从被创建到挂载到页面中运行起来,再到组件不用时卸载的过程,只有类组件才有生命周期(类组件 实例化  函数组件 不需要实例化)

 生命周期新版本和旧版本的对比图如下:

 生命周期(constructor())

类组件继承了react Component这个基类,也就继承这个react的基类,才能有render(),生命周期等方法可以使用,这也说明为什么函数组件不能使用这些方法的原因。

 constructor():它的入参是props(由父作用域传递过来的自定义属性和children[组件内部嵌套的视图结构]) 第一行代码必须是super(props),调用父类的构造器函数

  • 组件自有的state只能在这里定义(先定义后使用),state就是所谓的声明式变量
  • 在这里不能修改props,在这里也不能用props来做运算(因为constructor在声明周期中只发生一次)。
  • 在这里不要把props和state进行交叉赋值,在React代码逻辑中,永远要保持props和state的独立性。
  • 在这里不要使用this.setState来修改state。刚赋完值就进行render,而在constructor中,render生命周期都还没有生成。
  • 一般情况下,不要在这里写业务逻辑。有时候我们需要改变this指向时候唯一允许这么做,比如DOM、BOM操作等不要在这里做。
  • 一般继承父类、定义状态、改变this指向。

生命周期(挂载阶段)

钩子 函数

触发时机

作用

constructor

创建组件时,最先执行,初始化的时候只执行一次

1. 初始化state  

2. 创建 Ref 

3. 使用 bind 解决 this 指向问题等

render

每次组件渲染都会触发

渲染UI(注意: 不能在里面调用setState() )

componentDidMount

组件挂载(完成DOM渲染)后执行,初始化的时候执行一次,在浏览器更新视图之前调用

1. 发送网络请求   

2.DOM操作

componentWillMount():react 16.3之前

        在组件挂载到DOM前调用,且只会被调用一次,在这边调用this.setState不会引起组件重新渲染,也可以把写在这边的内容提前到constructor()中,所以项目中很少用。

componentDidMount():react 17之后

  • 相当于Vue中的mounted(),表示挂载阶段已完成,这个声明周期只执行一次。
  • 各种业务逻辑(DOM、ref、掉接口、开定时器等等都可以在这里做)
  • 在这里可以使用多次this.setState(),默认是异步的。
  • 这个声明周期是在更新阶段的,发生在render之后

 生命周期(更新阶段)

react 16.3之前

  • componentWillReceiveProps(nextProps,nextState)
    • 这个生命周期主要为我们提供对props发生改变的监听,如果你需要在props发生改变后,相应改变组件的一些state,在这个方法中改变state不会二次渲染,而是直接合并state。
  • shouldComponentUpdate(nextProps,nextState)
    • 会返回一个布尔值,判断是否需要更新渲染组件,返回false,不会再向下执行生命周期,是优化react应用的主要手段之一,在这个方法中不能调用setState(),会导致循环调用
  • componentWillUpdate
    • 这个生命周期用来处理Dom发生更新之前的事情,在这个阶段不可以调用setState,会导致循环调用
  • render
  • componentDidUpdate(preProps,preState)
    • 此时已经完成渲染,Dom和state都已经发生变化,参数都是上一个状态的值

react 17之后

  • getDerivedStateFromProps(nextProps,preState)
    • 可以返回一个对象用来更新state。
  • shouldComponentUpdate render getSnapshotBeforeUpdate(preProps,preState)
    • 在这个阶段可以拿到上一个状态Dom元素的坐标、大小等相关信息。用于替代旧的生命周期中的componentWillUpdate
  • componentDidUpdate的第三个参数出现。
    • 在最近一次渲染提交到DOM树之前执行,可以用来获取更新前的DOM信息。
  • componentDidUpdate(preProps,preState,snapshot)
    • 首次渲染不会调用,组件更新后立即调用,在这个生命周期中使用this.setState时必须将其包裹在条件语句中,否则会导致死循环。

更新阶段会在三种情况下触发:

1、父组件更改props:一个组件并不能主动更改它拥有的props属性,它的props属性是由它的父组件传递给它的。强制对props进行重新赋值会导致程序报错。

  • 直接使用,每当父组件重新render导致的重传props,子组件将直接跟着重新渲染,无论props是否有变化。可通过shouldComponentUpdate方法优化。
  • 在componentWillReceiveProps方法中,将props转换成自己的state

 2、更改state:state的更改是通过setState接口实现的。组件的更新原因很大一部分是因为调用setState接口更新state所致,我们常常以同步的方式调用setState,但实际上setState方法是异步的。

  • 组件本身调用setState,无论state有没有变化。可通过shouldComponentUpdate方法优化。

 3、调用forceUpdate方法:强制组件进行更新。

 生命周期(卸载阶段)

钩子 函数

触发时机

作用

componentWillUnmount

组件卸载(从页面中消失)

执行清理工作(比如:清理定时器等)

在新版本中,某些生命周期废弃原因: componentWillMount、componentWillReceiveProps、componentWillUpdate这三个生命周期钩子都是在render阶段执行的

(1)在fiber架构被应用之前,render阶段是不能被打断的,页面复杂以后,就有可能阻塞页面的渲染;

(2)于是react推出fiber架构,使原本同步的渲染过程变成异步的,将一个大的更新任务拆解成许多小任务,低优先级任务的render阶段可以被高优先级任务打断;

(3)这就导致在render阶段执行的生命周期函数会被多次调用,如果在这些函数中执行一些带有副作用的操作,比如发送网络请求,就会导致一个同样的网络请求被调用多次,因此需要一个新的生命周期去解决这个问题;

(4)用静态函数getDerivedStateFromProps来取代被废弃的几个生命周期函数,开发者就无法通过this获取到组件实例,也不能发送网络请求或调用this.setState,通过强制开发者在render之前只做无副作用的操作来避免对生命周期的滥用。

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

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

相关文章

GPT专业应用:撰写工作简报

●图片由Lexica 生成,输入:Workers working overtime 工作简报,作为一种了解情况、沟通信息的有效手段,能使上级机关和领导及时了解、掌握所属部门的政治学习、军事训练、行政管理等方面的最新情况;同时,能…

非暴力沟通模型

非暴力沟通模型 非暴力沟通的创始人是马歇尔.卢森堡,师从人本主义心理学之父卡尔.罗杰斯。《非暴力沟通》一书入选香港大学推荐的50本必读书籍之列。 模型介绍 非暴力沟通(英文名称:NonviolentCommunication,简称NVC)…

运行时栈帧结构与方法调用

1 运行时栈帧结构 Java虚拟机以方法作为最基本执行单元,“栈帧”则是用于支持虚拟机进行方法调用和方法执行背后的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。 1.1 局部变量表 局部变量表的容量以变量槽为最小单位。 Java…

JSDoc 拥抱 Javascript

JSDoc 在 vs code 已经内置了. 可以在 js 文件的开头添加 // ts-check 即可. 在注释中标注来实现一些 ts 的功能. JSDoc 支持以下注解. Types typeparam (or arg or argument)returns (or return)typedefcallbacktemplate Classes Property Modifiers public, private, p…

Windows Server 2016 中文版、英文版下载 (updated May 2023)

Windows Server 2016 中文版、英文版下载 (updated May 2023) Windows Server 2016 Version 1607,2023 年 5 月更新 请访问原文链接:https://sysin.org/blog/windows-server-2016/,查看最新版。原创作品,转载请保留出处。 作者…

ChatGPT + MindShow 制作PPT

🍏🍐🍊🍑🍒🍓🫐🥑🍋🍉🥝 ChatGPT MindShow 制作PPT 文章目录 🍐具体操作🐳结语 🍐具体操作 ChatGP…

2023—Unity打包Pico4(3)全流程(Pico插件)

一、项目选择了2021.3.0版本的URP,把项目Build成Android 二、打开Project Setting→ 安装最下面的XR Plugin Management 安装完成后的界面,此时还没有Pico选项出现 三、我们需要在该网站下载Pico的SDK包 picoxr/VRTK-Support (github.com) 解压该文件到…

python + windQuant:挑选公司

给定一些k线选股指标,如何挑选符合条件的公司,以python windquant为例? 【申明:本例只用来作为python学习交流之用,切勿以此作为投资的选股条件】 0、用以下条件挑选公司: 仅作示例用: 【1】…

qiankun + Vite + React + Vue + Angular 快速构建前端微服务

文章目录 一、主应用 vite二、微应用 react三、微应用 vue四、微应用 angular五、项目地址 一、主应用 vite npm npm create vitelatestyarn yarn create vite选择是否继续 Need to install the following packages:create-vite3.2.1 Ok to proceed? (y) y项目名称 Project…

nodejs进阶(3)—路由处理

1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回。 url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) 接收参数: urlStr url字符串 parseQueryString 为true时将使用查询模…

四月成功上岸阿里,年后准备了两个月,要个21k应该不过分吧~

先说下我基本情况,本科不是计算机专业,现在是学通信,然后做图像处理,可能面试官看我不是科班出身没有问太多计算机相关的问题,因为第一次找工作,阿里的游戏专场又是最早开始的,就投递了&#xf…

github copilot chat申请,安装,及常见问题解决

申请 首先申请,并开通copilot, 地址为:https://github.com/features/copilot,copilot 一个月10美金,第一个月免费,支持国内的信用卡。 开通copilot之后,可以申请 copilot chat 的预览版功能,网…

DistilPose: Tokenized Pose Regression with Heatmap Distillation

论文名字:DistilPose:使用热图蒸馏的令牌化姿势回归 论文地址:2303.02455.pdf (arxiv.org)https://arxiv.org/pdf/2303.02455.pdf项目地址:yshMars/DistilPose: Implementation for: DistilPose: Tokenized Pose Regression with…

五、c++学习(加餐1:汇编基础学习)

经过前面几节课的学习,我们在一些地方都会使用汇编来分析,我们学习汇编,只是学习一些基础,主要是在我们需要深入分析语法的时候,使用汇编分析,这样会让我们更熟悉c编译器和语法。 从这节课开始&#xff0c…

SQL删除重复的记录(只保留一条)-窗口函数row_number()

文章目录 一、关于mysql表中数据重复二、聚合函数min(id)not in二、窗口函数row_number()四、补充:常见的窗口函数 一、关于mysql表中数据重复 关于删除mysql表中重复数据问题,本文中给到两种办法:聚合函数、窗口函数row_number()的方法。 (注…

UML类图画法及其关系

UML类图画法及其关系 本文主要是介绍 UML类图画法及其关系,方便今后温习!!! 一、类之间的关系汇总 泛化(Generalization)实现(Realization)关联(Association&#xff…

算法时间复杂度

参考视频&#xff1a;https://www.bilibili.com/video/BV14j411f7DJ 目录 1.常数阶O(1) 2.对数阶O(IogN) 3.线性阶O(n) 4.线性对数阶O(nlogN) 5.平方阶O(n^2) 6.立方阶O(n^3) 7.K次方阶O(n^k) 8.指数阶(2^n) 9.阶乘O(n!) 两层for循环 for (int i 1; i <…

Linux基本指令实现4及热键指令详解

目录 Linux热键补充&#xff1a; 1.bc指令&#xff1a; Tab键的智能补充&#xff1a; ctrlc键&#xff1a; uname指令&#xff1a; lscpu指令&#xff1a; lsmem指令&#xff1a; df -h指令&#xff1a; 关机指令&#xff1a; 扩展指令&#xff1a; Linux热键补充&#…

【Linux】驱动学习,先啃框架

目录 前言&#xff1a; 一、驱动设计 &#xff08;1&#xff09;面向对象&#xff1a; &#xff08;2&#xff09;分层&#xff1a; &#xff08;3&#xff09;分离&#xff1a; 二、驱动框架 &#xff08;1&#xff09;传统框架 &#xff08;2&#xff09;总线设备驱…