Möchten Sie eine Funktion anfordern oder einen Fehler melden?
Frage zum API-Design zu useEffect
Wie ist das aktuelle Verhalten?
Derzeit läuft useEffect
bei jedem Rendering. Dieses Standardverhalten kann in Situationen wie dem Umgang mit HTTP-Anfragen gefährlich sein, wenn Sie vergessen, das zweite Argument zu übergeben. Dies scheint ein häufiger Fehler zu sein, insbesondere für Neulinge wie mich. Ich kann mir nicht viele (irgendwelche) Muster vorstellen, bei denen Sie useEffect
bei jedem Rendering ausführen möchten. Was war der Grund dafür, nicht einmal nicht ausgeführt zu werden?
Durch das API-Design:
useEffect(
() => {
// do something
},
[/* dependency list */]
);
useEffect
wird nur ausgeführt, wenn sich die Abhängigkeitsliste ändert, und ein leeres Array []
bedeutet keine Abhängigkeit (dh wird nur einmal ausgeführt). Es erscheint mir logisch, dass eine undefinierte Abhängigkeitsliste bedeutet, dass die Funktion useEffect
jedem Rendering von
Ich kann mir nicht viele (irgendwelche) Muster vorstellen, bei denen Sie
useEffect
bei jedem Rendering ausführen möchten. Was war der Grund dafür, nicht einmal nicht ausgeführt zu werden?
Angenommen, Sie kennen React noch nicht und möchten immer dann etwas tun, wenn sich eine useState
Variable ändert (zB den neuen Wert an einen Server POST).
useEffect
Rückruf nicht auslösen.Ich denke, die Abhängigkeitsliste soll eher eine Leistungsoptimierung / Hilfe zur Codevereinfachung sein.
Mit der aktuellen API können Sie zwischen den folgenden Verhaltensweisen entscheiden:
componentDidMount
+ componentDidUpdate
.componentDidMount
.this.props
und prevProps
in der Klassenkomponenten-API implementieren konnten (und oft taten).Das von Ihnen beschriebene "Standardverhalten" (wenn Sie die Abhängigkeiten nicht explizit angeben) ist oft das sicherste, da es verhindert, dass veraltete Werte in Closures verwendet werden .
In Zukunft werden wir hoffentlich einen Compilertyp bereitstellen, der dabei hilft, vieles davon zu automatisieren. In der Zwischenzeit stellen wir ein offizielles ESLint-Plug-In zur Verfügung, um es ein wenig einfacher zu machen. 😄