当前位置: 首页 > news >正文

React的合成事件(SyntheticEventt)

文章目录

  • 前言


前言

React的合成事件(SyntheticEvent)是React为了统一不同浏览器的事件处理行为而封装的一套跨浏览器事件系统。它与原生事件的主要区别如下:


1. 事件绑定方式
• 合成事件:使用驼峰命名法绑定事件(如onClick),并通过JSX直接传递给组件。

  <button onClick={handleClick}>点击</button>

• 原生事件:通过addEventListener或HTML属性(小写命名,如onclick)绑定。

  button.addEventListener('click', handleClick);

2. 事件委托机制
• 合成事件:React将事件委托到根节点(如React 17 之前是 document,React 17+的root节点),通过事件冒泡捕获子组件的事件,而非直接绑定到目标元素。这减少了内存消耗,并简化了动态元素的处理。

• 原生事件:直接绑定到具体元素,可能因频繁的元素增删导致内存问题。


3. 事件对象
• 合成事件:接收的是SyntheticEvent对象,封装了原生事件对象,统一了跨浏览器的属性(如e.targete.stopPropagation())。

• 原生事件:直接使用浏览器提供的Event对象,不同浏览器的行为和属性可能存在差异。


4. 事件池(Event Pooling)
• 合成事件:事件对象会被重用(出于性能考虑),异步代码中访问事件属性需调用e.persist()

handleClick = (e) => {e.persist(); // 保留事件对象setTimeout(() => console.log(e.target), 100);
};

• 原生事件:事件对象不会被重用,可直接在异步代码中使用。


5. 事件传播与阻止冒泡
• 合成事件:e.stopPropagation()仅阻止合成事件的传播,不影响原生事件。

• 原生事件:e.stopPropagation()会阻止事件的捕获/冒泡,可能导致React合成事件无法触发(如果事件未冒泡到根节点)。


6. 执行顺序
• 同级事件:直接绑定在元素上的原生事件先于合成事件执行。

• 父子元素:

  1. 原生捕获阶段事件(如addEventListener('click', handler, true))。
  2. 合成捕获阶段事件(如onClickCapture)。
  3. 原生冒泡阶段事件。
  4. 合成冒泡阶段事件。

7. 自动绑定管理
• 合成事件:React在组件挂载/卸载时自动处理事件绑定与解绑。

• 原生事件:需手动通过removeEventListener解绑,否则可能导致内存泄漏。


8. 兼容性
• 合成事件:统一处理浏览器兼容性问题(如IE的event.targetevent.srcElement差异)。

• 原生事件:需开发者自行处理兼容性。


9. 事件类型覆盖
• 合成事件:支持常见事件(如onChangeonMouseEnter),但特殊事件(如resize)需通过原生事件处理。

• 原生事件:支持所有浏览器事件。


示例:混合使用时的行为

function App() {const handleSyntheticClick = () => console.log("合成事件");const handleNativeClick = () => console.log("原生事件");useEffect(() => {document.addEventListener("click", handleNativeClick);return () => document.removeEventListener("click", handleNativeClick);}, []);return <button onClick={handleSyntheticClick}>按钮</button>;
}

点击按钮时,输出顺序为:

  1. 原生事件(直接绑定在document上的冒泡阶段事件)。
  2. 合成事件(通过React根节点委托处理)。

总结
React合成事件通过封装原生事件,提供了跨浏览器一致性、性能优化和便捷的事件管理,但在混合使用时需注意执行顺序和事件传播的影响。对于特殊场景(如非冒泡事件scroll),仍需依赖原生事件处理。

http://www.xdnf.cn/news/543547.html

相关文章:

  • 企业终端设备的安全管控
  • 【Tauri2】046—— tauri_plugin_clipboard_manager(一)
  • RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试
  • Qt项目开发中所遇
  • 《Android 应用开发基础教程》——第十三章:权限管理机制与运行时权限请求(以拍照/存储为例)
  • MySQL——基本查询内置函数
  • 从零开始的抽奖系统创作(2)
  • vue3/vue2大屏适配
  • 基于统计检验与多模型对心脏病数据的分析与预测
  • Oracle 11g post PSU Oct18 设置ssl连接(使用wallets)
  • 企业级网络安全护盾:剖析高防IP原理与防护策略
  • 编程学习论坛测试报告
  • 隐形安全感
  • Linux Bash 中 $? 的详细用法
  • 【算法】定长滑动窗口5.20
  • 畅游Diffusion数字人(30):情绪化数字人视频生成
  • MVDR源码(可直接运行)
  • HarmonyOS NEXT~鸿蒙系统与mPaaS三方框架集成指南
  • 单端传输通道也会有奇偶模现象喔
  • PIL库的图像增强函数
  • 从ISO17025合规到信创适配 解密质检lims系统实验室的 AI 质检全链路实践
  • 【C++】C++的拷贝构造函数介绍使用
  • 【RK3588嵌入式图形编程】-Cairo-形状与填充
  • C++从入门到实战(十六)String(中)String的常用接口(构造接口,析构接口,迭代器,遍历修改,容量管理与数据访问)
  • 零基础设计模式——创建型模式 - 单例模式
  • .NET 10 - 尝试一下Minimal Api的Validation新特性
  • 开源一个记账软件,支持docker一键部署
  • APPtrace 智能参数系统:重构 App 用户增长与运营逻辑
  • C++中String类
  • 《经济日报》深度聚焦|珈和科技携手万果博览荟共筑智慧农业新示范高地 全链赋能蒲江茶果产业数字化转型升级