跳到主要内容

React合成事件机制

面试速答​

  • 以下内容以 React 18 为准。
  • React 合成事件是 React 对浏览器原生事件做的一层封装,统一了事件行为和分发入口。
  • 它的核心点有 3 个:
    • 事件委托
    • 跨浏览器统一接口
    • 事件触发时纳入 React 的更新体系
  • 从 React 17 开始,事件委托不再统一挂到 document,而是挂到 root 容器;React 18 延续这个行为。

核心理解​

1. 什么是合成事件​

你在 JSX 里写的:

button onClick={handleClick}

拿到的事件对象通常不是浏览器直接给你的原生事件,而是 React 包装后的 SyntheticEvent。

它提供了统一的字段和方法,比如:

  • target
  • currentTarget
  • stopPropagation
  • preventDefault

需要拿原生事件时,可以看 event.nativeEvent。

2. 为什么 React 要做这层封装​

原因主要有两个:

  • 早期用于抹平浏览器差异
  • 更重要的是把事件系统接入 React 自己的更新调度

这样事件触发后的状态更新可以和 React 内部批处理、优先级管理协同。

3. 事件委托怎么理解​

React 不会给每个节点都单独绑一套原生事件监听,而是把同类事件集中委托到根容器,再在内部找到应该响应的组件。

这样可以减少大量重复监听器。

React 18 下要特别记住的点​

1. 事件池已经不是重点​

很多旧资料会说“React 事件对象会被回收,异步里不能用”。这是 React 16 及更早时代的高频点。

React 17 之后事件池机制就不再是主角了,React 18 不需要再把它当必背结论。

2. 原生事件和 React 事件混用要小心​

如果一部分逻辑挂在原生 DOM 监听上,另一部分挂在 React 上,触发顺序和冒泡路径容易让人误判。

工程上更稳的做法是尽量统一事件体系。

典型题标准答法​

问:React 合成事件的好处是什么?​

答:统一事件接口、减少监听器数量,并且让事件触发后的更新能进入 React 的调度和批处理体系。

问:React 18 的事件委托挂在哪?​

答:挂在 root 容器上,不是统一挂到 document。这是 React 17 之后的变化。

易错点​

  • 还在把“事件池”当 React 18 的核心考点。
  • 说不清合成事件和原生事件的关系。
  • 混用两套事件系统后,错误归因给 React。

速记要点​

  • 合成事件 = React 包装后的事件系统。
  • 委托点在 root 容器。
  • React 18 下重点是事件和更新调度的配合,不是旧版事件池。