Het probleem met subscriptions op externe stores
Begrijp tearing en waarom subscriptions met useState of useRef naar externe stores onveilig zijn in concurrent React.
Het probleem met subscriptions op externe stores is een gratis React Academy-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject React Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus React Academy bevat in totaal 4 lessen.
Wat een externe statusopslag is
Een externe statusopslag is elke statusbron die buiten de React-boom leeft, zoals een Redux-opslag, een browser-API zoals matchMedia of een gewoon object op moduleniveau met een eigen mechanisme om je erop te abonneren.
React beheert deze status niet, dus moet het zich abonneren op wijzigingen en momentopnamen lezen om componenten synchroon te houden met wat de opslag momenteel bevat.
De naïeve useState + useEffect-abonnering
Een gebruikelijke aanpak leest de waarde van de statusopslag in useState en gebruikt daarna useEffect om zich te abonneren en setState aan te roepen telkens wanneer de opslag verandert. Op het eerste gezicht lijkt dit de component actueel te houden.
Dit werkt voor eenvoudige synchrone weergave, maar heeft een subtiele tekortkoming die zichtbaar wordt zodra React gelijktijdig rendert en werk halverwege kan pauzeren of opnieuw starten.
Het tearing-probleem
Tearing ontstaat wanneer verschillende delen van de gebruikersinterface tijdens één renderdoorgang verschillende waarden van dezelfde statusopslag weergeven. Gelijktijdig renderen kan werk onderbreken en hervatten, terwijl de opslag intussen kan veranderen.
Het resultaat is een inconsistent scherm waarop de ene component de oude waarde toont en de andere de nieuwe, een inconsistentie die vóór functies voor gelijktijdig renderen praktisch onmogelijk was.
Voorbeeld: tearing met donkere modus tijdens het renderen
Stel je voor dat veel componenten een thema-opslag lezen terwijl React gelijktijdig rendert. Als de gebruiker halverwege de donkere modus inschakelt, tonen de componenten die vóór de omschakeling zijn gerenderd het lichte thema en die erna het donkere.
Je krijgt één frame lang een halflicht en halfdonker scherm, omdat de waarde in de opslag tijdens een render veranderde die React niet als één atomaire bewerking behandelde.
Waarom useEffect te laat is
Effecten worden uitgevoerd nadat de render is doorgevoerd, dus een op useEffect gebaseerde abonnering kan niet garanderen dat de tijdens het renderen gelezen waarde bij het doorvoeren overeenkomt met de statusopslag. De abonnering reageert te laat om een inconsistente weergave te voorkomen.
Tegen de tijd dat het effect opnieuw is geabonneerd en de status heeft bijgewerkt, kan het inconsistente frame al aan de gebruiker zijn getoond.
Het verouderde useMutableSource
Een eerdere experimentele API met de naam useMutableSource probeerde gelijktijdig veilig lezen uit externe statusopslag mogelijk te maken, maar de API bleek moeilijk correct te gebruiken en is nooit als stabiel uitgebracht.
Het React-team verving deze door een eenvoudiger, gebruiksvriendelijker mechanisme dat dezelfde consistentiegaranties biedt zonder lastige valkuilen.
useSyncExternalStore als oplossing
useSyncExternalStore is de officiële hook om je op een externe statusopslag te abonneren op een manier die veilig is bij gelijktijdig renderen. De hook stemt af met React, zodat gelezen waarden tijdens een render consistent blijven en componenten geen tearing vertonen.
Het werd het aanbevolen mechanisme voor bibliotheekauteurs die externe status bij gelijktijdig renderen betrouwbaar met React moeten verbinden.
Welke bibliotheken betroffen waren
Statusbibliotheken die zich op externe statusopslag abonneren, werden rechtstreeks getroffen, waaronder Redux, MobX en Valtio. Elke bibliotheek moest het nieuwe mechanisme overnemen om veilig te blijven nadat functies voor gelijktijdig renderen beschikbaar kwamen.
Daarom zijn hun React-koppelingen bijgewerkt om intern useSyncExternalStore aan te roepen in plaats van te vertrouwen op het oudere patroon met useState en useEffect.
Consistente snapshot en veiligheid bij gelijktijdig renderen
De hook garandeert dat elk component dat de store tijdens het renderen leest, dezelfde snapshot ziet en een synchrone nieuwe render afdwingt als de store verandert op een manier die anders tot tearing zou leiden.
Deze combinatie van een consistente snapshot en veiligheid bij gelijktijdig renderen is de belangrijkste meerwaarde die de hook biedt ten opzichte van zelfgebouwde abonnementen.
Een toekomstbestendige primitive
Door useSyncExternalStore te gebruiken blijven je abonnementen correct terwijl React zijn renderingsmodel verder ontwikkelt. Je kiest voor de garanties van het framework in plaats van ze onvolmaakt opnieuw te implementeren.
Dit maakt het de duurzame, aanbevolen manier om elke externe bron van waarheid aan React-componenten te koppelen.
Korte controle: het tearingprobleem
Bevestig wat tearing betekent bij gelijktijdig renderen.
Samenvatting: problemen met abonnementen op externe stores
Externe stores leven buiten React, en het naïeve abonnement met useState plus useEffect kan tearing niet voorkomen zodra renderen gelijktijdig gebeurt. Effecten worden te laat uitgevoerd om alle waarden die tijdens één render worden gelezen consistent te houden.
useSyncExternalStore vervangt het niet meer gebruikte useMutableSource en biedt een consistente snapshot met veiligheid bij gelijktijdig renderen. Bibliotheken zoals Redux, MobX en Valtio hebben het overgenomen als toekomstbestendige primitive voor store-abonnementen.
Leer React met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 88
- Lessen
- 324
Veelgestelde vragen
Is de les “Het probleem met subscriptions op externe stores” gratis?
Ja — de volledige tekst van “Het probleem met subscriptions op externe stores” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus React Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus React Academy bevat in totaal 4 lessen.
Wat leer ik in “Het probleem met subscriptions op externe stores”?
Begrijp tearing en waarom subscriptions met useState of useRef naar externe stores onveilig zijn in concurrent React. Je oefent met React Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met React Academy te beginnen?
Ervaring vooraf is niet nodig. React Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.
Hoe lang duurt de les “Het probleem met subscriptions op externe stores”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over React Academy?
Ja. Elke les over React Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Het probleem met subscriptions op externe stores
- De useSyncExternalStore-API en parameters
- Abonneren op browser-API's
- Een custom store bouwen met useSyncExternalStore