Meine React-Komponente wird aufgrund des Strict Mode zweimal gerendert

Lesezeit: 4 Minuten

Benutzeravatar von Joanna heiraten
Johanna heiraten

Meine React-Komponente wird zweimal gerendert. Also habe ich beschlossen, eine zeilenweise Fehlersuche durchzuführen, und das Problem ist hier:

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

React-dom.development.js

Liegt es am strikten Modus? Kann ich es deaktivieren? Was ist der strikte Modus? Brauche ich es?

  • StrictMode sollte als letzte Lösung entfernt werden. Eine ausführlichere Antwort finden Sie unter stackoverflow.com/questions/72238175/….

    – yousoumar

    28. Oktober 2022 um 13:00 Uhr

StrictMode rendert Komponenten zweimal (in der Entwicklung, aber nicht in der Produktion), um Probleme mit Ihrem Code zu erkennen und Sie davor zu warnen (was sehr nützlich sein kann).

Wenn Sie StrictMode in Ihrer App aktiviert haben, sich aber nicht daran erinnern, es aktiviert zu haben, kann dies daran liegen, dass Sie create-react-app oder ähnliches verwendet haben, um Ihre App ursprünglich zu erstellen, wodurch StrictMode standardmäßig automatisch aktiviert wird.

Beispielsweise könnten Sie feststellen, dass Ihre {app} von umschlossen ist <React.StrictMode> in deiner index.js:

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

Wenn dies der Fall ist, können Sie StrictMode deaktivieren, indem Sie die entfernen <React.StrictMode> Schild:

  ReactDOM.render(
    {app}
    document.getElementById('root')
  );

  • Der Dokumente Verweisen Sie auf das absichtliche „doppelte Aufrufen“ im Dev-Modus: „Der strenge Modus kann Nebeneffekte nicht automatisch für Sie erkennen, aber er kann Ihnen helfen, sie zu erkennen, indem er sie ein wenig deterministischer macht. Dies geschieht durch absichtliches doppeltes Aufrufen der folgenden Funktionen “

    – Nick Mitchell

    21. Oktober 2021 um 3:09 Uhr

  • Hatte einen Ereignis-Listener zweimal aufgerufen und fragte sich warum. Scheint der strenge Modus die Ursache gewesen zu sein. Danke!

    – Jakub Kvba

    21. Juli 2022 um 13:13 Uhr

  • @JakubKvba nein, das hat nichts mit Event-Handlern zu tun, nur mit Effekten

    – Himmelsjunge

    2. August 2022 um 8:20 Uhr

  • Für Next.js-Entwickler können Sie es deaktivieren, indem Sie „reactStrictMode: false“ in der Datei next.config.js festlegen.

    – Mahmud

    19. September 2022 um 21:13 Uhr

  • StrictMode sollte als letzte Lösung entfernt werden. Eine ausführlichere Antwort finden Sie unter stackoverflow.com/questions/72238175/….

    – yousoumar

    28. Oktober 2022 um 12:59 Uhr

Benutzeravatar von Haris Shafiq
Haris Schafik

Ja, Sie müssen den Strict Mode als entfernen

Strikter Modus kippen Nebenwirkungen automatisch für Sie erkennen, aber es kann Ihnen helfen, sie zu erkennen, indem es sie ein wenig deterministischer macht. Dies geschieht durch absichtliches doppeltes Aufrufen der folgenden Funktionen: Klassenkomponentenkonstruktor , render und shouldComponentUpdate Methoden.

Quelle: React Docs: Strikter Modus

  • Wenn ich hinzufügen darf, wenn Sie es eingeschaltet lassen, wird es Ihnen helfen, widerstandsfähigere Komponenten zu schreiben, indem es Ihnen hilft, Fehler früher zu erkennen. Es ist also nicht so, dass Sie es brauchen, aber es wird sehr empfohlen, dass Sie es verwenden. Beachten Sie, dass das doppelte Rendern nur in der Entwicklung stattfindet, nicht in der Produktion.

    – Jackief

    16. April 2020 um 15:48 Uhr


  • @Jackyef Wie entferne ich es? oder meine App in den Produktionsmodus versetzen? <React></React> gibt einen Fehler..

    – Johanna heiraten

    16. April 2020 um 15:57 Uhr


  • Entfernen Sie einfach die <React.StrictMode> das umschließt Ihre App und es wird gut.

    – Jackief

    16. April 2020 um 16:04 Uhr

  • du hast das abschließende Komma nach {app} ausgelassen wie diese {app},

    – Kimilhee

    21. Dezember 2021 um 3:30 Uhr

  • StrictMode sollte als letzte Lösung entfernt werden. Eine ausführlichere Antwort finden Sie unter stackoverflow.com/questions/72238175/….

    – yousoumar

    28. Oktober 2022 um 13:00 Uhr

Benutzeravatar von sgoran
Sgoran

Für Next.js-Benutzer hier wie mich selbst ist der strikte Modus ebenfalls standardmäßig aktiviert und verursacht dieses Problem.

Sie können es auf diese Weise deaktivieren

// next.config.js
module.exports = {
  reactStrictMode: false,
}

  • Sie haben Recht, es ist standardmäßig wahr, und das Festlegen von „reactStrictMode“ auf „false“ würde das Problem lösen, aber wir sollten auch bedenken, wie nextjs docs empfiehlt, dass es auch von Vorteil sein kann, „reactStrictMode“ auf „true“ zu halten: nextjs.org/docs/api-reference/next.config.js/react-strict-mode

    – Elyas Karimi

    14. September 2022 um 12:31 Uhr

  • StrictMode gibt es aus gutem Grund. Deaktivieren ist das letzte, was zu tun ist. Eine ausführlichere Antwort finden Sie unter stackoverflow.com/a/72238236/15288641

    – yousoumar

    16. Dezember 2022 um 9:05 Uhr

Es scheint, dass die Komponente zweimal gerendert wird, aber die erste gerenderte Komponente ist nicht unmontiert? Zumindest ist das das Verhalten, das ich bei React 17 sehe, könnte natürlich ein Fehler in meinem Code sein

In einer React-App mit Strikter Modus:

  • Wenn Sie zwei Konsolenprotokolle wie diese sehen:
    Protokollabbild der Doppelkonsole

  • Und wenn Sie wissen, dass StrictMode Ihnen hilft, Ihre App auf irgendeine Weise zu optimieren

  • Und Sie möchten StrictMode nicht vollständig deaktivieren

Dann:

Der Chrome-Erweiterung für Entwicklertools reagieren bietet eine Möglichkeit dazu Protokolle während des zweiten Renderns im strengen Modus ausblenden. Um das zu ermöglichen:

  • Installieren Sie die Erweiterung.
  • In Ihrem Chrome Developer Tools-Fenster wird eine neue Registerkarte mit dem Namen Komponenten geschaffen. Klick es an.
    Bild der Registerkarte
  • Klicken Sie dann auf das Zahnradsymbol auf der Registerkarte Komponenten.
    Komponenten-Zahnrad-Symbolbild
  • Wählen Sie dann die aus Debuggen Registerkarte und aktivieren Sie die Option zu Protokolle während des zweiten Renderns im strengen Modus ausblenden.
    Debugging-Tab-Bild

Sie werden die doppelten Protokolle in der Konsole nicht mehr sehen.
Kein Dual-Console-Logs-Image

Wenn Sie nextjs verwenden und den strikten Modus deaktivieren möchten, gehen Sie zu your next.config.js Datei und setze „reactStrictMode“ auf „false“.

module.exports = {
reactStrictMode: false,
};

aber der strikte Modus wird für die Entwicklung empfohlen, sobald Sie überprüfen, ob die doppelte Einbindung durch den strengen Modus verursacht wird, ist es vorzuziehen, ihn zu aktivieren

1442090cookie-checkMeine React-Komponente wird aufgrund des Strict Mode zweimal gerendert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy