小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
我们都知道 W3C
协会制定了 DOM
的标准,W3C DOM 标准可以分为 DOM1
、DOM2
、DOM3
三个版本。从 DOM2
开始,DOM 的事件传播分三个阶段进行:事件捕获阶段、处于目标阶段和事件冒泡阶段。
React 为了进行浏览器兼容,实现更好的跨平台,更好的优化,方便事件统一管理事务机制,自己实现了一套事件系统,叫做 合成事件。
原生DOM事件流
原生 DOM
事件分为三个阶段事件捕获阶段、处于目标阶段和事件冒泡阶段*
具体可以参考之前的文章: 【# 事件捕获和事件冒泡】
(本图片来源网络)
React 事件原理
React 的事件主要分为两个阶段:事件注册、.事件分发
事件注册
组件挂载的阶段,事件注册主要做了两件事情:document注册事件、存储事件回调,这个过程也叫 react 的事件委托机制。
(本图片来 源网络)
document注册事件
在组件挂载阶段,react 根据组件本身声明的事件类型(onclick、onchange、等等),通过 addEventListener
给 document
添加事件监听,然后指定统一的回调函数 dispatchEvent
,同一事件不论注册几次,最终只会保留一个有效实例,从而减少内存开销。
存储事件回调
React 会把组件内所有的事件统一存放到一个对象中(listenerBank
),通过事件类型进行分类,回调函数的存储采用键值对(key/value
)的方式,key
是组件的唯一标识 id
,value
对应的就是事件的回调函数。
如下图所示: (本图片来源网路)
事件分发
React 的事件分发就是事件触发。
React 的事件触发只会发生在 DOM 事件流的冒泡阶段,因为在 document 上注册时就默认是在冒泡阶段被触发执行
主要过程如下:
(本图片来源网路)
图中阻止冒泡
是指调用 stopImmediatePropagation
方法阻止冒泡。
【stopPropagation 与 stopImmediatePropagation 的区别】
在 DOM 事件流的冒泡阶段先后经历的元素:
child <div>
->parent <div>
-><body>
-><html>
->document
->window
问题:React 合成事件和原生 DOM 事件哪个先执行?
React 的事件委托机制,React 组件对应的原生 DOM 节点上的事件触发时机总是在 React 组件上的事件之前。
结语
如果这篇文章帮到了你,欢迎点赞👍和关注⭐️
文章如有错误之处,希望在评论区指正🙏🙏。