React verfügt über einen integrierten Hook namens useEffect. Hooks werden in Funktionskomponenten verwendet. Der Vergleich von Class-Komponenten mit useEffect sind die Methoden componentDidMount, componentDidUpdate und componentWillUnmount.
useEffect wird beim Rendern der Komponente ausgeführt, was möglicherweise öfter geschieht, als Sie denken. Ich habe das Gefühl, dass dies in den letzten Wochen ein Dutzend Mal aufgetaucht ist, daher scheint es einen kurzen Blogbeitrag wert zu sein.
import React, { useEffect } from 'react';
function App() {
useEffect(() => {
// Run! Like go get some data from an API.
});
return (
<div>
{/* Do something with data. */}
</div>
);
}
In einem völlig isolierten Beispiel wie diesem wird useEffect wahrscheinlich nur einmal ausgeführt. Aber in einer komplexeren App mit herumfliegenden Props und Ähnlichem ist dies sicherlich nicht garantiert. Das Problem dabei ist, dass Sie, wenn Sie etwas wie das Abrufen von Daten von einer API tun, am Ende doppelte Abrufe tätigen könnten, was ineffizient und unnötig ist.
Der Trick ist, dass useEffect einen zweiten Parameter nimmt.
Der zweite Parameter ist ein Array von Variablen, die die Komponente überprüft, um sicherzustellen, dass sie sich geändert haben, bevor erneut gerendert wird. Sie können hier beliebige Teile von Props und State einfügen, die Sie überprüfen möchten.
Oder lassen Sie es leer
import React, { useEffect } from 'react';
function App() {
useEffect(() => {
// Run! Like go get some data from an API.
}, []);
return (
<div>
{/* Do something with data. */}
</div>
);
}
Dies stellt sicher, dass useEffect nur einmal ausgeführt wird.
Hinweis aus der Dokumentation
Wenn Sie diese Optimierung verwenden, stellen Sie sicher, dass das Array alle Werte aus dem Komponentenbereich (wie Props und State) enthält, die sich im Laufe der Zeit ändern und die vom Effekt verwendet werden. Andernfalls greift Ihr Code auf veraltete Werte aus früheren Renderings zu.
Oder verwenden Sie einfach eslint-plugin-react-hooks, um sicherzustellen, dass Sie Ihre Hooks und deren Verwendung beherrschen!
https://www.npmjs.com/package/eslint-plugin-react-hooks
Das sieht nützlich aus, aber ich glaube nicht, dass es das Problem löst.
Das ist absolut richtig, kann aber gefährlich sein, wenn es missverstanden und falsch/übermäßig verwendet wird.
Es gibt eine erstaunliche (aber lange) Erklärung aller Ein- und Ausgänge von useEffect von Dan Abramov, die es für mich wirklich kristallklar gemacht hat.
https://overreacted.io/a-complete-guide-to-useeffect/
Zwei Dinge: React rendert von Natur aus, wenn sich Props oder State ändern. Da
useEffectjedes Mal ausgeführt wird, geraten Sie zwangsläufig in eine Endlosschleife, wenn Sie den State oder die Props darin ändern. UmcomponentDidMountzu erhalten, führen Sie Code aus und übergeben dann ein leeres Array als zweiten Parameter anuseEffect. UmcomponentWillUnmount*nur einmal* auszuführen, geben Sie eine Cleanup-Funktion vonuseEffectzurück und übergeben ebenfalls ein leeres Array als zweiten Parameter.Ich konvertiere einige meiner Codebasen in Hooks und es wird ziemlich faszinierend. Eine Sache mit
useEffectist, dass es leicht ist, es zu vermasseln – und ich habe es bereits ziemlich oft vermasselt. Aber abgesehen davon löst es viele Probleme und das als Bonus, und das auf einfache Weise.Das Problem mit diesem Ansatz ist, dass er eine Warnung ausgibt, wenn Sie von Props oder State abhängen (aufgrund der ESlint-Regel
react-hooks/exhaustive-deps).Definieren Sie besser einen benutzerdefinierten Hook in Ihrer Codebasis
Und importieren Sie ihn und verwenden Sie ihn.