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 中的机制 1.原生事件冒泡到 document2.document 执行事件监听回调,把原...
    coolheadedY阅读 2,573评论 0 1
  • 1. 场景 父组件是个左右可滑动的组件,子组件是可左右滑动的图片展示。功能是手指左右滑动时可页面切换,但是在滑动图...
    捡了幸福的猪阅读 3,411评论 0 3
  • 为什么需要合成事件 兼容浏览器监听写法 避免大量节点绑定事件占用内存,将事件委托到document上,有统一的事件...
    吴晗君阅读 1,564评论 0 0
  • 博主最近在学习React事件绑定时,发现React绑定时间有其自身的一套机制,那就是合成事件。先看源码: Reac...
    shengqz阅读 30,656评论 3 26
  • 如果各位看了react的源码,会发现在事件处理的代码里,有那么一段注释: 下面就来说说这个。如果图片更直接,那么就...
    xiaohesong阅读 3,075评论 0 4