【React】事件机制

事件机制

react 基于浏览器的事件机制自身实现了一套事件机制,称为合成事件。比如:onclick -> onClick

获取原生事件:e.nativeEvent

onClick 并不会将事件代理函数绑定到真实的 DOM节点上,而是将所有的事件绑定到结构的最外层(document,减少内存开销),使用一个统一的事件去监听。事件监听器维持了一个映射保存所有组件内部的事件监听和处理函数,当组件挂载或者卸载时,在事件监听器上插入或者删除一些对象。(简化了事件处理和回收机制,提升效率)

事件发生 -> 事件处理器 -> 映射真实事件处理函数并调用

原生和合成事件执行顺序:

import React from 'react';
class App extends React.Component{constructor(props) {super(props);this.parentRef = React.createRef();this.childRef = React.createRef();}componentDidMount() {console.log("React componentDidMount ");this.parentRef.current?.addEventListener("click", () => {console.log(" DOM ");});this.childRef.current?.addEventListener("click", () => {console.log(" DOM ");});document.addEventListener("click", (e) => {console.log(" document DOM ");});}parentClickFun = () => {console.log("React ");};childClickFun = () => {console.log("React ");};render() {return (<div ref={this.parentRef} onClick={this.parentClickFun}><div ref={this.childRef} onClick={this.childClickFun}></div></div>);}
}
export default App;

输出结果为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以:

  • react 所有事件都挂载到 document 对象上
  • 真实 DOM 元素触发事件,冒泡到 document 对象上,再处理 react 事件
  • 最后真正执行 document 上挂载的事件

阻止不同阶段的事件冒泡:

  • 阻止合成事件间的冒泡,用 e.stopPropagation()
  • 阻止合成事件与最外层document上的事件间的冒泡,用 e.nativeEvent.stoplmmediatePropagation()
  • 阻止合成事件与除最外层document.上的原生事件上的冒泡,通过判断e.target3来避免

事件绑定(this)

class ShowAlert extends React.Component {showAlert() {console.log(this);  // undefined}render() {return <button onClick={this.showAlert}>show</button>;}
}

为了解决没有绑定 this 问题,有四种方法。

// render 方法使用 this:
class App extends React.Component {handleClick() {console.log('this > ', this);}render() { // 每次 render 的时候 都会重新进行 bind 的绑定 影响性能return (<div onClick={this.handleClick.bind(this)}>test</div>)}
}
// render 中使用箭头函数
class App extends React.Component {handleClick() {console.log('this > ', this);}render() {return (<div onClick={e => this.handleClick(e)}>test</div>)}
}
// constructor 中使用 bind
class App extends React.Component {constructor(props) {super(props);this.handleClick = this.handleClick.bind(this);}handleClick() {console.log('this > ', this);}render() {return (<div onClick={this.handleClick}>test</div>)}
}
// 函数定义阶段使用箭头函数
class App extends React.Component {constructor(props) {super(props);}handleClick = () => {console.log('this > ', this);}render() {return (<div onClick={this.handleClick}>test</div>)}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

latex本地运行(MiKTeX+VScode)-20241006

1、安装 LaTex 主流的分发版本应该就是 TeXLive 和 MikTeX 了,这里使用 MikTex(只有几百M)—— TeXLive 太大了、默认安装全部包,可选自选部分安装单实在有些许麻烦,MikTeX 则方便得多,需要的时候可以自动安装全部包 点击跳转到 MiKTeX 官网,直接下载即可:不用担心什…

体系结构论文(五十五):Full Stack Optimization of Transformer Inference

Full Stack Optimization of Transformer Inference 一、文章介绍 背景 Transformer模型被广泛应用于各种任务&#xff0c;如计算机视觉、自然语言处理、语音识别等&#xff0c;原因是它们的准确度很高。然而&#xff0c;这些模型的复杂性和规模不断增加&#xff0c;导致它们…

连续时间傅里叶变换

一、非周期信号的表示&#xff1a;连续时间傅里叶变换 傅里叶变换对&#xff1a; 通常称为的频谱 二、傅里叶变换的收敛 1、绝对可积 2、在任何有限区间内&#xff0c;只有有限个最大值和最小值 3、在任何有限区间内&#xff0c;有有限个不连续点&#xff0c;且在每个不连…

信息安全工程师(36)访问控制主要产品与技术指标

前言 访问控制是确保系统资源安全的重要手段&#xff0c;其主要产品和技术指标对于理解和实施有效的访问控制策略至关重要。 一、访问控制主要产品 访问控制产品种类繁多&#xff0c;根据应用场景和需求的不同&#xff0c;可以分为以下几类&#xff1a; 防火墙&#xff1a; 功能…

Linux环境搭建(云服务器)

前言 Linux是一款由林纳斯托瓦兹开源的操作系统&#xff0c;时至今日拥有着丰富的讨论资源和系统完整性&#xff0c;基本普及于市场中的公司内部&#xff0c;所以有着很大的学习价值。学习Linux主要分为两大部分&#xff0c;一是学习Linux的系统操作&#xff0c;包括且不限于掌…

codetop标签树刷题(二)!!暴打面试官!!!!

个人复习用 1.二叉搜索树中第k小的元素2.删除给定值的叶子节点3.把二叉搜索树转换为累加树4.合并二叉树5.翻转二叉树6.二叉树中所有距离为k的节点7.路径总和II8.寻找重复的子树9.二叉树的序列化和反序列化 1.二叉搜索树中第k小的元素 给定二叉搜索树的根节点root&#xff0c;和…

【一起学NLP】Chapter3-使用神经网络解决问题

目录 使用神经网络解决问题Tip:数据集划分学习使用的代码Tip:epochTip:数据打乱Trainer类Tip-高速化计算 使用神经网络解决问题 import sys sys.path.append(..) # 为了引入父目录的文件而进行的设定 from dataset import spiral import matplotlib.pyplot as pltx,t spiral.…

【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象

文章目录 请求1. 传递单个参数注意事项1 . **正常传递参数**2 . **不传递 age 参数**3 . **传递参数类型不匹配** 2. 传递多个参数3. 传递对象 请求 访问不同的路径&#xff0c;就是发送不同的请求。在发送请求时&#xff0c;可能会带一些参数&#xff0c;所以学习 Spring 的请…

传奇GOM引擎架设好进游戏后提示请关闭非法外挂,重新登录,如何处理?

今天在架设一个GOM引擎的版本时&#xff0c;进游戏之后刚开始是弹出一个对话框&#xff0c;提示请关闭非法外挂&#xff0c;重新登录&#xff0c;我用的是绿盟登陆器&#xff0c;同时用的也是绿盟插件&#xff0c;刚开始我以为是绿盟登录器的问题&#xff0c;于是就换成原版gom…

如何构建LSTM神经网络模型

一、了解LSTM 1. 核心思想 首先&#xff0c;LSTM 是 RNN&#xff08;循环神经网络&#xff09;的变体。它通过引入细胞状态 C(t) 贯穿于整个网络模型&#xff0c;达到长久记忆的效果&#xff0c;进而解决了 RNN 的长期依赖问题。 2. 思维导图 每个LSTM层次都有三个重要的门结构…

VMware ESXi更改https的TLS协议版本

简要概述 TLS 1.0 和 1.1 是已弃用的协议&#xff0c;具有广为人知的缺点和漏洞。应在所有接口上启用 TLS 1.2&#xff0c;并在支持的情况下禁用 SSLv3、TL 1.1 和 1.0。强制要求 TLS 1.2 可能会破坏 vSphere 的第三方集成和加载项。在实施 TLS 1.2 后仔细测试这些集成&#x…

maven指定模块快速打包idea插件Quick Maven Package

问题背景描述 在实际开发项目中&#xff0c;我们的maven项目结构可能不是单一maven项目结构&#xff0c;项目一般会用parent方式将各个项目进行规范&#xff1b; 随着组件的数量增加&#xff0c;就会引入一个问题&#xff1a;我们只想打包某一个修改后的组件A时就变得很不方便…

C++ 算法学习——1.8 悬线法

1.问题引入&#xff1a;对于一个矩形图&#xff0c;图中放置着不少障碍&#xff0c;要求出最大的不含障碍的矩形。 2.分析&#xff1a;显然一个极大矩形是左右上下都被障碍挡住&#xff0c;无法再扩大的矩形&#xff0c;此时障碍也包括边界。 3.方法&#xff1a;悬线法考虑以…

01 从0开始搭建django环境

1 安装相关版本的django&#xff0c;这里&#xff0c;我以5.1.1为例子 pip3 install django5.1.1 (.venv) D:\DjangoCode\MS>pip3 install django5.1.1 Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting django5.1.1Using cached https://pypi.t…

STM32定时器(TIM)

目录 一、概述 二、定时器的类型 三、时序 四、定时器中断基本结构 五、定时器定时中断代码 六、定时器外部时钟代码 一、概述 TIM(Timer)定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基…

TM1618数码管控制芯片使用共阳极数码管过程中的问题和解决办法

控制芯片的基本了解 相比于不用控制芯片的电路&#xff1a;这里带2根电源线和3个信号线&#xff0c;共使用了5根线&#xff0c;但可以控制4个8段数码管显示。若是电路直接控制4个8段数码管需要84113个接口&#xff0c;这对于MCU的珍贵引脚简直是浪费。 这里不会出现余晖效应也…

Python编程常用的35个经典案例

Python 的简洁和强大使其成为许多开发者的首选语言。本文将介绍35个常用的Python经典代码案例。这些示例覆盖了基础语法、常见任务、以及一些高级功能。 1.列表推导式 这个例子展示了列表推导式&#xff0c;用于生成FizzBuzz序列。 fizz_buzz_list ["FizzBuzz" i…

ultralytics yolo pose 示例:加载官方pose模型进行推理

Ultralytics YOLO 是计算机视觉和 ML 领域专业人士的高效工具。 安装 ultralytics 库&#xff1a; pip install ultralytics 官方YoLo Pose 模型列表信息&#xff1a; 实现代码如下&#xff1a; from ultralytics import YOLO import cv2 # Load a model ckpt_dir "…

HTB:Ignition[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which service version is found to be running on port 80? 2.What is the 3-digit HTTP status code returned when you visit http://{machine IP}/? 3.What is the virtual host name the webpage expects to be accessed by? 4.…

详细解释:前向传播、反向传播等

详细解释:前向传播、反向传播等 在机器学习和深度学习中,**前向传播(Forward Propagation)和反向传播(Backward Propagation)**是训练神经网络的两个核心过程。理解这两个概念对于掌握神经网络的工作原理、优化方法以及模型微调技术(如LoRA、P-tuning等)至关重要。以下…