useSyncExternalStore
React an etwas anschließen, das außerhalb von React lebt
Der offizielle Weg, React an etwas anzuschließen, das außerhalb von React lebt – zum Beispiel „ist der Browser online?“.
Er ist vor allem für Bibliotheken gedacht. Trotzdem lohnt sich der Blick: Er erklärt, wie Zustand, Redux und ähnliche Werkzeuge heute an React andocken – und für Browser-Werte ist er die sauberste Lösung.
Es gibt Werte, die React nicht gehören: ob der Browser online ist, wie breit das Fenster ist, was in einem eigenen Datenspeicher steht. React erfährt von deren Änderungen nur, wenn ihm jemand Bescheid sagt. Genau das regelt dieser Hook.
const wert = useSyncExternalStore(
subscribe, // (aufwachen) => aufräumen – meldet Änderungen an React
getSnapshot, // () => aktueller Wert – im Client
getServerSnapshot // () => Wert beim SSR – optional, aber in Next.js wichtig
); function subscribe(aufwachen: () => void) {
window.addEventListener("online", aufwachen);
window.addEventListener("offline", aufwachen);
return () => {
window.removeEventListener("online", aufwachen);
window.removeEventListener("offline", aufwachen);
};
}
export function useOnline() {
return useSyncExternalStore(
subscribe,
() => navigator.onLine, // Client
() => true // Server: nimm "online" an
);
} const [online, setOnline] = useState(navigator.onLine);
useEffect(() => {
const f = () => setOnline(navigator.onLine);
window.addEventListener("online", f);
window.addEventListener("offline", f);
return () => { … };
}, []); const online = useSyncExternalStore(
subscribe,
() => navigator.onLine,
() => true
); Beim unterbrechbaren Rendern (Transitions, Suspense) kann die Effect-Variante dazu führen, dass zwei Komponenten im selben Bild verschiedene Werte anzeigen. Genau das verhindert dieser Hook.
Gibt die Funktion bei jedem Aufruf ein neues Objekt zurück (() => ({ x: w.innerWidth })), rendert React endlos. Liefere primitive Werte oder halte das Objekt zwischengespeichert.
- +
Browser-Werte abonnieren:
navigator.onLine,matchMedia,localStorage - +
Eine eigene Store-Datei außerhalb von React anbinden
- +
Wenn du eine State-Bibliothek baust
- −
Normalen Komponenten-State – dafür ist
useStateda - −
Serverdaten – dafür gibt es Query-Bibliotheken
Sitzt das schon?
3 Fragen zu dieser Lektion. Falsche Antworten landen in deiner Statistik.