react 16之前
React 并不是将click事件绑定到了div的真实DOM上,而是在document处监听了所有的事件,当事件发生并且冒泡到document
处的时候,React将事件内容封装并交由真正的处理函数运行。这样的方式不仅仅减少了内存的消耗,还能在组件挂在销毁时统一订阅和移除事件。
什么是事件池
合成事件对象池,是 React 事件系统提供的一种性能优化方式。合成事件对象在事件池统一管理,不同类型的合成事件具有不同的事件池。
事件池未满:React创建新的事件对象,派发给组件;
事件池装满:React从事件池中复用事件对象,派发给组件;
合成事件对象的事件处理函数全部被调用之后,所有属性都会被置为 null
react17之后
所有事件都是委托在id = root的DOM元素中
在应用中所有节点的事件监听其实都是在id = root的DOM元素中触发
没有事件池了
将事件委托在 React 应用的根 DOM 容器则可以避免这样的问题,减少了多个 React 应用并存可能产生的问题,并且事件系统的运行也更贴近现在浏览器的表现。