面试:React的事件机制?

729 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

我们都知道 W3C 协会制定了 DOM 的标准,W3C DOM 标准可以分为 DOM1DOM2DOM3 三个版本。从 DOM2 开始,DOM 的事件传播分三个阶段进行:事件捕获阶段处于目标阶段事件冒泡阶段

React 为了进行浏览器兼容,实现更好的跨平台更好的优化方便事件统一管理事务机制,自己实现了一套事件系统,叫做 合成事件

原生DOM事件流

原生 DOM 事件分为三个阶段事件捕获阶段处于目标阶段事件冒泡阶段*

具体可以参考之前的文章: 【# 事件捕获和事件冒泡

image.png (本图片来源网络)

React 事件原理

React 的事件主要分为两个阶段:事件注册.事件分发

事件注册

组件挂载的阶段,事件注册主要做了两件事情:document注册事件存储事件回调,这个过程也叫 react 的事件委托机制

image.png(本图片来 源网络)

document注册事件

在组件挂载阶段,react 根据组件本身声明的事件类型(onclick、onchange、等等),通过 addEventListenerdocument 添加事件监听,然后指定统一的回调函数 dispatchEvent,同一事件不论注册几次,最终只会保留一个有效实例,从而减少内存开销。

存储事件回调

React 会把组件内所有的事件统一存放到一个对象中(listenerBank),通过事件类型进行分类,回调函数的存储采用键值对(key/value)的方式,key 是组件的唯一标识 idvalue 对应的就是事件的回调函数

如下图所示: image.png(本图片来源网路)

事件分发

React 的事件分发就是事件触发。

React 的事件触发只会发生在 DOM 事件流的冒泡阶段,因为在 document 上注册时就默认是在冒泡阶段被触发执行

主要过程如下: image.png(本图片来源网路) 图中阻止冒泡是指调用 stopImmediatePropagation 方法阻止冒泡。 【stopPropagation 与 stopImmediatePropagation 的区别

在 DOM 事件流的冒泡阶段先后经历的元素:child <div> -> parent <div> -> <body> -> <html> -> document -> window

问题:React 合成事件和原生 DOM 事件哪个先执行?

React 的事件委托机制,React 组件对应的原生 DOM 节点上的事件触发时机总是在 React 组件上的事件之前。

结语

如果这篇文章帮到了你,欢迎点赞👍和关注⭐️

文章如有错误之处,希望在评论区指正🙏🙏。