事件传播与 React 冒泡乱序

Posted

技术标签:

【中文标题】事件传播与 React 冒泡乱序【英文标题】:Event propagation with React bubbling out of order 【发布时间】:2017-12-26 00:58:12 【问题描述】:

鉴于以下代码,我希望在单击数字 3 时打印输出 3, 2, 1。实际打印输出为1, 3, 2

这是什么原因?

document.body.onclick = () => 
  console.log('1')


function Test() 
  return (
    <div onClick=() => console.log('2')>
      2
      <div onClick=() => console.log('3')>
        3
      </div>
    </div>
  )


ReactDOM.render(<Test/>, document.querySelector("#root"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<body>
1
<div id="root" />
</body>

【问题讨论】:

这很有趣。看起来 React 事件处理在浏览器事件循环之外工作。这可能与 React 使用 SyntheticEvents 有关 【参考方案1】:

任何原生事件处理程序都会在 React 事件处理程序之前触发。

这就是 React 处理事件的方式:

    它在顶层监听事件并将它们转换为合成事件 将它们放入池中以维持秩序 分派到 React 组件

正因为如此,React 生态系统内的秩序得以维持,但相对于其他生态系统而言却是乱序的。

如本视频所述:https://www.youtube.com/watch?v=dRo_egw7tBc

并在文档中模糊描述:https://facebook.github.io/react/docs/events.html#event-pooling

【讨论】:

所以基本上document.body.onclick = e =&gt; e.stopPropagation(); 是禁用页面上每个 React-event 的一种非常有效的方法? React 可能会在调用该函数之前处理该事件。这可以在事件传播的捕获阶段完成。 好吧,当我把它放在你的 sn-p 中时,它阻止了他们。我认为 React 对应该在捕获阶段运行的事件处理程序有单独的名称。

以上是关于事件传播与 React 冒泡乱序的主要内容,如果未能解决你的问题,请参考以下文章

事件冒泡和停止传播

事件流 ---- 事件冒泡与事件捕获

事件冒泡和传播

React 中阻止事件冒泡的问题

React 中阻止事件冒泡的问题

JavaScript事件捕获冒泡与捕获