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

IT技术 reactjs react-dom
2021-03-23 00:16:43

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

 if ( workInProgress.mode & StrictMode) {
        instance.render();
      }

React-dom.development.js

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

3个回答

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

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

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

  ReactDOM.render(
     <React.StrictMode>
       {app}
     </React.StrictMode>,
    document.getElementById('root')
  );

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

  ReactDOM.render(
    {app}
    document.getElementById('root')
  );
文档引用开发模式故意“双调用”:“严格模式无法自动检测你的副作用,但它可以帮助你通过使他们多了几分确定性发现他们这是通过故意双调用来完成。以下功能"
2021-05-26 00:16:43
@manjs 恐怕我是“艰难的”学会了这个,不确定是否有任何关于它的文档。
2021-06-02 00:16:43
应该是答案。这在任何地方都没有突出显示。你能分享一些来自 React 文档的参考链接吗?
2021-06-16 00:16:43

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

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

来源:React 文档:严格模式

如果我可以补充一点,如果您继续使用它,它将帮助您更早地发现错误,从而帮助您编写更具弹性的组件。所以它不像你需要它,但非常建议你使用它。请注意,双重渲染仅发生在开发中,不会发生在生产中。
2021-05-25 00:16:43
@Jackyef 如何删除它?或者,将我的应用程序置于生产模式? <React></React>给出一个错误..
2021-06-02 00:16:43
只需删除<React.StrictMode>包裹在您的应用程序上的那个就可以了。
2021-06-07 00:16:43
你错过了 {app} 之后的尾随逗号,比如这个 {app},
2021-06-14 00:16:43

似乎组件渲染了两次,但第一个渲染的组件没有卸载?至少这是我在 React 17 中看到的行为,当然可能是我代码中的一个错误

我认为这是你的错误。也许您的状态是一个嵌套对象。你应该完全解构它
2021-06-02 00:16:43