React event.stopPropagation() 在 element.addEventListener 之后不起作用

React event.stopPropagation() doesn't work after element.addEventListener

提问人:Michal 提问时间:11/2/2023 更新时间:11/2/2023 访问量:25

问:

我有一个带有按钮的 div 容器。容器和按钮都有侦听器。但是,按钮的侦听器会停止传播事件。所以:onMouseDown

  • 当我单击容器时,“MouseDown”事件被记录到控制台中,
  • 当我单击按钮时,不会记录任何内容,因为按钮会停止事件冒泡。

目前为止,一切都好。但是,当我将侦听器添加到容器中时,即使我单击按钮也会调用它。所以按钮的 stopProgapagation() 不会阻止这个侦听器的执行。为什么?我该如何解决这个问题?这是一个完整的演示。mousedownaddEventListener

export const App = () => {
  const divRef = useRef()

  useEffect(() => {
    // Shouldn't be executed when I click on the button, but it is.
    divRef.current.addEventListener("mousedown", () => console.log("NewMouseDown"))   
  }, [])

  return (
    <div onMouseDown={() => console.log("MouseDown")} ref={divRef}>
      <button onMouseDown={e => e.stopPropagation()}>Stop propagation</button>
    </div>
  );
}
JavaScript ReactJS 事件 停止传播

评论

0赞 Thomas 11/2/2023
反应事件和本机事件是不同的机制。不使用 reacts 事件侦听器的原因是什么?正如你提到的,它在那里工作。为什么需要解决 react?
0赞 Michal 11/2/2023
@Thomas我使用 dragselect.com 库来拖动和选择项目,则该库使用 addEventListener。当我单击其中的按钮时,我不需要选择项目。
0赞 Thomas 11/2/2023
在这种情况下,我会建议类似 OR MAY 之类的东西,而不是将 react 和本机事件混合在一起。divRef.current.addEventListener("mousedown", (e) => { if (e.currentTarget !== e.target) console.log("NewMouseDown"); })if (!e.currentTarget.contains(e.target.closest("button"))) ...

答: 暂无答案