react合成事件

React合成事件是指将原生事件合成一个React事件,之所以要封装自己的一套事件机制,目的是为了实现全浏览器的一致性,抹平不同浏览器之间的差异性。比如原生onclick事件对应React中的onClick合成事件。我们先来看一下React事件和原生事件在使用上的区别:

js 复制代码
const handleClick = (e) => {e.preventDefault();}

// 原生事件
<div onclick="handleClick()"></div>

// React合成事件
<div onClick={HandleCilck}></div>

从中可以看到,React合成事件使用驼峰的命名方式,而原生事件使用全小写的方式;

另外,React事件处理函数使用事件对象形式,原生事件使用字符串的形式。

我们已经知道onClick事件是一个合成事件,那合成事件是如何跟原生事件产生关联的呢?首先我们来复习一下事件流原理:

如上图所示,所谓事件流包括三个阶段:事件捕获、目标阶段和事件冒泡。事件捕获是从外到里,对应图中的红色箭头标注部分window -> document -> html ... -> target,目标阶段是事件真正发生并处理的阶段,事件冒泡是从里到外,对应图中的target -> ... -> html -> document -> window。 React合成事件的工作原理大致可以分为两个阶段:

  1. 事件绑定
  2. 事件触发

在React17之前,React是把事件委托在document上的,React17及以后版本不再把事件委托在document上,而是委托在挂载的容器上了,本文以16.x版本的React为例来探寻React的合成事件。当真实的dom触发事件时,此时构造React合成事件对象,按照冒泡或者捕获的路径去收集真正的事件处理函数,在此过程中会先处理原生事件,然后当冒泡到document对象后,再处理React事件。

注:React17中上述案例的执行会有所区别,会先执行所有捕获事件后,再执行所有冒泡事件。

总结

由于事件对象可能会频繁创建和回收在React16.x中,合成事件SyntheticEvent采用了事件池,合成事件会被放进事件池中统一管理,这样能够减少内存开销。React通过合成事件,模拟捕获和冒泡阶段,从而达到不同浏览器兼容的目的。

相关推荐
陈随易7 小时前
bm2,Node.js 与 Bun 项目部署新选择
前端·后端·程序员
福兮说8 小时前
canvas 旋转图片的六个坑:四角被裁、Math.ceil 多出 1px 黑边、JPG 角发黑、翻转方向反了
前端·javascript·图像处理·canvas
传人once10 小时前
多图片上传预览功能如何写
前端·css·html·jquery·html5
Eric.4610 小时前
Wan‑Animate+MiniMax-H3 本地部署 AI 漫剧流水线:8G 显存动作迁移与动态分镜工程实战
前端·人工智能·comfyui·ai漫剧
库拉镜像AI牛牛12 小时前
短剧内容自动化生产:知漫剧工作室落地教程
大数据·服务器·前端·人工智能·语音识别
律宏阔12 小时前
Flutter 列表图片内存优化:CachedNetworkImage 与 ClipRRect 的取舍
前端·flutter
行者全栈架构师12 小时前
【鸿蒙心迹】相册文搜图工程化落地:HarmonyOS 7.0 端侧 AI 检索全链路实战与 5 个踩坑解法
前端
律宏阔12 小时前
Dart 3 Record:解决 Future.wait 异构返回值的类型问题
前端·flutter
Seraphina3612 小时前
DVWA(XSS Reflected/Stored High,CSRF Low)
前端·xss·csrf
默_笙13 小时前
🍔 中间件不只是打日志:四个钩子、一次短路,和自带的工具
前端·javascript