javascript - React document.addEventListener 立即触发

标签 javascript reactjs addeventlistener

我搜索过这个问题。

它必须是传递函数引用。

document.addEventListener("click", () => {}, false)

但我所做的仍然是立即开火。

我是不是做错了什么?

测试代码如下

export default function App() {
  const start = () => {
    console.log("start");
  };
  const click1 = () => {
    document.addEventListener("click", start);
  };

  const click2 = () => {
    const element = document.getElementById("p");
    element.addEventListener("click", start);
  };

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>

      <button onClick={click1}>Click1</button>
      <hr />

      <p id="p">123</p>
      <button onClick={click2}>Click2</button>
    </div>
  );
}

// Click1 -  immediately, problem here

// Click2 - no immediately

https://codesandbox.io/s/reverent-grass-5fok7b?file=/src/App.js

我的期望

先点击,添加点击事件,记录任何内容。

单击第二个,记录'start'

实际输出

先点击,添加点击事件,记录start

最佳答案

您正在处理 SyntheticEvent使用您的 onClick 处理程序并在 document 级别添加 native 事件监听器。添加监听器将在事件冒泡到顶部之前完成,因此您还会看到它针对原始事件执行。

如果您不希望发生这种情况,请阻止事件冒泡

const click1 = (e) => {
  e.stopPropagation();
  document.addEventListener("click", start);
};

Edit great-flower-cc31dy


仅供引用,您还应该在组件卸载时删除 DOM 监听器

useEffect(() => () => document.removeEventListener("click", start), []);

关于javascript - React document.addEventListener 立即触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73604156/

相关文章:

javascript - 在决定如何将回调传递给 addEventListener 时,我应该考虑什么?

javascript - 为什么点击事件会触发两次?

javascript - 使用 css 只打印隐藏内容

javascript - Express.js - 如何使用 res.render 将警报从 Express 发送到客户端?不重发

javascript - 有人可以解释以下 javascript 代码片段吗? (小白)

reactjs - 如何使用 Jest 和 Enzyme 对 useEffect cleanUp 返回函数进行单元测试

javascript - 是什么使来自 react 状态的对象未定义但可在控制台中访问?

javascript - 在 JavaScript 中识别(日语)Unicode 数字。这可以做得更简单吗?

javascript - react-router 在提供带路径的 url 时忽略嵌套路由

javascript - 动态更改的列表无法按预期工作 - 需要纯 js