没有 DOM 嵌套的 React 事件冒泡

React event bubbling without DOM nesting

对于上下文,<NavTreeItem> 是 material-ui <TreeItem><OpenDialogButton> 是 material-ui <Button>.

我有一个这样的组件(简化版):

function pushLink() {
  // ...
}

function openDialog(event) {
  event.stopPropagation();
  // ...
}

<NavTreeItem onClick={pushLink}>
  <OpenDialogButton onClick={openDialog} />
  ...
  {dialogIsOpen && <Dialog />}
</NavTreeItem>

假设 openDialog()pushLink() 都没有被执行。如果我单击 <OpenDialogButton> 打开对话框,它会运行 openDialog() 执行 event.stopPropagation() 这样事件就不会冒泡到树项并执行 pushLink() - 就像预期的。当 <Dialog> 提交给 DOM 时,它 而不是 嵌套在 <NavTreeItem> 中 - 正如预期的那样。到目前为止,只执行了openDialog()

但是当我单击 <Dialog> 元素(或其背景)时,它会执行 pushLink() - 不良行为。看起来好像点击事件冒泡到 <NavTreeItem> 元素 - 即使 <Dialog> 元素没有嵌套在 DOM 中。为什么会这样?我该怎么做才能避免这种情况发生?

这是我找到的解决方案:

<NavTreeItem onClick={pushLink}>
  <OpenDialogButton onClick={openDialog} />
  ...
  <div onClick={(event) => event.stopPropagation()}>
    {dialogIsOpen && <Dialog />}
  </div>
</NavTreeItem>