由于严格模式,我的 React 组件渲染了两次

Mar*_*nna 18 reactjs react-dom

我的 React 组件渲染了两次。所以,我决定逐行调试,问题就在这里

 if ( workInProgress.mode & StrictMode) {
        instance.render();
      }
Run Code Online (Sandbox Code Playgroud)

React-dom.development.js

是因为严格模式吗?我可以禁用它吗?什么是严格模式?我需要吗?

小智 42

是的,您必须删除严格模式,因为

严格模式无法自动为您检测副作用,但它可以通过使副作用更具确定性来帮助您发现它们。这是通过有意地双重调用以下函数来完成的:类组件 constructor 、 render 和 shouldComponentUpdate 方法。

来源:React 文档:严格模式

  • 我想补充一点,如果您保持打开状态,它将帮助您更早地发现错误,从而帮助您编写更具弹性的组件。所以并不是你需要它,但非常建议你使用它。请注意,双重渲染仅发生在开发中,不会发生在生产中。 (10认同)
  • 只需删除包裹应用程序的“<React.StrictMode>”就可以了。 (4认同)
  • 作为最后的解决方案,应该删除“StrictMode”。有关更详细的答案,请参阅 /sf/ask/5056672281/。 (2认同)

ran*_*gfu 41

StrictMode 渲染组件两次(在开发上而不是生产上)以检测您的代码中的任何问题并警告您(这可能非常有用)。

如果您在应用程序中启用了 StrictMode 但不记得启用它,可能是因为您最初使用 create-react-app 或类似方法创建应用程序,默认情况下会自动启用 StrictMode。

例如,您可能会发现您的 {app} 被包裹<React.StrictMode>在您的 index.js 中:

  ReactDOM.render(
     <React.StrictMode>
       {app}
     </React.StrictMode>,
    document.getElementById('root')
  );
Run Code Online (Sandbox Code Playgroud)

如果是这样,您可以通过删除<React.StrictMode>标记来禁用 StrictMode :

  ReactDOM.render(
    {app}
    document.getElementById('root')
  );
Run Code Online (Sandbox Code Playgroud)

  • [文档](https://reactjs.org/docs/strict-mode.html#detecting-unexpected-side-effects) 引用了开发模式下的故意“双重调用”:“严格模式无法自动检测副作用对你来说,但它可以通过使它们更具确定性来帮助你发现它们。这是通过有意双重调用以下函数来完成的” (22认同)
  • 对于 Next.js 开发者,您可以通过在 next.config.js 文件中设置“reactStrictMode: false”来禁用它。 (20认同)
  • 作为最后的解决方案,应该删除“StrictMode”。有关更详细的答案,请参阅 /sf/ask/5056672281/。 (8认同)
  • 以下是 React 文档的相关部分:https://react.dev/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development (4认同)
  • 应该是答案。这一点没有在任何地方突出显示。您可以分享一些来自 React 文档的参考链接吗? (2认同)

小智 35

对于像我这样的 Next.js 用户,默认情况下也会启用严格模式并导致此问题。

您可以通过这种方式禁用它

// next.config.js
module.exports = {
  reactStrictMode: false,
}
Run Code Online (Sandbox Code Playgroud)


小智 14

在具有StrictMode的 React 应用程序中:

  • 如果您看到这样的双控制台日志: 双控制台日志图像

  • 如果您知道 StrictMode 可以帮助您以某种方式优化您的应用程序

  • 而且您不想完全禁用 StrictMode

然后:

React 开发者工具Chrome 扩展提供了在严格模式下第二次渲染期间隐藏日志的选项。为了实现这一点:

  • 安装扩展。
  • 在 Chrome 开发者工具窗口中,将创建一个名为“组件”的新选项卡。点击它。 组件选项卡图像
  • 然后单击组件选项卡内的齿轮图标。 组件齿轮图标图像
  • 然后选择“调试”选项卡,并选中“在严格模式下第二次渲染期间隐藏日志”选项。 调试选项卡图像

您将不会再在控制台中看到双日志。 无双控制台日志图像

  • 不幸的是我还是看到了。重新打开选项卡后也是如此。 (4认同)