Lade entfernte Daten mit fetch innerhalb eines Effekts und modelliere die Lade- und Fehlerzustände sauber.
Diese Lektion in Kodokon öffnenEine Netzwerkanfrage braucht Zeit und kann fehlschlagen: Deine Oberfläche muss diese Realitäten widerspiegeln. Die professionelle Konvention ist, drei verschiedene State-Teile zu verfolgen: die empfangenen Daten, einen loading-Boolean und einen möglichen Fehler. Die Anfrage kommt in ein useEffect, weil das Kontaktieren eines Servers ein Seiteneffekt ist.
const [users, setUsers] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
fetch("https://api.example.com/users")
.then((res) => {
if (!res.ok) throw new Error("HTTP " + res.status);
return res.json();
})
.then((data) => setUsers(data))
.catch((err) => setError(err.message))
.finally(() => setLoading(false));
}, []);Behandle die Fälle im Rendering der Reihe nach: zuerst das Laden, dann den Fehler und schließlich die Daten. Diese frühen Returns halten den Code lesbar und garantieren, dass der Nutzer immer etwas Kohärentes sieht: eine Warteanzeige, eine Fehlermeldung oder die erwartete Liste.
if (loading) return <p>Loading…</p>;
if (error) return <p>Error: {error}</p>;
return (
<ul>
{users.map((user) => (
<li key={user.id}>{user.name}</li>
))}
</ul>
);Eine letzte Falle: Wenn sich eine Abhängigkeit ändert (zum Beispiel eine userId), geht eine neue Anfrage raus, während die alte vielleicht noch unterwegs ist. Wenn die alte zuletzt antwortet, würde sie die frischen Daten überschreiben. Die klassische Gegenmaßnahme: ein ignore-Flag, das von der Cleanup-Funktion auf true gesetzt wird, um veraltete Antworten wegzuwerfen.
useEffect(() => {
let ignore = false;
setLoading(true);
fetch("/api/users/" + userId)
.then((res) => res.json())
.then((data) => {
if (!ignore) setUser(data);
})
.finally(() => {
if (!ignore) setLoading(false);
});
return () => {
ignore = true;
};
}, [userId]);catch wird nie ausgelöst. Warum?ignore-Flag da, das im Cleanup des Effekts auf true gesetzt wird?