javascript - 如何在 Next.js 中使用 stopPropagation()?

标签 javascript reactjs next.js

我正在尝试使用 stopPropagation,因此在单击任何其他元素后,我的下拉菜单将关闭。
当我尝试使用 stopPropagation 和更新 bool 状态时,按钮会重新渲染页面(将状态重置为“false”),而不是将状态更新为 true,无论如何它都会停留在“true”上。
我写了一个例子的代码:

import { useEffect, useState } from "react";

export default function IndexPage() {
  const [state, setState] = useState(false);

  useEffect(() => {
    document.body.addEventListener("click", () => {
      setState(false);
    });
  });

  const onButtonClick = (e) => {
    e.stopPropagation();
    setState(!state);
  };

  console.log(state);

  return (
    <div>
      <button onClick={onButtonClick}>Click</button>

      <h1>{state ? "true" : "false"}</h1>
    </div>
  );
}

这个问题好像出现了仅限 使用 Next.js
我用 React 应用程序编写了相同的代码,没有问题。
Next.js 代码框 link
React 代码框 link
编辑:
当你 fork Next.js 沙箱项目时,一切正常。 (但它并没有解决我原始代码的问题)。
任何人都知道为什么会这样?

最佳答案

这是一个奇怪的问题。在代码框容器中,状态被保留以进行超时编辑,并且不会导致任何重新渲染,因此可能是您的 e.stopPropagation添加到事件处理程序时没有触发重新渲染,因此按钮的旧处理程序仍然附加,这意味着当您单击按钮时主体上的事件监听器将继续触发,因为我们的处理程序从未更新为因子在 e.stopPropagation .
当我 fork 你的 Next.js 设置时,一切正常。因为它现在不是增量变化。该容器为我重建,不保留任何过去的状态,因此没有陈旧的事件处理程序或任何东西。
测试两种设置之间差异的最佳方法是查看控制台是否在您删除 e.stopPropagation 时记录任何值。两者的线。你会看到 Next.js 没有,但 React 有。这意味着即使保留的 React 的状态仍然触发了渲染,等等新的渲染,被创建的事件处理程序知道:-

Hey, I don't have e.stopPropagation anymore so my event will bubble up


更新 - 对于 Next.js 容器,似乎每次更改后都需要点击 Save 才能重新渲染。不要像 React 容器那样单独依赖编辑。

关于javascript - 如何在 Next.js 中使用 stopPropagation()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66229908/

相关文章:

javascript - 在新窗口中打开 HTML 链接

html - 找不到所需的文件。名称 : index. html

next.js - 在 Next.js 中配置 postcss 模块加载器来转换 kebab case 类

node.js - 为什么 cookie 没有通过 Next.js 中的 getServerSideProps 发送到服务器?

android - react-native gradle config 和 react-native-firebase 最新版本不匹配

reactjs - 在heroku中部署下一个js

javascript - HTML body 标签上的 Parallax.js

javascript - promise 一次性解决

javascript - AngularJS - 为所有应用程序环境动态设置配置参数

javascript - 我可以在依赖数组 React JS 中使用 AND (&&) OR (||) 运算符吗