2017-02-19 88 views
4

现在我已经想起了几天。了解React的综合事件系统

根据文档,React有synthetic event system,这是一个a cross-browser wrapper around the browser's native event。阅读文档,我的理解是正确的,定制(合成)事件系统不是关于效率,而是跨浏览器兼容性。

换句话说,React仍然将事件追加到元素上,而不是父元素上更高效的事件委托方法?

我也注意到这在Firefox Inspector中引发了最初的好奇心。

问这个问题的原因是,我正在开发一个应用程序,用户可以选择一千个元素将其拖动到屏幕上,因此最终事件代表将会出现。

回答

0

好吧,你也许已经想通你自己的一切,但我问自己同样的问题,我想我会在这里的情况下离开这个别人是好奇不仅使用反应,但也越来越想法约它是如何工作的

所以,我并不完全相信你的问题(特别是“追加事件元素”部分),但:

  • 阵营是所有的虚拟DOM。顾名思义,因此在之上构建了即DOM的“真实”环境。因此,的一切都发生在抽象层中,包括事件处理。
  • 活动出现在他们的“自然”的环境中,所以DOM或本地(取决于风味反应您正在使用)

因此,首先需要把事件到虚拟DOM,计算在那里进行更改并将它们分派到虚拟DOM中组件的表示,然后将相关更改反馈回来以适当地反映在DOM中。

对虚拟DOM进行更改由顶级代表团实际完成。这意味着React 本身document级别监听所有事件。这也意味着在技术上,即使输入React专用代码之前,所有事件都会通过一个捕获+冒泡循环。我无法说出这意味着性能方面的含义,因为您会“失去”与第一次DOM遍历相关的时间,但另一方面,您将在虚拟DOM中执行所有更改,这比做它更快在真正的DOM ...

最后,SyntheticEvent确实是一个包装,其目的是减少跨浏览器兼容性问题。它还引入了池化,通过减少垃圾收集时间,使池子更快。此外,由于一个本地事件可能会生成多个SyntheticEvent,因此它在技术上可以让您轻松创建新的事件(例如,如果您接收本机touchStart,然后连续接收本机touchEnd,则可能会发出该事件)。

我写了一个帖子,详细信息here。它远非完美,它们可能有些不准确,但它也许可以给你一些关于这个话题的更多信息。