React 合成事件

问题的开始

由setState 引出
问:setState 是同步的是还异步的?
答:在React合成事件中是异步的,在原生事件中是同步的。
那么,React 合成事件是什么呢?
React 自己实现了一套高效的事件注册,存储,分发和重用逻辑,在DOM事件体系基础上做了很大改进,减少了内存消耗,简化了事件逻辑。它有如下特点:

  1. 事件绑定在document上
    2.自身实现了一套冒泡机制,在冒泡阶段处理事件
    3.有一套自己的合成事件
    4.用对象池来管理合成事件对象的创建和销毁,这样减少了垃圾的生成和新对象内存的分配,大大提高了性能

事件触发过程

当事件触发的时候,我们的组件会生成一个合成事件,然后传递到document当中,document会通过dispatchEvent 回调函数依次执行dispatchListerner中同类型事件的监听函数。

事件注册

事件注册是在组件生成的时候,我们将Virtual DOM 中的所有事件对应的原生事件都注册在document 的一个监听器中( ListernerBank)

事件对象可能会被频繁创建和回收,因此 React 引入事件池,在事件池中获取或释放事件对象。即 React 事件对象不会被释放掉,而是存放进一个数组中,当事件触发,就从这个数组中弹出,避免频繁地去创建和销毁(垃圾回收)。
在 React 中,“合成事件”会以事件委托[Event Delegation]方式绑定在组件最上层,并在组件卸载(unmount)阶段自动销毁绑定的事件。
React 所有事件都挂载在 document 对象上;
当真实 DOM 元素触发事件,会冒泡到 document 对象后,再处理 React 事件;
所以会先执行原生事件,然后处理 React 事件;
最后真正执行 document 上挂载的事件。

你可能感兴趣的:(React 合成事件)