Apollo-cache: Normalisering og opdateringer
Forstå Apollos normaliserede InMemoryCache, og opdatér cachede data efter mutationer uden at hente dem igen.
Apollo-cache: Normalisering og opdateringer er en gratis React Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i React Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. React Academy-kurset indeholder 4 lektioner i alt.
Sådan normaliserer InMemoryCache data
InMemoryCache gemmer hvert objekt under en cache-nøgle, der består af __typename og id: User:1, Post:42. Når en forespørgsel returnerer en User med id "1", gemmes den kun én gang under denne nøgle, uanset hvor mange forskellige forespørgsler der indeholder den.
Alle efterfølgende forespørgsler, der henter den samme User:1, læser fra den ene cachepost, så alle komponenter ser de samme data.
Automatiske opdateringer på tværs af forespørgsler
Når en mutation returnerer et opdateret User:1-objekt, skriver Apollo det til cacheposten User:1. Alle aktive forespørgsler, der indeholdt User:1, afspejler automatisk de opdaterede felter i brugerfladen uden yderligere kode.
Denne automatiske udbredelse er den primære fordel ved en normaliseret cache sammenlignet med en dokumentcache med forespørgselsnøgler.
cache.readQuery
Læs det aktuelle cachelagrede resultat af en forespørgsel: cache.readQuery({ query: GET_USERS }) returnerer dataobjektet, som om useQuery havde returneret det. Returnerer null, hvis forespørgslen ikke findes i cachen.
Brug readQuery i opdateringsfunktioner til mutationer for at læse den aktuelle liste, før du ændrer den.
cache.writeQuery
cache.writeQuery({ query: GET_USERS, data: { users: updatedUsers } }) skriver direkte til cachen og udløser genrendering i alle komponenter, der læser GET_USERS. Der foretages ingen netværksforespørgsel.
Kombinér readQuery og writeQuery for at implementere uforanderlige cacheopdateringer: læs, opret et nyt array, skriv det tilbage.
cache.modify til direkte opdatering af entiteter
cache.modify({ id: cache.identify(user), fields: { name: () => 'New Name' } }) ændrer direkte felterne i en bestemt cachelagret entitet. Der er ikke behov for først at læse en forespørgsel, når du kender entitetens cache-id.
Objektet fields knytter feltnavne til modifikatorfunktioner, som modtager den aktuelle værdi og returnerer den nye værdi.
Opdatering af cachen efter en mutation
Overfør en update-funktion til useMutation: useMutation(ADD_POST, { update(cache, { data: { addPost } }) { cache.modify({ id: cache.identify(user), fields: { posts: existingPosts => [...existingPosts, addPost] } }); } }).
Dette føjer det nye opslag til brugerens cachelagrede array af opslag og opdaterer alle komponenter, der viser brugerens liste over opslag.
cache.evict: Fjernelse af cacheposter
cache.evict({ id: 'User:1' }) fjerner posten User:1 fra cachen. Enhver aktiv forespørgsel, der indeholdt User:1, genrenderes med entiteten fjernet fra resultatet.
Når du har fjernet poster, skal du kalde cache.gc() for at fjerne objekter, der nu er utilgængelige fra rodforespørgslerne. Det forhindrer hukommelseslækager i programmer, der kører i lang tid.
Skraldeindsamling
cache.gc() gennemløber cachegrafen med udgangspunkt i alle aktive forespørgsler og fjerner entiteter, som ikke længere kan nås. Det er sikkert at kalde den med jævne mellemrum eller efter batchændringer, der sletter mange entiteter.
Entiteter, der refereres til af aktive useQuery-hooks, bliver aldrig skraldeindsamlet – kun forældreløse entiteter, som ikke længere indgår i noget forespørgselsresultat.
Omdirigeringer i cachen med feltpolitikker
Hvis du forespørger efter en enkelt entitet (GET_USER efter id), der allerede er cachelagret som en del af en listeforespørgsel, kan Apollo læse den fra cachen uden en netværksrundtur ved hjælp af feltpolitikker: keyArgs og read-funktioner i typepolitikken.
Read-funktionen returnerer en cachereference: return toReference({ __typename: 'User', id: args.id }), der fortæller Apollo at læse fra den eksisterende cachepost User:id.
Brugerdefinerede keyFields til ikke-standardiserede id'er
Hvis dine entiteter bruger et andet felt end id som deres entydige nøgle (f.eks. slug eller uuid), skal du konfigurere det i typepolitikken: new InMemoryCache({ typePolicies: { Post: { keyFields: ['slug'] } } }).
Apollo bruger derefter Post:my-post-slug som cache-nøgle i stedet for at kræve et id-felt og bevarer dermed normaliseringen for skemaer med ikke-standardiserede nøgler.
refetchQueries kontra update-funktion
refetchQueries: [{ query: GET_USERS }] i indstillingerne for useMutation udløser en ny netværksforespørgsel, når mutationen er fuldført. Det er enklere, men sender altid en netværksforespørgsel.
Opdateringsfunktionen ændrer cachen lokalt og undgår netværksrundturen. Brug refetchQueries, når cacheopdateringslogikken er for kompleks at skrive, eller når serverberegnede felter gør lokale cacheopdateringer upålidelige.
Normaliseringsnøgle i InMemoryCache
Hvilket cache-nøgleformat bruger InMemoryCache som standard til at gemme entiteter?
Opsummering af lektionen
InMemoryCache normaliserer entiteter efter __typename+id, hvilket muliggør automatiske opdateringer på tværs af forespørgsler. Læs fra og skriv til cachen med cache.readQuery, cache.writeQuery og cache.modify. Fjern entiteter med cache.evict efterfulgt af cache.gc. Konfigurer brugerdefinerede nøglefelter via typePolicies for primærnøgler, der ikke er id.
Brug opdateringsfunktioner til mutationer for effektiv lokal cachehåndtering; brug refetchQueries, når serverberegnede felter gør lokale opdateringer upålidelige.
Lær React med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 88
- Lektioner
- 324
Ofte stillede spørgsmål
Er lektionen “Apollo-cache: Normalisering og opdateringer” gratis?
Ja — hele teksten til “Apollo-cache: Normalisering og opdateringer” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af React Academy-kurset, skal du opgradere til CoddyKit PRO. React Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Apollo-cache: Normalisering og opdateringer”?
Forstå Apollos normaliserede InMemoryCache, og opdatér cachede data efter mutationer uden at hente dem igen. Du øver dig i React Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på React Academy?
Der kræves ingen tidligere erfaring. React Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Apollo-cache: Normalisering og opdateringer”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne React Academy-lektion?
Ja. Alle React Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- GraphQL-grundlag for React-udviklere
- Opsætning af Apollo Client i React
- useQuery- og useMutation-hooks
- Apollo-cache: Normalisering og opdateringer