Apollo 查询不 return 使用 readFragment 缓存数据

Apollo query does not return cached data available using readFragment

我有 2 个查询:getGroups(): [Group]getGroup($id: ID!): Group。一个组件首先使用 getGroups() 加载所有组,然后另一个组件需要通过 ID 访问特定的 Group 数据。

我希望 Apollo 的规范化已经在缓存中有组数据,并会在执行 getGroup($id: ID!) 查询时使用它,但事实并非如此。

当我设置 cache-only fetchPolicy 时,return 什么也没有。我可以使用 readFragment 访问数据,但这不如仅使用查询灵活。

有没有一种简单的方法可以让 Apollo return 像我期望的那样从不同的查询中获取缓存数据?

查询字段 returns 一个节点列表和另一个采用 id 参数和 returns 单个节点的查询字段是很常见的。但是,决定字段返回哪些特定节点最终是服务器域逻辑的一部分。

作为一个愚蠢的例子,想象一下如果你有一个像 getFavoriteGroup(id: ID!) 这样的字段——你的缓存中可能有具有该 ID 的组,但这并不一定意味着它应该由该字段返回 (它可能不会被收藏)。有许多因素(其他参数执行上下文等)可能会影响字段返回的节点。作为客户,Apollo 无权对您的域逻辑做出假设。

但是,您可以通过实施 query redirects.

有效地复制该逻辑
const cache = new InMemoryCache({
  cacheRedirects: {
    Query: {
      group: (_, args) => toIdValue(cache.config.dataIdFromObject({ __typename: 'Group', id: args.id })),
    },
  },
});