You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:24:07