React Academy · Les

Apollo-cache: normalisatie en updates

Krijg inzicht in Apollo's genormaliseerde InMemoryCache en werk gecachte gegevens na mutaties bij zonder opnieuw op te halen

Les 4 van 413 stappen

Apollo-cache: normalisatie en updates is een gratis React Academy-les op CoddyKit. Dit is les 4 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.

Hoe InMemoryCache gegevens normaliseert

InMemoryCache slaat elk object op met een cachesleutel die uit __typename en id bestaat: User:1, Post:42. Wanneer een query een User met id "1" retourneert, wordt die één keer onder deze sleutel opgeslagen, ongeacht in hoeveel verschillende query's deze voorkomt.

Elke volgende query die dezelfde User:1 ophaalt, leest uit de ene cachevermelding, zodat alle componenten dezelfde gegevens zien.

Automatische updates tussen query's

Wanneer een mutatie een bijgewerkt User:1-object retourneert, schrijft Apollo het naar de cachevermelding User:1. Elke actieve query waarin User:1 voorkwam, geeft de bijgewerkte velden automatisch weer in de gebruikersinterface zonder extra code.

Dit automatisch doorgeven is het belangrijkste voordeel van een genormaliseerde cache ten opzichte van een documentcache (een cache op basis van query's).

cache.readQuery

Lees het huidige gecachte resultaat van een query: cache.readQuery({ query: GET_USERS }) retourneert het gegevensobject alsof useQuery het had geretourneerd. Geeft null terug als de query niet in de cache staat.

Gebruik readQuery binnen updatefuncties van mutaties om de huidige lijst te lezen voordat je die wijzigt.

cache.writeQuery

cache.writeQuery({ query: GET_USERS, data: { users: updatedUsers } }) schrijft rechtstreeks naar de cache en activeert opnieuw renderen in alle componenten die GET_USERS lezen. Er wordt geen netwerkaanvraag gedaan.

Combineer readQuery en writeQuery om onveranderlijke cache-updates te implementeren: lezen, een nieuwe array maken en terugschrijven.

cache.modify voor directe entiteitsupdates

cache.modify({ id: cache.identify(user), fields: { name: () => 'New Name' } }) wijzigt rechtstreeks de velden van een specifieke gecachte entiteit. Je hoeft niet eerst een query te lezen wanneer je de cache-ID van de entiteit kent.

Het fields-object koppelt veldnamen aan modifierfuncties die de huidige waarde ontvangen en de nieuwe waarde retourneren.

Cache bijwerken na een mutatie

Geef een updatefunctie door aan useMutation: useMutation(ADD_POST, { update(cache, { data: { addPost } }) { cache.modify({ id: cache.identify(user), fields: { posts: existingPosts => [...existingPosts, addPost] } }); } }).

Hiermee voeg je het nieuwe bericht toe aan de gecachte berichtenarray van de gebruiker en werk je alle componenten bij die de berichtenlijst van de gebruiker weergeven.

cache.evict: Cachevermeldingen verwijderen

cache.evict({ id: 'User:1' }) verwijdert de User:1-vermelding uit de cache. Elke actieve query waarin User:1 voorkwam, rendert opnieuw zonder die entiteit in het resultaat.

Roep na het verwijderen van vermeldingen cache.gc() aan om objecten te verwijderen die niet meer bereikbaar zijn vanuit hoofdquery's. Hiermee voorkom je geheugenlekken in langlopende toepassingen.

Garbagecollection

cache.gc() doorloopt de cachegrafiek vanaf alle actieve query's en verwijdert entiteiten die niet meer bereikbaar zijn. Je kunt dit veilig periodiek aanroepen of na mutaties in groepen die veel entiteiten verwijderen.

Entiteiten waarnaar actieve useQuery-hooks verwijzen, worden nooit door garbage collection opgeruimd; alleen verweesde entiteiten die geen deel meer uitmaken van een queryresultaat worden verwijderd.

Cacheomleidingen met veldbeleid

Als je een enkele entiteit opvraagt (GET_USER op basis van id) die al als onderdeel van een lijstquery in de cache staat, kan Apollo die uit de cache lezen zonder een extra netwerkverzoek, met behulp van veldbeleid: keyArgs- en read-functies in het typebeleid.

De read-functie retourneert een cachereferentie: return toReference({ __typename: 'User', id: args.id }), waarmee je Apollo vertelt om uit de bestaande User:id-cachevermelding te lezen.

Aangepaste keyFields voor niet-standaard-ID's

Als je entiteiten een ander veld dan id als unieke sleutel gebruiken, bijvoorbeeld slug of uuid, configureer je dit in het typebeleid: new InMemoryCache({ typePolicies: { Post: { keyFields: ['slug'] } } }).

Apollo gebruikt dan Post:my-post-slug als cachesleutel in plaats van een id-veld te vereisen, zodat normalisatie voor niet-standaard schema's behouden blijft.

refetchQueries versus updatefunctie

refetchQueries: [{ query: GET_USERS }] in de opties van useMutation activeert een nieuwe netwerkaanvraag nadat de mutatie is voltooid. Dit is eenvoudiger, maar veroorzaakt altijd een netwerkaanvraag.

De updatefunctie wijzigt de cache lokaal en vermijdt de extra netwerkronde. Gebruik refetchQueries wanneer de logica voor het bijwerken van de cache te complex is om te schrijven of wanneer door de server berekende velden lokale cache-updates onbetrouwbaar maken.

Normalisatiesleutel van InMemoryCache

Wat is de standaardindeling van de cachesleutel die InMemoryCache gebruikt om entiteiten op te slaan?

Samenvatting van de les

InMemoryCache normaliseert entiteiten op basis van __typename+id, waardoor automatische updates tussen query's mogelijk zijn. Lees en schrijf de cache met cache.readQuery, cache.writeQuery en cache.modify. Verwijder entiteiten met cache.evict, gevolgd door cache.gc. Configureer aangepaste sleutelvelden via typePolicies voor primaire sleutels die niet op id zijn gebaseerd.

Gebruik updatefuncties van mutaties voor efficiënte lokale cache-updates; gebruik refetchQueries wanneer door de server berekende velden lokale updates onbetrouwbaar maken.

Gratis beginnen

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 “Apollo-cache: normalisatie en updates” gratis?

Ja — de volledige tekst van “Apollo-cache: normalisatie en updates” 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 “Apollo-cache: normalisatie en updates”?

Krijg inzicht in Apollo's genormaliseerde InMemoryCache en werk gecachte gegevens na mutaties bij zonder opnieuw op te halen 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 4 van 4.

Hoe lang duurt de les “Apollo-cache: normalisatie en updates”?

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

  1. GraphQL-basisprincipes voor React-ontwikkelaars
  2. Apollo Client instellen in React
  3. useQuery- en useMutation-hooks
  4. Apollo-cache: normalisatie en updates
← Terug naar React Academy