React-合成事件

React 合成事件 React 合成事件 一、概念介绍 React合成事件是React 模拟原生DOM事件所有能力 的一个事件对象。 根据 W3C规范 来定义合成事件,兼容所有浏览器,拥有与浏览器原声事件相同的接口。 ⚠️ 在React中,所有事件都是合成的,不是原生DOM事件,可以通过 e.nativeEvent 属性获取DOM事件。 const handleClick = (e) => console.log(e.nativeEvent);; const button = <button onClick={ha 阅读详情

js 事件机制

先回顾下 js 的事件机制

事件触发三阶段

  1. window 往事件触发处传播,遇到捕获事件会触发回调
  2. 传播到事件触发处时触发事件回调
  3. 从事件触发往 window 传播,遇到冒泡事件会触发回调

事件委托

在事件机制中,执行完目标事件回调后,事件会往父元素冒泡,最终直到根元素。事件委托其实就是依赖于事件冒泡实现的。事件委托相较于监听目标事件的优势在于 统一管理事件 和 节省内存开销

<ul id="ul">
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>
<script>
  // 事件委托小栗子
  let ul = document.querySelector("#ul");
  ul.addEventListener("click", (event) => {
     
     
    console.log(event.target);
  });
</script>

事件常用方法

  • e.stopPropagation 阻止事件捕获或冒泡
  • e.preventDefault 阻止默认行为
  • e.stopImmediatePropagation 阻止触发同一元素的其他相同事件

react18 事件机制

<div ref={
   
   parentRef} onClick={
   
   parentBubble} onClickCapture={
   
   parentCapture}>
  <button ref={
   
   childRef} onClick={
   
   childBubble} onClickCapture={
   
   childCapture}>
    点击
  </button>
</div>

上面代码层级如下 document -> root -> div -> button

  • document 注册的事件最先触发
  • root 注册的事件触发,React 根据当前点击的 event.target 收集对应 DOM 节点的 fiber 节点中的 pendingProps,pendingProps 在这里简单理解就是 jsx 中 DOM 节点对应的 props,收集 props 中的 onClickCapture(因为触发的是点击事件,所以收集 onClickCapture 捕获函数),最终在队列中收集成 [childCapture, parentCapture],然后倒序触发
  • div 注册的捕获事件触发
  • p 注册的捕获事件触发
  • p 注册的冒泡事件触发
  • div 注册的冒泡事件触发
  • root 收集的队列里有两个冒泡事件, [childBubble, parentBubble], 然后正序触发
  • document 注册的冒泡事件触发

react 17 合成事件机制

其实 React 的事件机制就是一个典型的事件代理,将所有 DOM 节点的事件代理到根节点上统筹处理,基本原理如下:

  1. 初始化根节点,在根节点上绑定原生事件的监听器并分配优先级
  2. React 渲染过程中收集事件
  3. 渲染完成后调度真实事件的调用

源码执行过程如下:

  1. 执行 dispatchEvent
  2. 创建事件对应的合成事件 SyntheticEvent
  3. 收集捕获的回调函数和对应的节点实例
  4. 收集冒泡的回调函数和对应的节点实例
  5. 执行对应的回调函数,同时将 SyntheticEvent 作为参数传入

完整示例

比如我们在 react 中触发一次 click 事件

<div>
  <button onClick={handerClick}>点击</button>
</div>

button 对应一个 Fiber Node,在 memoizedProps 上挂载事件

memoizedProps = {
   onClick: handerClick,
}

react16 事件机制

1.事件注册

react在解析jsx props时会取出绑定的事件,通过事件的 map 对象找到原生事件类型,然后通过listenTo方法将事件代理到document上。listenTo会将事件分为trapCapturedEvent(捕获)和trapBubbledEvent(冒泡)两种类型进行注册

trapCapturedEvent:scroll/focus/blur

react-原生事件和合成事件的区别 react-原生事件和合成事件的区别及源码分析 概念 class EventClickDemo extends React.Component { constructor(props) { super(props) this.btnRef = React.createRef() } componentDidMount() { // 这里就是js原生事件 this.btnRef.current.addEventListener('click', function(e) { cons 阅读详情

相关推荐

React 合成事件系统深度解析

跨浏览器一致性性能优化(事件委托 + 事件池)统一的事件处理接口事件委托到根节点合成事件包装原生事件基于虚拟DOM的事件传播JSX事件属性(标准化的事件对象(自动清理和性能优化优先使用合成事件避免混用原生事件大型列表使用事件代理升级到React 17+简化处理委托节点变更(root而非document)移除事件池机制修复传播行为。

weixin_43822134的博客 1117

什么是 React 的合成事件?

合成事件是 React 对原生事件的一个封装。React 创建了一种合成事件对象,这个对象模拟了浏览器的原生事件。合成事件的主要目的是提供跨浏览器的一致性,使得开发者无需关注不同浏览器之间的事件系统差异。React 的合成事件是一个强大的事件处理机制,提供了跨浏览器的一致性,优化了性能,简化了事件处理的复杂性。通过合成事件,开发者可以专注于业务逻辑,而不必担心不同浏览器之间的差异。

祈澈菇凉 1244

【音视频处理】MP4、FLV、HLS适用范围,在线视频播放哪个更好

本期我们讨论在线点播的视频格式,对比这些视频格式的优劣以及原因 1、封装格式的作用 2、MP4 3、FLV 4、HLS

池鱼 - YiiGaa 2万+

TMS热管理RCP开发全流程:从MATLAB算法到硬件部署的5个关键步骤

本文详细解析了TMS热管理系统RCP开发的5个关键步骤,从MATLAB算法设计到硬件部署的全流程。通过熠速RCP平台,工程师可以高效实现热管理控制算法的仿真验证、硬件选型、实时化处理及系统集成,显著缩短开发周期并提升系统性能。文章特别强调了Simscape模型验证和硬件接口配置的重要性。

weixin_29224589的博客 389

手眼标定搞定了,手眼矩阵不知道怎么用?快戳!!

手眼标定得到手眼矩阵到底该咋用? 大家好,我是小鱼。上几期给大家分享了关于手眼标定的方法,如果还有不清楚如何让进行手眼标定的同学可以参考下面的文章: 机器人手眼标定都能搞不定?快戳,最好用的手眼标定库!!! 很多同学做完了手眼标定之后得到了手眼矩阵,但是不知道怎么用于程序当中去,还有很多同学搞不清楚各个坐标系之间的关系,今天小智就给大家讲讲手眼矩阵的使用问题。 一、手眼矩阵为什么会长的不一样? 做完手眼标定,得到的手眼矩阵,有可能会长的不一样,这是因为旋转变换是有很多种表示方法的。 1.旋转的表

生活不止眼前的苟且 5344

python中frida的安装+frida-server(雷电模拟器)保姆级安装教程

frida的安装,安卓逆向,adb

2301_80224944的博客 4583

YOLOv11改进策略【模型轻量化】| 替换轻量化骨干网络:ShuffleNet V1

本文记录的是基于ShuffleNet V1的YOLOv11轻量化改进方法研究。ShuffleNet利用和操作降低计算成本,克服了现有先进架构在极小网络中因 1×1 卷积计算成本高而效率低的问题。相比一些传统的网络架构,能更好地。本文配置了原论文中和四种模型,以满足不同的需求。

Limiiiing的博客 1231

微信开发 - 最新第三方网站接入微信登录、微信支付时,本地 redirect_uri 参数错误导致无法调试的解决方案(微信开放平台)完美解决每次都需要部署到线上测试,在本地使用本地 ip 就能轻松调试

redirect_uri参数错误,微信第三方登录,没有服务器时的测试方法,微信开放平台的回调域名怎么设置为本地域名IP,微信登录微信支付每次调试都需要放到服务器上怎么办,微信登录支付业务在本地调试不了怎么办,在本地怎么测试微信支付和登录,微信第三方登陆本地测试,怎么在本地进行测试,微信回调域怎么设置为本地IP,微信扫码登录redirect_uri参数错误,微信开放平台,微信开放平台开发的第三方登录和支付,vue2,nuxt2,vue3,nuxt3,uniapp,微信开放平台,公众号,微信支付,微信登录授权,

🏆 前端领域优质创作者 8791

RK3399平台入门到精通系列讲解 - 总目录

欢迎大家来到内核笔记的《RK3399平台开发入门到精通系列讲解》,开始前博主先列出RK3399平台学习的大纲,同时这也可以作为大家学习RK3399内核与安卓框架的参考。下面蓝字都是传送门,点击进入即可:...

内核笔记 10万+

【软考高级架构】案例题考前突击6——大数据架构

前一类的数据主要由流量方以接口的方式提供(比如对接的腾讯广点通平台),后一类则是某网特有的数据,通过买家的浏览、下单、付款日志算出来。1. 在数据层面只维护一张包含所有指标的MySQL表,表中的stday字段作为索引,stday=当天的保存实时数据,stday<当天的保存离线数据。典型的大数据架构,除了Lambda架构之外,还有kappa架构,这两个架构的区别如下标所示,请补充表中空(1)-(4)第二,实时数据只对接了内部的kafka消息,没有实时的获取第三方的曝光、点击、浏览数据。

qq837993702的博客 67

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: React-组件通信
下一篇: React-diff原理
__lucas
博客等级 码龄9年 329粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值