Der Hook useEffect React führt bei jeder Änderung die übergebene Funktion aus. Dies kann so optimiert werden, dass es nur aufgerufen wird, wenn sich die gewünschten Eigenschaften ändern.
Was ist, wenn ich eine Initialisierungsfunktion von componentDidMount
aufrufen und bei Änderungen nicht erneut aufrufen möchte ? Angenommen, ich möchte eine Entität laden, aber die Ladefunktion benötigt keine Daten von der Komponente. Wie können wir das mit dem useEffect
Haken machen?
class MyComponent extends React.PureComponent {
componentDidMount() {
loadDataOnlyOnce();
}
render() { ... }
}
Mit Haken könnte dies so aussehen:
function MyComponent() {
useEffect(() => {
loadDataOnlyOnce(); // this will fire on every change :(
}, [...???]);
return (...);
}
javascript
reactjs
react-hooks
Dávid Molnár
quelle
quelle
TL; DR
useEffect(yourCallback, [])
- löst den Rückruf erst nach dem ersten Rendern aus.Ausführliche Erklärung
useEffect
Wird standardmäßig nach jedem Rendern der Komponente ausgeführt (wodurch ein Effekt verursacht wird).Wenn
useEffect
Sie Ihre Komponente platzieren, teilen Sie React mit, dass Sie den Rückruf als Effekt ausführen möchten. React führt den Effekt nach dem Rendern und nach dem Ausführen der DOM-Updates aus.Wenn Sie nur einen Rückruf übergeben, wird der Rückruf nach jedem Rendern ausgeführt.
Wenn Sie ein zweites Argument (Array) übergeben, führt React den Rückruf nach dem ersten Rendern und jedes Mal aus, wenn eines der Elemente im Array geändert wird. Zum Beispiel beim Platzieren
useEffect(() => console.log('hello'), [someVar, someOtherVar])
- Der Rückruf wird nach dem ersten Rendern und nach jedem Rendern ausgeführt, das vonsomeVar
odersomeOtherVar
geändert wurde.Wenn Sie dem zweiten Argument ein leeres Array übergeben, vergleicht React nach jedem Rendern des Arrays und stellt fest, dass nichts geändert wurde. Daher ruft der Rückruf erst nach dem ersten Rendern auf.
quelle
useMountEffect-Hook
Das Ausführen einer Funktion nur einmal nach dem Mounten von Komponenten ist ein so häufiges Muster, dass ein eigener Hook gerechtfertigt ist, der Implementierungsdetails verbirgt.
Verwenden Sie es in jeder Funktionskomponente.
Informationen zum useMountEffect-Hook
Bei Verwendung
useEffect
mit einem zweiten Array-Argument führt React den Rückruf nach dem Mounten (anfängliches Rendern) und nach dem Ändern der Werte im Array aus. Da wir ein leeres Array übergeben, wird es erst nach dem Mounten ausgeführt.quelle
useMount
wenn Ihre Effektfunktion etwas von Requisiten benötigt, aber nie wieder ausgeführt werden muss, selbst wenn sich dieser Wert ohne Linterwarnung ändert:useEffect(()=>console.log(props.val),[])
Fehlende Abhängigkeitswarnung, aberuseMount(()=>console.log(props.val))
keine Warnung, aber "funktioniert". Ich bin mir nicht sicher, ob es ein Problem mit dem gleichzeitigen Modus geben wird.Übergeben Sie ein leeres Array als zweites Argument an
useEffect
. Dies teilt React effektiv mit und zitiert die Dokumente :Hier ist ein Ausschnitt, den Sie ausführen können, um zu zeigen, dass es funktioniert:
quelle
Ich definiere gerne eine
mount
Funktion, sie betrügt EsLint auf die gleiche WeiseuseMount
und ich finde sie selbsterklärender.quelle
Der Trick ist, dass useEffect einen zweiten Parameter verwendet.
Der zweite Parameter ist ein Array von Variablen, die die Komponente überprüft, um sicherzustellen, dass sie geändert wurde, bevor sie erneut gerendert wird. Sie können hier alle Requisiten und Zustände einfügen, gegen die Sie prüfen möchten.
Oder nichts sagen:
Dadurch wird sichergestellt, dass useEffect nur einmal ausgeführt wird.
Anmerkung aus den Dokumenten:
Wenn Sie diese Optimierung verwenden, stellen Sie sicher, dass das Array alle Werte aus dem Komponentenbereich (z. B. Requisiten und Status) enthält, die sich im Laufe der Zeit ändern und vom Effekt verwendet werden. Andernfalls verweist Ihr Code auf veraltete Werte aus früheren Renderings.
quelle