React 为什么要自己搞一套事件系统?
先说结论:为了抹平浏览器差异 + 性能优化。
原生事件对象在 IE、Safari、Chrome 上的属性名不一致。React 统一了接口:
e.targete.preventDefault()开发者不用关心兼容性问题。
React 不会把事件监听器绑定到每个 DOM 元素上。
而是把所有事件都监听在根节点上:
委托节点变了:
document#root div)为什么改?
解决微前端场景下的事件冲突。
多个 React 应用共存,或者 React 嵌入 jQuery 页面,绑定在 Document 上的全局监听器会互相干扰。
绑定到 Root 容器实现了应用隔离。
因为现代浏览器 JS 引擎优化这块开销微不足道,而这个特性带来的心智负担太大。现在可以放心在异步代码里用 e 了。
| 特性 | 说明 |
|---|---|
| 合成事件 | 统一接口,抹平浏览器差异 |
| 事件委托 | 监听在根节点,减少内存 |
| React 17 | 绑定到 Root 容器 |
| Event Pooling | React 17 已移除 |