React@16.x(19)事件的处理

目录

  • 1,React 事件大致原理
    • 1.1,几乎所有的事件处理,都在 document 的事件中处理。
    • 1.2,事件参数
  • 2,注意事项

1,React 事件大致原理

这里讨论的事件,是指在 React 内置组件上绑定的事件。

大致原理:

1,React 为了提升效率,利用事件冒泡的原理,直接给 document 对象上注册对应的事件(会遍历拿到所有可能的事件)。
比如,当点击某个元素后,点击事件最终冒泡到 document 对象上,然后再去虚拟DOM树的节点中查看,有那些节点绑定了点击事件,依次执行。

所以,
1,手动给真实DOM上绑定的事件,永远先于 React 元素上的事件执行。
2,在真实的 DOM 上绑定事件后,如果阻止了事件冒泡(不会冒泡到 document 对象),那 React 元素上的相同事件就不会执行了。

2,当要触发某个 React 组件上绑定的事件时,React 会在虚拟DOM树中找对应的元素节点,并从最底层的元素节点开始执行对应的事件(可能有不同层级绑定了相同的事件)。

举例:

src/index.js

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";ReactDOM.render(<App />, document.getElementById("root"));document.getElementById("root").addEventListener("click", () => {console.log("root");
});

src/App.js

import React, { PureComponent } from "react";export default class App extends PureComponent {render() {return (<buttononClick={() => {console.log("app");}}>点我</button>);}
}

当点击按钮时,会先打印 root,再打印 app

原因:先执行了真实DOM上的事件,一直冒泡到 document 上,再去虚拟DOM树中找绑定了相同事件的元素节点,执行对应事件。

1.1,几乎所有的事件处理,都在 document 的事件中处理。

说几乎是因为,

  • 有些事件就不冒泡,那就直接在元素上监听,比如 input 的聚焦事件。
  • 有的事件 document 上没有,比如 video 的一些事件。

1.2,事件参数

React 的事件参数,是经过处理的一个对象,和真实的DOM事件参数类似:

  • stopPropagation,阻止事件在虚拟DOM树中冒泡。
  • nativeEvent,可以得到真实的DOM事件对象。
  • 为了提高执行效率,React使用事件对象池来处理事件对象。

对象池:会缓存事件对象,重复使用。

import React, { PureComponent } from "react";export default class App extends PureComponent {render() {let tempE = null;return (<divonClick={(e) => {console.log(tempE === e); // true}}><buttononClick={(e) => {tempE = e;}}>App</button></div>);}
}

2,注意事项

知道了大致原理之后,就需要注意一些可能的问题:

  1. 如果给真实的DOM注册事件,阻止了事件冒泡,则会导致 React 元素的相同事件无法触发。
  2. 如果给真实的DOM注册事件,事件会先于React事件运行。
  3. 通过React的事件中阻止事件冒泡,无法阻止真实的DOM事件冒泡。
  4. 可以通过 nativeEvent.stopImmediatePropagation(),阻止 document 上剩余事件的执行。(几乎用不到)
  5. 在事件处理程序中,不要异步的使用事件对象,如果一定要使用,需要调用 persist 函数。

异步举例:虽然会输出对象,但所有属性都是 null

<buttononClick={(e) => {setTimeout(() => {console.log(e);}, 1000);}}
>App
</button>

进行持久化,就能正常获取事件对象了。

<buttononClick={(e) => {e.persist();setTimeout(() => {console.log(e);}, 1000);}}
>App
</button>

以上。

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

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

相关文章

云端狂飙:Django项目部署与性能优化的极速之旅

Hello&#xff0c;我是阿佑&#xff0c;这次阿佑将手把手带你亲自踏上Django项目从单机到云端的全过程&#xff0c;以及如何通过Docker实现项目的无缝迁移和扩展。不仅详细介绍了Docker的基本概念和操作&#xff0c;还深入探讨Docker Compose、Swarm和Kubernetes等高级工具的使…

03-3.1.1 栈的基本概念

&#x1f44b; Hi, I’m Beast Cheng&#x1f440; I’m interested in photography, hiking, landscape…&#x1f331; I’m currently learning python, javascript, kotlin…&#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

1Panel 搭建 halo博客

线上服务器一直闲置&#xff0c;刷到视频 1Panel 能更好管理服务器&#xff0c;还能快速搭建博客&#xff0c;便上手试试&#xff0c;的确很方便&#xff0c;顺手记录一下。 零、准备工作 一台服务器&#xff08;按需购买&#xff0c;此处准备的阿里云服务器一台&#xff0c;也…

postman教程-14-生成随机数

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了Postman关联接口的调用方法&#xff0c;本小节我们讲解一下Postman生成随机数的方法。 在接口测试中&#xff0c;经常需要向接口发送不同的输入数据&#xff0c;以确保接口的健壮性和可靠性。…

02-2.3.5 静态链表

喜欢《数据结构》部分笔记的小伙伴可以订阅专栏&#xff0c;今后还会不断更新。&#x1f9d1;‍&#x1f4bb; 此外&#xff0c;《程序员必备技能》专栏和《程序员必备工具》专栏&#xff08;该专栏暂未开设&#xff09;日后会逐步更新&#xff0c;感兴趣的小伙伴可以点一下订阅…

中国自动气象站:现代气象观测的中流砥柱

引言 气象观测是人类认识和预报天气的重要手段。在现代科技的推动下&#xff0c;自动气象站成为气象观测的重要工具&#xff0c;为天气预报、防灾减灾和气候研究提供了宝贵的数据支持。本文将介绍中国自动气象站的发展历程、技术特点及其在气象观测中的重要作用。 中国自动气象…

关于远程销售的电子课程开发

一家国际网络安全公司委托我们开发用于培训销售代表远程和电话销售的互动电子内容。我们在 Articulate Storyline 中创建了情节脚本和二维动画&#xff0c;以解释关键概念和销售技巧。互动元素使学习者可以按照自己的节奏进行学习&#xff0c;而我们的动画插图则使材料生动起来…

【成都信息工程大学】只考程序设计!成都信息工程大学计算机考研考情分析!

成都信息工程大学&#xff08;Chengdu University of Information Technology&#xff09;&#xff0c;简称“成信大”&#xff0c;由中国气象局和四川省人民政府共建&#xff0c;入选中国首批“卓越工程师教育培养计划”、“2011计划”、“中西部高校基础能力建设工程”、四川…

运维系列.Linux下的用户管理

运维系列 Linux下的用户管理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/ar…

LabVIEW FPGA开发NI sbRIO-9607高精度数字滤波器

使用NI sbRIO-9607硬件平台&#xff0c;通过LabVIEW FPGA模块实现一个高精度数字滤波器。该应用不需要额外的实时操作系统 (RT)&#xff0c;所有控制与数据处理均在sbRIO-9607的FPGA上完成&#xff0c;充分利用其并行处理能力&#xff0c;实现低延迟、高性能的数据滤波。这种滤…

最新 Navicat Data Modeler 4 | 产品介绍

在过去的几周里&#xff0c;我们已经介绍了 Navicat 版本 17&#xff0c;现在我们来把注意力转移到另外两个值得关注的产品上&#xff0c;即 Navicat Data Modeler 和 Navicat BI&#xff08;之前称为 Navicat Chart Creator&#xff09;。今天的博客将介绍 Navicat Data Model…

AI Agent:人类工作范式的颠覆者还是人机协作新范式?

编者按&#xff1a; 当前大热的大语言模型和检索增强生成模型&#xff0c;虽然在语言理解和内容生成方面取得了突破性的进展&#xff0c;但仍然存在诸多限制。它们缺乏根据目标导引行为、持续学习和与环境交互的能力&#xff0c;难以应对复杂多变的现实场景需求。 今天为大家带…

代理IP科普:IP黑名单与IP白名单的机制与作用

在IP代理使用中&#xff0c;我们经常听到黑名单与白名单两个名词&#xff0c;它们不仅提供了强大的防御机制&#xff0c;还可以灵活应对不同的安全威胁。本文将详细探讨IP黑名单和白名单在网络安全中的双重屏障作用。 一、IP黑名单和白名单定义 IP黑名单与IP白名单是网络安全中…

事务管理AOP

通过事务操作 删除部门的时候,同时删除员工,那么如果其中有异常,那么就进行事务回滚 使用注解Trance Transactional-propagation(传播行为)

基于协同过滤算法的东北特产销售系统的设计

基于协同过滤算法的东北特产销售系统的设计 管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;公告管理&#xff0c;新闻信息管理&#xff0c;商品管理 农户账户功能包括&#xff1a;系统首页&#xf…

vue3学习(七)

前言 接上一篇学习笔记&#xff0c;今天主要是分享上次学习完了&#xff0c;还没来得及记录&#xff0c;趁今天晚上换换脑子的时间记录下。 今天主要是记录的vuex文件的拆分&#xff0c;因为毕竟如果只在一个index.js文件写&#xff0c;文件会随着业务的复杂性上升&…

从0-1实现大模型

目录 输入数据准备 滑动窗口造数据 Data sampling with a sliding window 数据加载器的输出DataLoader 位置编码Encoding word positions 自注意力机制 点积的原理 QKV的原理 实现代码 Multi-head Attention 线性层 github: LLMs-from-scratch/ch02/01_main-chapte…

MySQL之查询性能优化(六)

查询性能优化 查询优化器 9.等值传播 如果两个列的值通过等式关联&#xff0c;那么MySQL能够把其中一个列的WHERE条件传递到另一列上。例如&#xff0c;我们看下面的查询: mysql> SELECT film.film_id FROM film-> INNER JOIN film_actor USING(film_id)-> WHERE f…

四川汇聚荣聚荣科技有限公司综合实力怎么样?

在科技日新月异的今天&#xff0c;企业的综合实力成为衡量其市场竞争力的重要指标。四川汇聚荣聚荣科技有限公司作为一家在行业内具有一定影响力的企业&#xff0c;其综合实力如何&#xff0c;自然成为外界关注的焦点。以下将从多个维度深入分析该公司的实力。 一、公司概况与核…

排序---快速排序

前言 个人小记 一、代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_ARR 100000 #define swap(a,b)\ {\__typeof(a) __ca;\ab,b__c;\ } #define TEST(func ,arr,l,r)\ {\int nr-l;\printf("tes…