React通过使用合成事件和事件委托来处理事件。React不会直接在DOM元素上绑定事件监听器,而是在更高的层级(document)上设置事件监听器,当事件发生时,React通过事件委托将事件传给最近的事件监听器进行处理
合成事件:是React封装的浏览器原生事件的跨浏览器包装器;是React模拟原生DOM事件所有能力的一个事件对象。
为什么要封住合成事件?
1、跨平台兼容:不同浏览器由于内核的不同,对于事件对象也会存在差异,React通过将不同平台的事件进行模拟合成,抹平不同浏览器事件对象的差异,使其能够跨浏览器执行
2、事件统一管理:原生事件中,所有事件都会绑定在对应的DOM上,如果页面复杂,绑定的事件也会非常多,所以React将所有事件都放在document上统一管理,从而方便统一管理和事务机制
3、避免垃圾回收:实际项目中,我们的事件会被频繁的创建和回收,这样极其影响性能,React通过引入事件池,将事件存入一个数组中,如果这个事件触发,则直接在数组中弹出;避免频繁的创建和销毁
注意:合成事件的触发是基于浏览器的事件机制来实现的,通过冒泡机制冒泡到最顶层元素,然后再由 dispatchEvent统一去处理;所以原生事件阻止冒泡会阻止合成事件的触发,而合成事件的阻止冒泡则不会影响原生事件
原因:浏览器事件执行经过三个阶段:事件捕捉 -> 目标元素 -> 事件冒泡;DOM节点上的原生事件是在目标元素阶段执行,而合成事件是在冒泡阶段执行,原生事件会优先执行,然后再往父节点冒泡
原生事件(阻止冒泡)会阻止合成事件的执行
合成事件(阻止冒泡)不会阻止原生事件的执行
两者最好不要混合使用,避免出现一些奇怪的问题
原生事件和React事件差异: