Apollo Client中是否可以更新或替换缓存条目的id为新值?
问题根因
Apollo Client 默认使用 __typename + 主键字段(默认取 id/_id) 作为规范化缓存的唯一标识,你的 Station 类型每次更新都会生成新的自增 id,导致 Apollo 认为前后返回的是两个完全不同的对象,无法自动合并缓存。
最优解决方案:自定义缓存主键规则
你完全不需要手动遍历缓存更新引用,只要在初始化 Apollo Client 时,针对 Station 类型自定义缓存主键的生成规则,用业务上唯一不变的 stationId 替代自增 id 作为缓存主键即可,配置后 Apollo 会自动识别同 stationId 的对象为同一缓存条目,自动合并更新字段,无需额外手动处理 mutation 缓存。
配置示例:
import { ApolloClient, InMemoryCache, defaultDataIdFromObject } from '@apollo/client'; const client = new ApolloClient({ uri: '你的GraphQL接口地址', cache: new InMemoryCache({ dataIdFromObject: (obj) => { // 仅针对Station类型使用stationId作为缓存主键 if (obj.__typename === 'Station') { return `Station:${obj.stationId}`; } // 其余类型走默认的主键生成逻辑 return defaultDataIdFromObject(obj); } }) });
注意事项
所有查询 Station 类型的 GraphQL 请求,必须显式请求 stationId 字段,否则无法生成正确的缓存主键。
关于你提到的「遍历缓存更新所有引用」方案
该方案技术上可行,但性价比极低,不推荐。实现时需要通过 cache.modify 遍历缓存中所有 Station 类型的条目,匹配 stationId 后更新对应字段,还要处理各种嵌套引用场景,维护成本高,容易出现遗漏,远不如自定义缓存主键的方案简洁可靠。
内容的提问来源于stack exchange,提问作者seedBoot
相关产品推荐
相关产品推荐

