0Pricing
React Academy · Lektion

Das Problem bei Subscriptions auf externe Stores

Verstehen Sie Tearing und warum Subscriptions mit useState oder useRef auf externen Stores in concurrent React unsicher sind.

Das Problem bei Subscriptions auf externe Stores ist eine kostenlose React Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des React Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ein externer Store ist

Ein externer Store ist jede Zustandsquelle, die außerhalb des React-Baums lebt, etwa ein Redux-Store, eine Browser-API wie matchMedia oder ein einfaches Objekt auf Modulebene mit eigener subscribe-Mechanik.

React besitzt diesen Zustand nicht. Daher muss es Änderungen abonnieren und Snapshots lesen, damit die Komponenten mit dem aktuellen Inhalt des Stores synchron bleiben.

Die naive Subscription mit useState + useEffect

Ein verbreiteter Ansatz liest den Store-Wert in useState ein und verwendet anschließend useEffect, um eine Subscription einzurichten und bei jeder Änderung setState aufzurufen. Auf den ersten Blick scheint die Komponente dadurch aktuell zu bleiben.

Für einfaches synchrones Rendern funktioniert das, aber es hat einen subtilen Fehler, der sichtbar wird, sobald React nebenläufig rendert und die Arbeit mittendrin pausieren oder neu starten kann.

Das Tearing-Problem

Tearing tritt auf, wenn verschiedene Teile der Benutzeroberfläche während eines einzigen Renderdurchlaufs unterschiedliche Werte desselben Stores anzeigen. Nebenläufiges Rendern kann die Arbeit unterbrechen und fortsetzen, während sich der Store dazwischen ändert.

Das Ergebnis ist ein inkonsistenter Bildschirm: Eine Komponente zeigt den alten Wert und eine andere den neuen. Vor den Concurrent-Features war diese Inkonsistenz praktisch unmöglich.

Beispiel: Tearing bei einem Wechsel in den Dark Mode während des Renderns

Stellen Sie sich vor, dass viele Komponenten während eines nebenläufigen Renderns einen Theme-Store lesen. Wenn die Benutzerin oder der Benutzer mittendrin den Dark Mode aktiviert, zeigen die vor dem Umschalten gerenderten Komponenten das helle Theme und die danach gerenderten das dunkle.

Für einen Frame sehen Sie dadurch einen halb hellen, halb dunklen Bildschirm, weil sich der Store-Wert während eines Renderns geändert hat, das React nicht atomar behandelt hat.

Warum useEffect zu spät kommt

Effekte laufen, nachdem das Renderergebnis committed wurde. Eine auf useEffect basierende Subscription kann daher nicht garantieren, dass der während des Renderns gelesene Wert beim Commit noch mit dem Store übereinstimmt. Die Subscription wird zu spät ausgelöst, um eine inkonsistente Darstellung zu verhindern.

Wenn der Effekt die Subscription erneut einrichtet und den Zustand aktualisiert, wurde der inkonsistente Frame möglicherweise bereits angezeigt.

Das veraltete useMutableSource

Eine frühere experimentelle API namens useMutableSource sollte nebenläufigkeitssichere Lesezugriffe auf externe Zustände ermöglichen. Ihre API erwies sich jedoch als schwierig korrekt zu verwenden und wurde nie als stabile Version veröffentlicht.

Das React-Team ersetzte sie durch ein einfacheres, ergonomischeres Primitiv, das dieselben Konsistenzgarantien ohne diese Fehlerquellen bietet.

useSyncExternalStore als Lösung

useSyncExternalStore ist der offizielle Hook, um nebenläufigkeitssicher externe Stores zu abonnieren. Er koordiniert sich mit React, sodass Lesezugriffe während eines Renderns konsistent bleiben und kein Tearing in Komponenten auftritt.

Er wurde zum empfohlenen Primitiv für Bibliotheksautoren, die externen Zustand beim nebenläufigen Rendern zuverlässig in React einbinden müssen.

Welche Bibliotheken betroffen waren

State-Bibliotheken, die externe Stores abonnieren, waren direkt betroffen, darunter Redux, MobX und Valtio. Jede von ihnen musste das neue Primitiv übernehmen, um nach der Einführung der Concurrent-Features sicher zu bleiben.

Deshalb wurden ihre React-Bindings aktualisiert und rufen intern useSyncExternalStore auf, statt sich auf das ältere Muster mit useState plus useEffect zu verlassen.

Konsistenter Snapshot und Sicherheit bei nebenläufigem Rendering

Der Hook garantiert, dass jede Komponente, die den Store während eines Render-Vorgangs liest, denselben Snapshot sieht, und erzwingt ein synchrones erneutes Rendern, wenn sich der Store auf eine Weise ändert, die sonst zu Tearing führen würde.

Diese Kombination aus konsistentem Snapshot und Sicherheit bei nebenläufigem Rendering ist der zentrale Mehrwert, den der Hook gegenüber selbst implementierten Subscriptions bietet.

Zukunftssichere Grundlage

Indem Sie useSyncExternalStore verwenden, bleiben Ihre Subscriptions korrekt, während React sein Rendering-Modell weiterentwickelt. Sie nutzen die Garantien des Frameworks, statt sie unvollkommen neu zu implementieren.

Das macht ihn zur dauerhaften, empfohlenen Methode, jede externe Quelle der Wahrheit mit React-Komponenten zu verbinden.

Kurzer Test: Das Tearing-Problem

Bestätigen Sie, was Tearing beim nebenläufigen Rendering bedeutet.

Zusammenfassung: Probleme bei Subscriptions externer Stores

Externe Stores befinden sich außerhalb von React, und die naive Subscription mit useState und useEffect kann Tearing nicht verhindern, sobald das Rendering nebenläufig erfolgt. Effekte werden zu spät ausgeführt, um konsistente Lesevorgänge innerhalb eines Render-Vorgangs sicherzustellen.

useSyncExternalStore ersetzt das abgekündigte useMutableSource und liefert einen konsistenten Snapshot mit Sicherheit bei nebenläufigem Rendering. Bibliotheken wie Redux, MobX und Valtio haben es als zukunftssichere Grundlage für Store-Subscriptions übernommen.

Häufig gestellte Fragen

Ist die Lektion „Das Problem bei Subscriptions auf externe Stores“ kostenlos?

Ja — der vollständige Text von „Das Problem bei Subscriptions auf externe Stores“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des React Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Das Problem bei Subscriptions auf externe Stores“?

Verstehen Sie Tearing und warum Subscriptions mit useState oder useRef auf externen Stores in concurrent React unsicher sind. Du übst React Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um React Academy zu starten?

Keine Vorkenntnisse erforderlich. React Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Das Problem bei Subscriptions auf externe Stores“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser React Academy-Lektion Code schreiben und ausführen?

Ja. Jede React Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Das Problem bei Subscriptions auf externe Stores
  2. useSyncExternalStore: API und Parameter
  3. Subscriptions auf Browser-APIs
  4. Einen eigenen Store mit useSyncExternalStore erstellen
← Zurück zu React Academy