详细聊聊 React 的事件系统是如何实现的
结论:React 用根节点事件委托接住原生事件,再通过插件系统提取 SyntheticEvent,沿 Fiber 路径收集 capture/bubble listeners,最后形成队列按顺序执行;回调里的更新会映射到对应事件优先级。
1. 事件委托
- 根容器少量监听器覆盖大量组件事件
- 组件增删不需要频繁 add/remove 原生监听
2. 插件提取与分发
- 插件根据事件类型提取 SyntheticEvent
- 通过 Fiber 路径收集 listeners,组装 dispatchQueue
- 按 capture → bubble 执行回调
3. 常见追问
- “为什么 React 17 把委托从 document 移到 root”:多 root 更隔离
- “事件对象能异步用吗”:不要长期持有,必要时提前解构