React 第八节组件生命周期钩子-类式组件,函数式组件模拟生命周期用法
概述
React组件的生命周期可以分为三个主要阶段:
挂载阶段(Mounting):组件被创建,插入到DOM 树的过程;
更新阶段(Updating):是组件中 props 以及state 发生变化时,重新render渲染视图过程;
卸载阶段(Unmounting):是DOM被从虚拟DOM树移除的过程;
每个阶段都伴随着一系列的生命周期方法,这些方法为开发者提供了在类式组件不同阶段执行操作不同代码的机会,使开发人员能够更好的处理业务交互。
1、类式组件中的生命周期
React 16.3 之前的钩子
React 16.3 之后的生命周期钩子
2、React 16.3 版本之前的 生命周期
这个版本的 React 有非常明确的生命周期,能够清晰的知道各个阶段的钩子函数,跟VUE2.0的非常相似,
主要钩子函数有如下:
2.1、挂载阶段:
constructor(props)
类的构造方法,在组件中被创建时候调用,用于初始化 state 和 绑定事件处理函数
,但是这个时候不能调用 this.setState()
, 因为此时组件还没有挂载到 DOM上;
componentWillMount()
将要插入回调,DOM结构生成前要执行的操作
render()
用于插入虚拟DOM 回调,将虚拟DOM 渲染到视图上的过程
componentDidMount()
虚拟 DOM插入回调已经完成,即视图已经渲染完成,页面真实DOM已经加载完,此阶段可以进行 数据请求、订阅或手动更改DOM
2.2、更新阶段:
每次在进行 this.setState()
操作,或者 子组件得到的 props 更新
时候,都会执行此阶段的钩子函数,还有就是执行 forceUpdate() 时候
同样也会执行此阶段函数;
componentsWillUpdate()
视图将要更新前的回调操作;用于数据格式化等操作
render()
根据传入的 新state 或者 新 props 进行重新渲染视图
componentDidUpdate()
视图重新更新渲染已经完成, 可以在这里执行依赖于DOM的操作,如重新获取DOM尺寸或执行网络请求
2.3、卸载阶段
componentWillUnmount()
组件被移除回调,这个阶段可以处理一些定时任务,事件卸载、取消网络请求等操作
3、React 16.3 版本之后的生命周期
3.1、挂载阶段:
constructors(props)
类的构造方法,在组件被创建时调用。用于初始化state和绑定事件处理函数,创建 ref。注意,constructor中不能调用this.setState(),因为此时组件还未挂载到DOM上。
constructor(props) {console.log('==constructor==')// 获取上级传入 propssuper(props)// 声明 state 属性 countthis.state = {count: 0}}
static getDerivedStateFromProps(props, state)
React 16.3引入的静态方法,在组件创建时和每次更新前调用。用于根据props
更新state
。如果不希望更新state,则返回null
。
如:
static getDerivedStateFromProps(props, state) {// 根据props更新stateconsole.log('==props=')console.log('==state=', state)// 表示给 count 设置初始值最终会渲染为 99return {count: 99}}
static 静态方法中是获取不到当前组件的实例的,不能进行 this.XX
操作 调用 如:this.fetch()
render()
渲染方法,根据组件的props和state返回React元素。render方法必须是一个纯函数,不能修改组件的状态或执行副作用。
componentDidMount()
组件挂载到DOM后调用。是执行副作用(如数据获取、订阅或手动更改DOM)。
3.2、更新阶段
在组件的props或state发生变化时,React会重新渲染组件
static getDerivedStateFromProps(props, state)
同挂载阶段,用于在更新前根据props更新state。 同上 返回 null 时候,不会更是视图;
shouldComponentUpdate(nextProps, nextState)
返回一个布尔值,决定组件是否应该更新。默认情况下返回true,但可以通过此方法优化性能,避免不必要的渲染,通过对比新旧数据判断是否需要执行更新视图操作。
render()
同挂载阶段,根据更新后的props和state重新渲染组件。
getSnapshotBeforeUpdate(prevProps, prevState)
在最近一次渲染输出(提交到DOM)之前调用,可以捕获一些信息(如滚动位置),这些信息将作为参数传递给componentDidUpdate。
componentDidUpdate(prevProps, prevState, snapshot)
组件更新后被调用。可以在这里执行依赖于DOM的操作,如重新获取DOM尺寸或执行网络请求
3.3 卸载阶段
componentWillUnmount()
在组件卸载及销毁之前调用。是执行清理操作(如取消网络请求、清除定时器)的理想位置。
类式组件生命周期钩子函数变化:
4、在函数式组件中如何模拟生命周期
生命周期主要分为 三个阶段,在函数式组件中是无法模拟出上面类式组件的各个生命钩子函数的,但是可以通过 useEffect()
Hook模拟组件的 挂载、更新、销毁
三个阶段;
4.1 模拟挂载阶段
与类组件中的 componentDidMount() 钩子函数相似
useEffect(() => {// 这里执行挂载时候操作console.log('===componentDidMount==')}, []) // 第二参数为空 数组时候,表示 挂载、卸载时候执行;
4.2 模拟更新阶段
与类式组件中的 shouldComponentUpdate 类似
useEffect(() => {// 这里执行挂载时候操作console.log('===componentDidMount==')console.log('===我更新了==')}, [count]) // 第二参数为空 数组时候,表示 挂载、卸载时候执行;若第二个参数 传入了依赖属性,则该属性变化时候,会执行第一个参数的回调函数
4.3 模拟卸载阶段
与类式组件中的 componentWillUnmount() 类似
useEffect(() => {// 这里执行挂载时候操作console.log('===componentDidMount==', count)return () => {// 这里执行卸载后的操作console.log('=组件卸载了==')}}, [count]) // 第二参数为空 数组时候,表示 挂载、卸载时候执行,
注意:官网现在推荐开发时候使用函数式组件,相对类式组件更加灵活方便,但是在编写通用性
处理复杂的逻辑
及状态
时候,还是建议使用类式组件
,类式组件有很好的继承扩展性
,通过生命周期钩子,能够更好的`
相关文章:
React 第八节组件生命周期钩子-类式组件,函数式组件模拟生命周期用法
概述 React组件的生命周期可以分为三个主要阶段: 挂载阶段(Mounting):组件被创建,插入到DOM 树的过程; 更新阶段(Updating):是组件中 props 以及state 发生变化时&#…...
Dubbo源码解析-服务调用(七)
一、服务调用流程 服务在订阅过程中,把notify 过来的urls 都转成了invoker,不知道大家是否还记得前面的rpc 过程,protocol也是在服务端和消费端各连接子一个invoker,如下图: 这张图主要展示rpc 主流程,消费…...
svn 崩溃、 cleanup失败 怎么办
在使用svn的过程中,可能出现整个svn崩溃, 例如cleanup 失败的情况,类似于 这时可以下载本贴资源文件并解压。 或者直接访问网站 SQLite Download Page 进行下载 解压后得到 sqlite3.exe 放到发生问题的svn根目录的.svn路径下 右键呼出pow…...
【Linux系列】NTP时间同步服务器搭建完整指南
在分布式系统和高可用环境中,时间同步是至关重要的。特别是对于银行、金融等关键业务系统,精准的时间同步不仅关系到系统的稳定性,还直接影响交易处理、日志管理、日终结算等功能。本文将介绍NTP(Network Time Protocol࿰…...
go 结构体方法
在 Go 语言中,结构体方法是指附加到结构体类型上的函数。这些方法可以通过结构体的实例来调用。方法的接收者(receiver)指定了该方法属于哪个结构体类型。接收者可以是一个值类型或指针类型。 定义结构体方法 下面是如何为一个结构体定义方…...
DHCP服务(包含配置过程)
目录 一、 DHCP的定义 二、 使用DHCP的好处 三、 DHCP的分配方式 四、 DHCP的租约过程 1. 客户机请求IP 2. 服务器响应 3. 客户机选择IP 4. 服务器确定租约 5. 重新登录 6. 更新租约 五、 DHCP服务配置过程 一、 DHCP的定义 DHCP(Dynamic Host Configur…...
uniapp内嵌的webview H5与应用通信
H5端: 1、找到index.html引入依赖 <script type"text/javascript" src"https://unpkg.com/dcloudio/uni-webview-js0.0.3/index.js"></script> 2、在需要通讯处发送消息 uni.postMessage({data:{code:200,msg:"处理完成&q…...
Android OpenGL ES详解——绘制圆角矩形
1、绘制矩形 代码如下: renderer类: package com.example.roundrectimport android.content.Context import android.opengl.GLES30 import android.opengl.GLSurfaceView.Renderer import com.opengllib.data.VertexArray import com.opengllib.prog…...
网络基础二
文章目录 协议定制,序列化和反序列化应用层网络版计算器协议的定制序列反序列化序列化未复用版 反序列化 TCP是面向字节流的,你怎么保证,你读取上来的数据,是‘’一个“ “完整””的报文呢? 我们没有区分字符串里面有…...
从Full-Text Search全文检索到RAG检索增强
从Full-Text Search全文检索到RAG检索增强 时光飞逝,转眼间六年过去了,六年前铁蛋优化单表千万级数据查询性能的场景依然历历在目,铁蛋也从最开始做CRUD转行去了大数据平台开发,混迹包装开源的业务,机缘巧合下做了实时…...
springMVC 全局异常统一处理
全局异常处理⽅式⼀: 1、配置简单异常处理器 配置 SimpleMappingExceptionResolver 对象: <!-- 配置全局异常统⼀处理的 Bean (简单异常处理器) --> <bean class"org.springframework.web.servlet.handler.SimpleMappingExceptionReso…...
qt ubuntu i386 系统
sudo ln -s cmake-3.31.0-linux-x86_64/bin/* /usr/local/bin 【Ubuntu20.4安装QT6 - CSDN App】Ubuntu20.4安装QT6_ubuntu安装qt6-CSDN博客 sudo ../configure -release -platform linux-g-64 -static -nomake examples -nomake demos -no-qt3support -no-script -no-scriptt…...
BUUCTF—Reverse—helloword(6)
一道安卓逆向的签到题 下载附件 使用JADX-gui反编译工具打开(注意配环境),找到主函数 jadx 本身就是一个开源项目,源代码已经在 Github 上开源了 官方地址:GitHub - skylot/jadx: Dex to Java decompiler 发现flag …...
深入解析下oracle date底层存储方式
之前我们介绍了varchar2和char的数据库底层存储格式,今天我们介绍下date类型的数据存储格式,并通过测试程序快速获取一个日期。 一、环境搭建 1.1,创建表 我们还是创建一个测试表t_code,并插入数据: 1.2,…...
Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
作者:来自 Elastic Saikat Sarkar 使用 Elasticsearch 向量数据库构建搜索 AI 体验时如何使用 IBM watsonx™ Slate 文本嵌入。 Elastic 很高兴地宣布,通过集成 IBM watsonx™ Slate 嵌入模型,我们的开放推理 API 功能得以扩展,这…...
如何搭建一个小程序:从零开始的详细指南
在当今数字化时代,小程序以其轻便、无需下载安装即可使用的特点,成为了连接用户与服务的重要桥梁。无论是零售、餐饮、教育还是娱乐行业,小程序都展现了巨大的潜力。如果你正考虑搭建一个小程序,本文将为你提供一个从零开始的详细…...
NFS搭建
NFS搭建 单节点安装配置服务器安装配置启动并使NFS服务开机自启客户端挂载查看是否能发现服务器的共享文件夹创建挂载目录临时挂载自动挂载 双节点安装配置服务器安装配置服务端配置NFS服务端配置Keepalived编辑nfs_check.sh监控脚本安装部署RsyncInofity 客户端 单节点安装配置…...
RNN与LSTM,通过Tensorflow在手写体识别上实战
简介:本文从RNN与LSTM的原理讲起,在手写体识别上进行代码实战。同时列举了优化思路与优化结果,都是基于Tensorflow1.14.0的环境下,希望能给您的神经网络学习带来一定的帮助。如果您觉得我讲的还行,希望可以得到您的点赞…...
Docker部署FastAPI实战
在现代 Web 开发领域,FastAPI 作为一款高性能的 Python 框架,正逐渐崭露头角,它凭借简洁的语法、快速的执行速度以及出色的类型提示功能,深受开发者的喜爱。而 Docker 容器化技术则为 FastAPI 应用的部署提供了便捷、高效且可移植…...
【Python数据分析五十个小案例】电影评分分析:使用Pandas分析电影评分数据,探索评分的分布、热门电影、用户偏好
博客主页:小馒头学python 本文专栏: Python数据分析五十个小案例 专栏简介:分享五十个Python数据分析小案例 在现代电影行业中,数据分析已经成为提升用户体验和电影推荐的关键工具。通过分析电影评分数据,我们可以揭示出用户的…...
Vue2学习记录
前言 这篇笔记,是根据B站尚硅谷的Vue2网课学习整理的,用来学习的 如果有错误,还请大佬指正 Vue核心 Vue简介 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。 它基于标准 HTML、CSS 和 JavaScr…...
TMS FNC UI Pack 5.4.0 for Delphi 12
TMS FNC UI Pack是适用于 Delphi 和 C Builder 的多功能 UI 控件的综合集合,提供跨 VCL、FMX、LCL 和 TMS WEB Core 等平台的强大功能。这个统一的组件集包括基本工具,如网格、规划器、树视图、功能区和丰富的编辑器,确保兼容性和简化的开发。…...
Redis主从架构
Redis(Remote Dictionary Server)是一个开源的、高性能的键值对存储系统,广泛应用于缓存、消息队列、实时分析等场景。为了提高系统的可用性、可靠性和读写性能,Redis提供了主从复制(Master-Slave Replication…...
logback动态获取nacos配置
文章目录 前言一、整体思路二、使用bootstrap.yml三、增加环境变量四、pom文件五、logback-spring.xml更改总结 前言 主要是logback动态获取nacos的配置信息,结尾完整代码 项目springcloudnacosplumelog,使用的时候、特别是部署的时候,需要改环境&#…...
KETTLE安装部署V2.0
一、前置准备工作 JDK:下载JDK (1.8),安装并配置 JAVA_HOME 环境变量,并将其下的 bin 目录追加到 PATH 环境变量中。如果你的环境中已存在,可以跳过这步。KETTLE(8.2)压缩包:LHR提供关闭防火墙…...
[RabbitMQ] 保证消息可靠性的三大机制------消息确认,持久化,发送方确认
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
aws服务--机密数据存储AWS Secrets Manager(1)介绍和使用
一、介绍 1、简介 AWS Secrets Manager 是一个完全托管的服务,用于保护应用程序、服务和 IT 资源中的机密信息。它支持安全地存储、管理和访问应用程序所需的机密数据,比如数据库凭证、API 密钥、访问密钥等。通过 Secrets Manager,你可以轻松管理、轮换和访问这些机密信息…...
Java设计模式笔记(一)
Java设计模式笔记(一) (23种设计模式由于篇幅较大分为两篇展示) 一、设计模式介绍 1、设计模式的目的 让程序具有更好的: 代码重用性可读性可扩展性可靠性高内聚,低耦合 2、设计模式的七大原则 单一职…...
Unity3d C# 实现一个基于UGUI的自适应尺寸图片查看器(含源码)
前言 Unity3d实现的数字沙盘系统中,总有一些图片或者图片列表需要点击后弹窗显示大图,这个弹窗在不同尺寸分辨率的图片查看处理起来比较麻烦,所以,需要图片能够根据容器的大小自适应地进行缩放,兼容不太尺寸下的横竖图…...
【es6进阶】vue3中的数据劫持的最新实现方案的proxy的详解
vuejs中实现数据的劫持,v2中使用的是Object.defineProperty()来实现的,在大版本v3中彻底重写了这部分,使用了proxy这个数据代理的方式,来修复了v2中对数组和对象的劫持的遗留问题。 proxy是什么 Proxy 用于修改某些操作的默认行为࿰…...
网站做流量怎么赚钱的/开封seo推广
前天我去一个客户那里装系统,那里的环境是这样的:他们那里是两台邮件服务器,同时用,数据同步,就算是备份和冗余,现在正常的叫A,我要装系统的是B,B有两个盘,一个盘为一个分…...
电商网站分析报告怎么做/去了外包简历就毁了吗
Nginx 升级版本或者重新编译增加参数这里我们重新编译下,增加nginx用户和组先创建用户#useradd nginx 开始编译#cd /usr/local/nginx-1.6.1#./configure --usernginx --groupnginx --prefix/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module…...
自己可以接单做网站吗/搜索引擎营销有哪些方式
RockerMQ简介RocektMQ是阿里巴巴在2012年开源的一个纯java、分布式、队列模型的第三代消息中间件,不仅在传统高频交易链路有着低延迟的出色表现,在实时计算等大数据领域也有着不错的吞吐。2016年11月11号,双十一大促见证了RocketMQ低延迟存储…...
用了wordpress的电商网站/销售推广的方法都有哪些
单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了。这个设计模式主要目的是想在整个系统中只能出现一个类的实例。这样做当然是有必然的,比如你的软件的全局配置信息,或者是一个…...
深圳网站建设php/营销型网站策划书
http://jingyan.baidu.com/article/a681b0dedcfa523b19434648.html每次看到星光或者灯光,总是觉得模模糊糊,有人说,那叫朦胧美.但是当我戴上眼镜再看的时候,只有我自己知道那才是真的美.所以,开始悔恨当初没好好的保护视力.那么平时要如何保护好视力呢? 保护视力方法: 1平时最…...
网站建设潍坊/电商网站图片
2014华为机试西安地区A组试题 题目一、分苹果 M个同样苹果放到N个同样篮子里有多少种放法,同意有篮子不放。 1<M<10。1<N<10 比如5个苹果三个篮子,3,1,1 和 1,1,3是同一种放法 输入 7 3 输出 8题目分析: 这道题相似于…...