Apollo Client’s cache is designed to handle normalized data, where each entity is stored separately and identified by unique keys. Understanding this normalization process and how identifiers work is key to managing and updating the cache effectively.
How Apollo Cache Works
-
Normalization: Apollo Client normalizes the data by splitting the result into individual entities, each identified by a unique key. This key is usually a combination of the entity’s type (
__typename
) and its unique identifier (id
). -
Entity Storage: Each entity is stored in the cache separately. Relationships between entities are maintained using references. For example, in your case,
cma_report
would be stored with references to itslead
, which in turn referencesproperty
.
Example Query
Consider your query:
{
cma_report {
id
lead {
property {
id
}
}
}
}
When this query is executed, Apollo Client might normalize the data like this:
-
cma_report:{id}
-> {id, lead:lead:{id}
} -
lead:{id}
-> {property:property:{id}
} -
property:{id}
-> {id}
Updating the Cache
When you perform a mutation, Apollo Client tries to update the cache based on the data returned from the mutation. If the mutation payload doesn't include enough information to match the normalized entities in the cache, it may fail to find the relevant entity.
For example, if your mutation looks like this:
mutation {
updateCmaReport(id: 1, lead: {property: {id: 2}}) {
cma_report {
id
lead {
property {
id
}
}
}
}
}
Issue with Missing IDs
If the mutation payload does not include the id
for lead
, Apollo Client cannot find the corresponding entity in the cache. In your case, the structure Apollo Client expects might look like this:
-
cma_report:{id}
-> {id, lead:lead:{id}
}
If the mutation payload is missing the lead.id
, it cannot match lead:{id}
. Therefore, the cache update fails, and Apollo might fall back to refetching the entire parent query to ensure the cache is up-to-date.
Fixing the Issue
By including the id
for lead
in the mutation response, you provide Apollo Client with the necessary information to find and update the correct entity in the cache. This aligns the mutation payload with the structure in the cache, allowing for a successful update.
Summary
To ensure Apollo Client’s cache is updated correctly:
- Always include
id
fields for all nested entities in both queries and mutation responses. - Understand the normalized structure and how entities are referenced in the cache.
- Ensure your mutation payloads match the expected structure in the cache.
By following these practices, you can leverage Apollo Client’s cache effectively and avoid unnecessary refetches.
Top comments (0)