He escrito una función de combinación personalizada para los products de campo en el tipo Session . Parece que la función de combinación solo se llama cuando inicializo el objeto Session:1 con sus products , y no cuando actualizo los products más tarde usando cache.modify .
Mi función de combinación:
const client = new ApolloClient({ uri: 'http://localhost:8081/graphql', cache: new InMemoryCache({ typePolicies: { Session: { fields: { products: { merge (existing, incoming) { // this is only being called on useQuery(HydrateSession), not useMutation(UpsertProduct) console.log('existing', JSON.stringify(existing, null, 2)) console.log('incoming', JSON.stringify(incoming, null, 2)) // remove duplicates when latestProduct has the same id as an existing product — [..., latestProduct] if (incoming.filter(p => p.id === incoming[incoming.length - 1].id).length > 1) return existing return incoming } } } } } }) }) Inicialización de Session :
const HydrateSession = gql` query { session { id products { id } } } ` ... useQuery(HydrateSession) Actualización de products más tarde usando cache.modify :
const UpsertProduct = gql` mutation UpsertProduct($product: ProductInput!) { upsertProduct(product: $product) { id } } ` ... const [upsertProductMutation] = useMutation(UpsertProduct) const onClick = async () => { await upsertProductMutation({ variables: { product: { id: 2 } }, update: (cache, mutationResult) => { cache.modify({ id: 'Session:1', fields: { products: previous => [...previous, mutationResult.data.upsertProduct] } }) } }) } Tengo un ejemplo de trabajo completo aquí https://github.com/jsindos/apollo-play , ejecute npm i y luego inicie dos procesos separados con npm start y npm serve . Después de hacer clic en el botón que activa la mutación, la función de combinación no se ejecuta (como se ve por la ausencia de declaraciones de console.log en la consola).
modifyelude cualquier función de combinación que haya definido, lo que significa que los campos siempre se sobrescriben con exactamente los valores que especifique.
Leer la documentación es algo bueno.