day54(reactJS)关于事件处理函数 props方法 合成事件 严格模式 组件声明周期 纯组件以及性能优化以及网络请求

(reactJS)关于事件处理函数this指向的 props与state,setState方法 合成事件与事件对象 严格模式标签 组件声明周期 纯组件以及性能优化以及关于网络请求

  • 1.关于事件处理函数this指向
  • 2.关于合成事件与事件对象
  • 3.props与state,setState方法
  • 4.关于react框架的严格模式标签
  • 5.关于react组件生命周期
  • 6.关于纯组件与性能优化
  • 7.关于网络请求

1.关于事件处理函数this指向

注意:react框架中绑定给事件的处理函数中,this 指向是不确定的。
想要让事件处理函数中的 this 指向实例,有以下三种解决方案1. 事件处理函数用箭头函数的形式定义函数名=()=>{}(这样定义的事件处理函数其 this 指向定义时所在的上下文,也就是组件实例)2. 在事件处理函数在绑定时套上一层箭头函数<tag onClick={()=>{this.函数名()}}></tag>(最优解,方便传参)3. 在事件处理函数绑定位置用 bind 修改 this 指向(该方法的缺点是函数不方便传参)<tag onClick={this.函数名.bind(this)}></tag>

2.关于合成事件与事件对象

注意:React 框架中的事件是合成事件(SyntheticEvent),其事件对象也是合成对象,不同于原生 js 中讲的事件对象(合成事件是在 js 原生事件的基础上进行了二次封装,对事件进行兼容性处理,使其在不同的浏览器表现相同,并添加了一些额外的方法;使用驼峰命名法的事件都是合成事件)
产生目的:React 为了避免这类 DOM 事件滥用造成性能问题,同时屏蔽底层不同浏览器之间的事件系统差异,实现了一个中间层——SyntheticEvent
原理:
1. React 在初始化时会绑定一个 document 的事件代理,用于处理所有的合成事件,这个代理会在组件卸载时被移除。
2. 当一个 DOM 元素上的事件被触发时,React 会根据事件类型创建一个合成事件对象,这个对象是基于原生事件对象包装而成的,并添加了一些额外的属性,如 type、target、currentTarget 等。
3. 在创建合成事件对象时,React 会先从事件池中获取一个已经存在的合成事件对象,如果不存在则创建一个新的合成事件对象,这个池子可以重复利用已经创建的合成事件对象,避免大量创建对象导致的性能问题。
4. React 会在合成事件对象上添加一些额外的属性和方法,如stopPropagation(阻止冒泡)、preventDefault(阻止默认行为)等,并将一些原生事件对象上的属性值赋值到合成事件对象中。
5. 最后,React 会将合成事件对象传递给事件处理函数,开发者可以通过访问合成事件对象的属性和方法来处理事件。
6. 事件处理函数执行完毕后,React 会将合成事件对象的属性值重置,然后将合成事件对象放回事件池中,以便下次重复利用。
ps:不要将原生事件(addEventListener)和 React合成事件一起混合使用,这两个机制是不一样的
<button onClick={(e)=>{ this.handleClick(10,e) }}>点击</button>(当箭头函数包裹的事件处理函数需要使用到事件对象时,需要手动传参,因为此时事件对象默认传给了外层的箭头函数,套在里面的事件处理函数拿不到事件对象)

3.props与state,setState方法

1. 区别:1. props是用来接收来自父组件的属性的一个js对象,这个数据流可以一直传递到子孙组件, 是只读的2. state是用来定义组件自身的状态的一个js对象, 是可变的, 建议通过setState方法更新组件状态的值
2. this.setState()方法的底层原理:(这个方法想要触发render函数,就必须有参数,至少要写一个空对象作为他的参数,无参则无法触发组件更新)
该方法的底层原理主要包括两个方面:组件状态(变量)更新+dom节点更新
在执行的时候会拿传入的新对象和原有的this.state对象进行合并,同时会触发组件更新( 由于setState是个异步操作, 所以组件状态的更新并不是立即进行的。 而是会放入到异步队列中, 等到事件循环到时再执行( 如果在同一个事件循环中有多个异步操作,它们会一次性同步到state中 ) ; 
接下来会依次调用组件更新期的相关生命周期函数(比如: render函数), 然后会通过render生成一个新的虚拟dom树,拿新的虚拟dom树和之前的虚拟dom树进行对比(使用diff算法), 用最小的代价完成从虚拟dom树到真实dom节点的更新)

4.关于react框架的严格模式标签

标签语法:<React.StrictMode></React.StrictMode>
位置:src文件夹下的直接子文件:index.js中
表现:会触发两次render()函数
原因:
1. 检测不安全的生命周期函数使用
在React的严格模式下,会检测不安全的生命周期函数使用,例如 componentWillUpdate 和 componentWillReceiveProps 等函数,这些函数可能会导致一些潜在的问题,如状态不一致等。通过在严格模式下检测这些问题,可以帮助开发者更早地发现和解决这些问题。
2. 检测遗留的 Context API
在React 16.x 版本之前,Context API 是使用实验性 API实现的,可能存在一些问题和不兼容性。在 React 的严格模式下,会检测使用遗留的 Context API,从而提醒开发者使用新的 Context API3. 检测意外的副作用
React严格模式下还会检测意外的副作用,如意外的副作用产生的副作用等,从而帮助开发者更早地发现和解决这些问题。
4. 检测过时的 findDOMNode API
在React 16.x 版本之前,可以使用 findDOMNode API 来获取组件的 DOM 节点。但是这个 API 有一些问题,例如会破坏组件的封装性,同时也可能会导致性能问题。在React的严格模式下,会检测使用过时的 findDOMNode API,从而提醒开发者使用新的 ref API

5.关于react组件生命周期

1. 实例化期1. consturctor()
2. 挂载期1. componentWillMount()2. render()(render()的作用是生成虚拟 dom树来渲染或者更新组件,因此挂载期也需要执行一次)3. componentDidMount()(可以在这里发送网络请求,创建定时器,监听事件)
3. 更新期1. componentWillUpdate()2. render()3. componentDidUpdate()
4. 卸载期1. componentWillUnmount()(可以在这里取消网络请求,销毁定时器,取消监听事件)
5. 要点1. 挂载期父子组件生命周期函数执行顺序父组件实例化consturctor()↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓父组件挂载前componentWillMount()↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓父组件执行render()↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓子组件实例化consturctor()↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓子组件挂载前componentWillMount()↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓子组件执行render()↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓子组件挂载完成componentDidMount()↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓父组件挂载完成componentDidMount()2. 更新期父子组件生命周期函数执行顺序父组件更新前componentWillUpdate()↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓父组件执行render()↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓子组件更新前componentWillUpdate()(注意父组件更新时,带动子组件也是更新,不是实例化和挂载)↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓子组件执行render()↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓子组件更新完成componentDidUpdate()↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓父组件更新完成componentDidUpdate()

6.关于纯组件与性能优化

我们可以通过避免对代码进行一些不必要的重复执行来提高应用性能,做到这一点,有以下两种思路:
1. 组件生命周期函数
shouldComponentUpdate()
该函数使用时需要返回一个布尔值,如果返回true,则代表当前组件继续更新,
如果返回false,则代表当前组件放弃更新,render()函数就不会执行
可以通过一定的条件判断来控制该函数在什么情况下返回true,什么情况下返回false示例:在以下代码中,nextProps参数可以获取最新的props对象,nextState参数可以获取最新的state状态,通过this.props获取上一次存储的props对象,两者对比,可以判断父组件传来的值是否有改变,改变则子组件继续更新,不改变子组件放弃更新(这里要注意,前后获取的props还是state都是对象,属于引用类型,不能使用==或者===直接比较,这样比较的是他们的堆空间地址,结果一定是不相等的,没有参考价值,我们需要对比的是他们的内容,所以需要二者都使用JSON.stringify()方法转换成对象形式的字符串再对比)shouldComponentUpdate(nextProps,nextState){if(JSON.stringify(nextProps) == JSON.stringify(this.props)){return false;}else{return true;}}
2. 纯组件PureComponent纯组件, 会自动帮我们实现shouldComponentUpdate这个生命周期方法,会自动帮我们判断新旧props是否发生变化,进行决定当前组件是否放弃更新, 目的是为了实现组件性能优化(这个组件需要手动引入,用该组件代替原本 class函数继承的Component组件)

7.关于网络请求

步骤:
1. npm i axios下载axios插件↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
2. 创建utils文件夹,在其中创建request.js文件↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
3. 在文件中导入axios,import axios↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
4. 实例化axios,使用axios.create({timeout:10*1000,baseURL:'/'})↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
5. 设置拦截器(请求拦截器(这里添加全局请求头)+响应拦截器)↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
6. 创建API文件夹,在其中创建index.js文件,用于请求函数的二次封装↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
7. 设置服务器请求代理(在src文件夹下创建直接子文件,命名为:setupProxy.js,在这个文件中添加服务器请求代理,注意这里文件的位置和命名都是固定的,在ts语法中也不需要更改,错了就起不到作用)
const { createProxyMiddleware:proxy } = require("http-proxy-middleware");
module.exports = (app) =>{app.use("/公共前缀",proxy({target:"http://+ip+端口",changeOrigin:true}))
}

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

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

相关文章

【神经网络与深度学习】深度神经网络(DNN)

概述 深度神经网络&#xff08;Deep Neural Networks&#xff0c;DNN&#xff09;是一种由多个隐藏层组成的神经网络模型。每个隐藏层由多个神经元组成&#xff0c;这些神经元通过权重和激活函数进行信息传递和计算。 深度神经网络通过多层的非线性变换&#xff0c;可以学习到…

数据结构---C语言版 408 2019-41题代码版

题目&#xff1a; 2019 年 ( 单链表 ) 41 &#xff0e;&#xff08; 13 分&#xff09;设线性表 L ( a 1 , a 2 , a 3 ,…… ,an2, a n 1 , a n ) 采用带头结点的单链表保存&#xff0c;链表中 的结点定义如下&#xff1a; typedef struct node { int data; struc…

Smart PLC模拟量采集和低通滤波器组合应用

SMART PLC模拟量采集功能块"S_ITR"算法公式和详细代码请参考下面文章&#xff1a; 1、模拟量采集功能块"S_ITR" https://rxxw-control.blog.csdn.net/article/details/121347697https://rxxw-control.blog.csdn.net/article/details/1213476972、线性转换…

ARM-v7 程序计数器PC的相关指令与应用

1. 前言 如图1所示&#xff0c;R14是连接寄存器&#xff08;Link Register&#xff09;&#xff0c;在汇编指令中通常也写为LR&#xff0c;用于存储函数调用和异常等的返回信息&#xff0c;复位时&#xff0c;默认值为0xFFFFFFFF&#xff1b; 图1 Core register R15是程序计数…

vscode 配置 c 语言 问题解决

1.VS code调试时显示Unable to start debugging.The value of miDebuggerPath is invalid。 解决方法: VS code调试时显示Unable to start debugging.The value of miDebuggerPath is invalid_unable to start debugging. the value of midebugger-CSDN博客 2.VSCode运行C终端…

提示词工程技术:类比、后退、动态少样本、自动生成CoT

类比提示 “类比提示”利用类比推理的概念&#xff0c;鼓励模型生成自己的例子和知识&#xff0c;从而实现更灵活和高效的解决问题。 后退提示 “后退提示”专注于抽象&#xff0c;引导模型推导出高级概念和原理&#xff0c;进而提高其推理能力。 使用一个基本的数学问题来…

isdigit 是 Python 中字符串对象的一个方法,用于检查字符串中的所有字符是否都是数字。

如果字符串中的所有字符都是数字&#xff0c;则返回 True&#xff0c;否则返回 False。这个方法只能用于检查整数&#xff0c;并且它只能识别 0-9 的数字字符。 这里有一个使用 isdigit 方法的例子&#xff1a; s "12345" if s.isdigit(): print("字符串只包…

npm下载时下载失败解决方法

1.清楚缓存 npm cache clean --force2.切换下载镜像 1.查看当前使用的镜像地址命令 npm config get registry切换为淘宝镜像命令&#xff08;安装一些package容易报错&#xff09; npm config set registry https://registry.npm.taobao.org或官方&#xff1a; npm config…

分类算法(Classification algorithms)

逻辑回归(logical regression&#xff09;&#xff1a; 逻辑回归这个名字听上去好像应该是回归算法的&#xff0c;但其实这个名字只是在历史上取名有点区别&#xff0c;但实际上它是一个完全属于是分类算法的。 我们为什么要学习它呢&#xff1f;在用我们的线性回归时会遇到一…

读书·基于RISC-V和FPGA的嵌入式系统设计·第3章

72.8051单片机的弊端和指令集架构CISC的缺点 76.RV指令集的特征&#xff08;⭐&#xff09; 特权架构和特权指令集是相关但不完全相同的概念。 特权架构&#xff08;Privileged Architecture&#xff09;指的是计算机体系结构中用于实现特权级操作的硬件和软件机制。特权架构定…

RabbitMQ——死信队列

RabbitMQ——死信队列 死信队列&#xff08;Dead Letter Queue&#xff0c;DLQ&#xff09;是 RabbitMQ 中的一种重要特性&#xff0c;用于处理无法被消费的消息&#xff0c;防止消息丢失。 死信的来源 在消息队列中&#xff0c;当消息满足一定条件而无法被正常消费时&#xf…

电商运营常用名词解释

电商运营中的基础名词解释 GMV∶成交总额&#xff0c;含拍下未支付订单金额 ROl:投入产出比&#xff0c;ROl交易额/花费&#xff0c;投入产出比越高越好 uV︰独立访客&#xff0c;统计1天内访问某站点的用户数 PV:访问量&#xff0c;即页面浏览量或点击量。一个顾客浏览了两次…

前端框架的发展历史介绍

前端框架的发展历史是Web技术进步的一个重要方面。从最初的简单HTML页面到现在的复杂单页应用程序&#xff08;SPA&#xff09;&#xff0c;前端框架和库的发展极大地推动了Web应用程序的构建方式。以下是一些关键的前端框架和库&#xff0c;以及它们的发布年份、创建者和主要特…

java-ssm-jsp的问卷调查系统的设计与实现

java-ssm-jsp的问卷调查系统的设计与实现 获取源码——》公主号&#xff1a;计算机专业毕设大全

抖音商家活动信息未在商详展示会有哪些处罚?

一、什么是「违规玩法-活动信息未在商详展示」? 什么是「违规玩法-活动信息未在商详展示」?由于当前平台未提供官方营销工具(例如免单、返现等)&#xff0c;但是创作者在进行商品推广(不仅限口播、画面、标题文案等)宣传该类营销玩法&#xff0c;未在商品商详页展示说明&…

第十五章垃圾回收相关算法

第十五章垃圾回收相关算法 文章目录 第十五章垃圾回收相关算法1. 垃圾标记阶段的算法之引用计数算法1.1 垃圾标记阶段&#xff1a;对象存货判断1.2 方式一&#xff1a;引用计数算法循环引用 1.3 小结 2. 垃圾标记阶段的算法之可达性分析算法2.1 方式二&#xff1a;可达性分析&a…

Qt 定时器事件

文章目录 1 定时器事件1.1 界面布局1.2 关联信号槽1.3 重写timerEvent1.4 实现槽函数 启动定时器 2 定时器类 项目完整的源代码 QT中使用定时器&#xff0c;有两种方式&#xff1a; 定时器类&#xff1a;QTimer定时器事件&#xff1a;QEvent::Timer&#xff0c;对应的子类是QTi…

sys内建模块

一、概述 sys 模块是 Python 标准库中的一个内置模块&#xff0c;提供了与 Python 解释器及其运行时环境交互的函数和变量。它允许你访问和操作与解释器状态相关的信息 1、需要导包 不会自动导入&#xff0c;需要显示的将sys模块导入 import sys 二、常用方法 1、sys.exit(…

Linux命令-cp命令(将源文件或目录复制到目标文件或目录中)

说明 cp命令 用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件&#xff0c;当一次复制多个文件时&#xff0c;目标文件参数必须是一个已经存在的目录&am…

HttpURLConnection详解及使用

HttpURLConnection 请求响应流程 设置连接参数的方法 setAllowUserInteractionsetDoInputsetDoOutputsetIfModifiedSincesetUseCachessetDefaultAllowUserInteractionsetDefaultUseCaches 发送URL请求 建立实际连接之后&#xff0c;就是发送请求&#xff0c;把请求参数传到…