React 中事件机制详细介绍:概念与执行流程如何更好的理解
React 的事件机制是一个非常重要的概念,它涉及到 React 如何处理用户的交互事件。React 的事件系统与传统的 DOM 事件系统有所不同,它在底层使用了事件委托和合成事件(Synthetic Events)来优化性能。下面,我们将从 React 事件机制的工作原理、事件执行顺序等方面进行详细讲解,并结合实际项目代码进行说明。
1. React 的事件机制概述
在传统的 DOM 事件中,每个事件处理程序会直接绑定到 DOM 元素上。这样做的缺点是每个事件都会创建一个新的事件监听器,随着页面元素增多,性能开销会变得很大。
React 采用了 事件委托(Event Delegation)的模式,在顶层创建一个事件监听器,并通过事件传播机制(事件冒泡)将事件传递到目标元素。这就意味着,React 并不是为每个 DOM 元素都创建独立的事件监听器,而是将所有事件监听器都绑定到根元素(如 document
)上,然后通过事件传播来捕获并处理不同组件的事件。
React 使用了 合成事件(Synthetic Events)来封装原生的事件。这是一个跨浏览器的封装,使得 React 的事件处理机制能够在不同浏览器间保持一致。
2. 事件执行顺序
React 的事件处理有一个执行顺序,具体来说,React 的事件处理是 基于事件冒泡 的。事件冒泡指的是,事件从目标元素开始,逐层向上冒泡直到根元素。
在 React 中,这一过程是通过合成事件机制来完成的。合成事件会把原生事件的行为封装起来,使其在不同的浏览器上都能表现得一致。
事件的执行顺序:
- 事件捕获阶段:事件从根元素开始,向目标元素传播。
- 目标阶段:事件到达目标元素并触发事件处理函数。
- 事件冒泡阶段:事件从目标元素向上传播至根元素。
3. React 的合成事件(SyntheticEvent)
React 使用合成事件来处理所有的 DOM 事件。合成事件是一个跨浏览器的封装,它模拟了原生浏览器事件的行为。React 的事件对象(SyntheticEvent
)在浏览器上表现得如同原生事件,但它具有以下几个优势:
- 跨浏览器一致性:React 的合成事件使得事件处理在不同浏览器之间保持一致。
- 性能优化:通过事件委托机制,React 可以减少 DOM 元素上事件处理器的数量,从而提高性能。
// 示例:React 中的合成事件
class ClickButton extends React.Component {handleClick = (event) => {console.log('Button clicked!');console.log(event); // event 是 SyntheticEvent 对象};render() {return (<button onClick={this.handleClick}>Click me</button>);}
}
在上面的代码中,当点击按钮时,handleClick
事件处理函数会被触发。这里的 event
是一个 React 的合成事件对象,它与原生的 DOM 事件对象类似,但在实现细节上有所不同。
4. 事件绑定与处理
React 中的事件绑定与传统的 DOM 事件不同。React 会通过 JSX 语法将事件处理函数绑定到组件的元素上,而不是直接通过 addEventListener
来绑定。
示例代码:事件绑定
class MyComponent extends React.Component {handleClick = () => {console.log('Button was clicked!');};render() {return (<div><button onClick={this.handleClick}>Click Me</button></div>);}
}
在上面的例子中,onClick
是 React 的事件属性,绑定了 handleClick
方法。当点击按钮时,React 会自动处理事件,并触发 handleClick
方法。
5. 事件的传递与冒泡
React 的事件机制支持事件冒泡。默认情况下,事件会从事件目标元素开始,向上传播到父级元素。这是因为 React 使用了事件委托机制。
示例代码:事件冒泡
class ParentComponent extends React.Component {handleParentClick = () => {console.log('Parent clicked!');};handleChildClick = (event) => {console.log('Child clicked!');// 阻止事件冒泡event.stopPropagation();};render() {return (<div onClick={this.handleParentClick}><button onClick={this.handleChildClick}>Click me</button></div>);}
}
在这个例子中,当点击按钮时,handleChildClick
被触发,且通过 event.stopPropagation()
阻止了事件冒泡,因此父级元素的 handleParentClick
不会被触发。如果不调用 stopPropagation
,则会触发父级元素的点击事件。
6. 事件合成与性能优化
React 的事件系统还具有 事件合成 的特点。当多个事件处理函数被触发时,React 会在同一事件循环中批量执行所有的事件处理器,从而避免了重复渲染的问题。这可以提高性能,尤其是在处理大量事件时。
class PerformanceExample extends React.Component {handleClick = () => {console.log('Button clicked!');};render() {return (<div><button onClick={this.handleClick}>Click Me</button><button onClick={this.handleClick}>Click Me Too</button></div>);}
}
当你点击其中一个按钮时,React 会将这两个 handleClick
调用合并到同一个事件循环中,从而优化性能,减少不必要的渲染。
7. 事件传递中的 this
绑定
在 React 中,事件处理函数是以类的方法的形式定义的,通常需要手动绑定 this
,否则 this
会指向 undefined
。可以通过以下几种方法来绑定 this
:
- 在构造函数中绑定
this
:
class MyComponent extends React.Component {constructor(props) {super(props);this.handleClick = this.handleClick.bind(this);}handleClick() {console.log(this); // 这里的 `this` 指向组件实例}render() {return <button onClick={this.handleClick}>Click me</button>;}
}
- 使用箭头函数:箭头函数会自动绑定
this
。
class MyComponent extends React.Component {handleClick = () => {console.log(this); // 这里的 `this` 自动绑定到组件实例};render() {return <button onClick={this.handleClick}>Click me</button>;}
}
8. 总结
- 事件委托:React 通过事件委托机制提高性能,所有的事件处理程序都绑定在根元素上,通过事件冒泡捕获不同元素的事件。
- 合成事件:React 使用合成事件对象
SyntheticEvent
来跨浏览器地封装事件,使得事件处理在不同浏览器之间保持一致。 - 事件冒泡:React 支持事件冒泡,通过事件的传播来处理父子组件之间的事件关系。
- 事件性能优化:React 通过批量更新和事件合成来优化性能,避免不必要的重新渲染。
通过理解 React 的事件机制,你可以更加高效地处理用户交互,提升应用的性能和用户体验。
相关文章:
React 中事件机制详细介绍:概念与执行流程如何更好的理解
React 的事件机制是一个非常重要的概念,它涉及到 React 如何处理用户的交互事件。React 的事件系统与传统的 DOM 事件系统有所不同,它在底层使用了事件委托和合成事件(Synthetic Events)来优化性能。下面,我们将从 Rea…...

Day04-后端Web基础(Maven基础)
目录 Maven课程内容1. Maven初识1.1 什么是Maven?1.2 Maven的作用1.2.1 依赖管理1.2.2 项目构建1.2.3 统一项目结构 2. Maven概述2.1 Maven介绍2.2 Maven模型2.3 Maven仓库2.4 Maven安装2.4.1 下载2.4.2 安装步骤 3. IDEA集成Maven3.1 配置Maven环境3.1.2 全局设置 3.2 Maven项…...
vue3模板语法+响应式基础
模板语法 1. disabled指令,可以用于禁用按钮 <button :disabled"isButtonDisabled">Button</button> //:disabled是一个指令,用于根据isButtonDisabled的值来动态控制按钮的禁用状态。 使用场景: 1.防止用户重复点击…...
【面试题】简单聊一下什么是云原生、什么是k8s、容器,容器与虚机相比优势
云原生(Cloud Native) 定义:云原生是一种构建和运行应用程序的方法,旨在充分利用云计算的优势。它涵盖了一系列技术和理念,包括容器化、微服务架构、自动化部署与管理等。特点:云原生应用程序被设计为可弹性…...

数据挖掘实训:天气数据分析与机器学习模型构建
随着气候变化对各行各业的影响日益加剧,精准的天气预测已经变得尤为重要。降雨预测在日常生活中尤其关键,例如农业、交通和灾害预警等领域。本文将通过机器学习方法,利用历史天气数据预测明天是否会下雨,具体内容包括数据预处理、…...

STM32如何使用内部晶振作为晶振
目录 前言 首先说明一下芯片内部并没有时钟, 而是内部振荡。使用内部振荡的好处是外部无需设计晶振电路 ,再说的简单点 ,不用外部晶振依然可以让单片机正常运转。 环境: 芯片:STM32F103C8T6 Keil:V5.24…...

【Maui】导航栏样式调整
前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 .NET MAUI 是一款开放源代码应用,是 X…...

【黑马程序员三国疫情折线图——json+pyechart=数据可视化】
json数据在文末 将海量的数据处理成我们肉眼可以进行分析的形式,数据的可视化,可以分为两个步骤: 数据处理:利用三方网站厘清json层次格式化,再对文件的读取、检查是否符合JSON规范以及规范化、JSON格式的转化&#…...

如何实现多级缓存?
本文重点说一说在Java应用中,多级缓存如何实现。 多级缓存是比较常见的一种性能优化的手段,一般来说就是本地缓存分布式缓存。 本地缓存一般采用Caffeine和Guava,这两种是性能比较高的本地缓存的框架。他们都提供了缓存的过期、管理等功能。…...

Saas数据库迁移单租户数据
1、背景 租户使用Saas系统,用一段时间后要将系统、数据搬迁到自建服务器。该Saas系统没有按租户分库,且数据库数据量太大,需要将单租户的数据抽取出来。Saas系统使用Mysql5.7数据库,主要使用INFORMATION_SCHEMA.COLUMNS表进行数据…...
LeetCode100之括号生成(22)--Java
1.问题描述 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例1 输入:n 3 输出:["((()))","(()())","(())()","()(())","()()()&qu…...

阿里云ios镜像源
阿里云镜像源:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 下载centos7...
芯片:为何英伟达的GPU能在AI基础设施领域扮演重要角色?
英伟达的GPU之所以能在AI基础设施领域扮演重要角色,主要源于其硬件架构的优势以及其与深度学习算法的高度兼容性。以下是几个关键因素: 1. 并行计算能力 GPU(图形处理单元)本质上是为处理大量并行计算任务而设计的。与CPU相比&a…...

Linux系统之hostname相关命令基本使用
Linux系统之hostname相关命令基本使用 一、检查本地系统版本二、hostname命令的帮助说明中文帮助说明 三、hostname命令的基本使用1. 查看计算机名2. 查看本机上所有IP地址3. 查看主机FQDN4. 查看短主机名 四、hostnamectl命令的使用1. 查看主机详细信息2. 设置主机名3. hostna…...
Domain Adaptation(李宏毅)机器学习 2023 Spring HW11 (Boss Baseline)
1. 领域适配简介 领域适配是一种迁移学习方法,适用于源领域和目标领域数据分布不同但学习任务相同的情况。具体而言,我们在源领域(通常有大量标注数据)训练一个模型,并希望将其应用于目标领域(通常只有少量或没有标注数据)。然而,由于这两个领域的数据分布不同,模型在…...
在php中,Fiber、Swoole、Swow这3个协程都是如何并行运行的?
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
SQLite PRAGMA
SQLite的PRAGMA命令是一种特殊的命令,用于在SQLite环境中控制各种环境变量和状态标志。PRAGMA值可以被读取,也可以根据需求进行设置【0†source】。 PRAGMA命令的语法格式如下: 要查询当前的PRAGMA值,只需提供该PRAGMA的名字&am…...
使用python调用JIRA6 REST API及遇到的问题
JIRA认证方式简述 JIRA接口调用有两种认证方式访问Jira Rest API,基本认证⽅式(⽤户名和密码)和OAuth1认证方式。 基本认证⽅式:因为⽤户名和密码会被浏览器重复地请求和发送,即使采⽤ SSL/TLS 发送,也会有安全隐患,…...

基于STM32的智能电表可视化设计:ESP8266、AT指令集、python后端Flask(代码示例)
一、项目概述 随着智能家居的普及,智能电表作为家庭用电管理的重要工具,能够实时监测电流、电压及功率,并将数据传输至后台进行分析和可视化。本项目以STM32C8T6为核心,结合交流电压电流监测模块、ESP8266 Wi-Fi模块、OLED显示屏…...

图片和短信验证码(头条项目-06)
1 图形验证码接口设计 将后端⽣成的图⽚验证码存储在redis数据库2号库。 结构: {img_uuid:0594} 1.1 创建验证码⼦应⽤ $ cd apps $ python ../../manage.py startapp verifications # 注册新应⽤ INSTALLED_APPS [django.contrib.admin,django.contrib.auth,…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...