React: Unerwarteter Funktionskomponentenaufruf mit useState

Erstellt am 20. Dez. 2019  Â·  3Kommentare  Â·  Quelle: facebook/react

Möchten Sie eine Funktion anfordern oder einen Fehler melden?

Frage

Wie ist das aktuelle Verhalten?

import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";

import "./styles.css";

function Child() {
  console.log("Child render");
  return null;
}

function App() {
  const [count, setCount] = useState(0);

  console.log("Render");

  useEffect(() => {
    console.log("count changed", count);
  }, [count]);

  return (
    <div>
      <h2>UseState</h2>
      <p>clicked: {count}</p>
      <button
        onClick={() => {
          setCount(count + 1);
        }}
      >
        +1
      </button>
      <button
        onClick={() => {
          setCount(count);
        }}
      >
        +0
      </button>
      <Child />
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

In diesem ZĂ€hlbeispiel gibt es zwei SchaltflĂ€chen. Wenn Sie auf einen klicken, zĂ€hlt die ZĂ€hlung +1, bei einer anderen Ă€ndert sich die ZĂ€hlung nicht. Wenn Sie zuerst auf die SchaltflĂ€che Keine Änderung klicken, wird "Rendern" nicht protokolliert. Wenn Sie jedoch zuerst auf die SchaltflĂ€che +1 klicken und dann auf anthor klicken, wird "Render" zweimal angezeigt, aber ""Child render" wird nur einmal angezeigt.

Ich habe die ErklÀrung im Dokument gefunden.

Wenn Sie einen State Hook auf denselben Wert wie den aktuellen Status aktualisieren, wird React aussteigen, ohne die untergeordneten Elemente zu rendern oder Effekte auszulösen. (React verwendet den Object.is-Vergleichsalgorithmus.)

Verspricht React nur, dass die Kinderkomponente in dieser Situation nicht gerendert wird? Die aktuelle Komponente kann noch gerendert werden?

Dies ist ein Beispiel in der Sandbox.

https://codesandbox.io/s/long-firefly-nz5px?fontsize=14&hidenavigation=1&theme=dark

Welche React-Versionen und welche Browser/Betriebssysteme sind von diesem Problem betroffen?

"reagieren": "^16.12.0",
"react-dom": "^16.12.0",

Question

Hilfreichster Kommentar

Dieses Problem sieht nicht nach einem "Fehler" aus, sondern eher nach einer KlÀrungsfrage? :LÀcheln:

Der nÀchste Absatz unter dem Abschnitt der Dokumente, auf die Sie verwiesen haben, sagt Folgendes:

Beachten Sie, dass React diese spezifische Komponente möglicherweise noch einmal rendern muss, bevor Sie aussteigen können. Das sollte kein Problem sein, da React nicht unnötig „tiefer“ in den Baum eindringt.

Reagieren Sie frĂŒhzeitig aus, wenn es weiß, dass es sicher ist. In einigen FĂ€llen muss es etwas mehr Arbeit leisten, um sicherzustellen, dass die Rettung sicher ist.

Die GrĂŒnde dafĂŒr können nicht erklĂ€rt werden, ohne ziemlich tief in die aktuellen Implementierungsdetails einzugehen – was wahrscheinlich nicht so nĂŒtzlich wĂ€re und sie werden sich wahrscheinlich in einer kommenden Version Ă€ndern, wĂ€hrend wir weiter an neuen APIs wie dem gleichzeitigen Modus arbeiten und Spannung.

Die gute Nachricht ist, wie in den Dokumenten erwÀhnt, der zusÀtzliche Arbeitsaufwand von React sollte in beiden FÀllen gering sein!

Alle 3 Kommentare

Dieses Problem sieht nicht nach einem "Fehler" aus, sondern eher nach einer KlÀrungsfrage? :LÀcheln:

Der nÀchste Absatz unter dem Abschnitt der Dokumente, auf die Sie verwiesen haben, sagt Folgendes:

Beachten Sie, dass React diese spezifische Komponente möglicherweise noch einmal rendern muss, bevor Sie aussteigen können. Das sollte kein Problem sein, da React nicht unnötig „tiefer“ in den Baum eindringt.

Reagieren Sie frĂŒhzeitig aus, wenn es weiß, dass es sicher ist. In einigen FĂ€llen muss es etwas mehr Arbeit leisten, um sicherzustellen, dass die Rettung sicher ist.

Die GrĂŒnde dafĂŒr können nicht erklĂ€rt werden, ohne ziemlich tief in die aktuellen Implementierungsdetails einzugehen – was wahrscheinlich nicht so nĂŒtzlich wĂ€re und sie werden sich wahrscheinlich in einer kommenden Version Ă€ndern, wĂ€hrend wir weiter an neuen APIs wie dem gleichzeitigen Modus arbeiten und Spannung.

Die gute Nachricht ist, wie in den Dokumenten erwÀhnt, der zusÀtzliche Arbeitsaufwand von React sollte in beiden FÀllen gering sein!

Dieses Problem sieht nicht nach einem "Fehler" aus, sondern eher nach einer KlĂ€rungsfrage? 😄

Der nÀchste Absatz unter dem Abschnitt der Dokumente, auf die Sie verwiesen haben, sagt Folgendes:

Beachten Sie, dass React diese spezifische Komponente möglicherweise noch einmal rendern muss, bevor Sie aussteigen können. Das sollte kein Problem sein, da React nicht unnötig „tiefer“ in den Baum eindringt.

Reagieren Sie frĂŒhzeitig aus, wenn es weiß, dass es sicher ist. In einigen FĂ€llen muss es etwas mehr Arbeit leisten, um sicherzustellen, dass die Rettung sicher ist.

Die GrĂŒnde dafĂŒr können nicht erklĂ€rt werden, ohne ziemlich tief in die aktuellen Implementierungsdetails einzugehen - was wahrscheinlich nicht so nĂŒtzlich wĂ€re _und_ sie werden sich wahrscheinlich in einer kommenden Version Ă€ndern, wenn wir weiter an neuen APIs wie dem gleichzeitigen Modus arbeiten und Spannung.

Die gute Nachricht ist, wie in den Dokumenten erwÀhnt, der zusÀtzliche Arbeitsaufwand von React sollte in beiden FÀllen gering sein!

Thx, was fĂŒr ein sorgloser Mann! 😁

Kein Problem! 😄

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen