在 DOM 树中间停止 React "onClick" 事件
Stop React "onClick" event in the middle of DOM tree
图像结构:
<Item onClick={goToPage}>
<p>Example Title</p>
<div> // addition
<Menu>
<button onClick={toggleMenuItems}/>
<MenuItems />
</Menu>
</div>
</Item>
菜单组件本身有一个事件处理逻辑:它监听 window 上的点击事件并关闭菜单项。这样做是因为一个页面可以有多个菜单,打开一个应该关闭所有其他菜单。
整个父项组件也必须是可点击的。 Item 组件中的 div(标记为 "addition")必须是独立的 - 因此它可以是菜单,但也可以是其他任何东西 - 只是文本,例如
这里的问题是,尽管 Item 的 onClick 也被触发,但点击 Menu 的按钮点击事件被冒泡到 Item 并沿着线向下。如果传播在菜单的 onClick 内停止 - 然后 Item 的 onClick 不再被触发,而且 window.onClick 也停止,并且其他菜单无法关闭。
有什么解决办法?我怎么能停止 onClick for Item 而不是其他任何东西?
使用此解决方案检测点击是在组件内部还是外部:
然后仅当在内部单击时才应用您的逻辑。
为了解决这个问题,我不得不在单击菜单按钮(或菜单组件内的任何其他区域)时停止冒泡,并使用捕获而不是在菜单内冒泡来完成 "close menu on window click outside of component"。
图像结构:
<Item onClick={goToPage}>
<p>Example Title</p>
<div> // addition
<Menu>
<button onClick={toggleMenuItems}/>
<MenuItems />
</Menu>
</div>
</Item>
菜单组件本身有一个事件处理逻辑:它监听 window 上的点击事件并关闭菜单项。这样做是因为一个页面可以有多个菜单,打开一个应该关闭所有其他菜单。
整个父项组件也必须是可点击的。 Item 组件中的 div(标记为 "addition")必须是独立的 - 因此它可以是菜单,但也可以是其他任何东西 - 只是文本,例如
这里的问题是,尽管 Item 的 onClick 也被触发,但点击 Menu 的按钮点击事件被冒泡到 Item 并沿着线向下。如果传播在菜单的 onClick 内停止 - 然后 Item 的 onClick 不再被触发,而且 window.onClick 也停止,并且其他菜单无法关闭。
有什么解决办法?我怎么能停止 onClick for Item 而不是其他任何东西?
使用此解决方案检测点击是在组件内部还是外部:
然后仅当在内部单击时才应用您的逻辑。
为了解决这个问题,我不得不在单击菜单按钮(或菜单组件内的任何其他区域)时停止冒泡,并使用捕获而不是在菜单内冒泡来完成 "close menu on window click outside of component"。