【问题标题】:Apollo query does not return cached data available using readFragmentApollo 查询不返回使用 readFragment 可用的缓存数据
【发布时间】:2019-12-16 13:36:59
【问题描述】:

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

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

当我设置 cache-only fetchPolicy 时,没有返回任何内容。我可以使用readFragment 访问数据,但这不如仅使用查询灵活。

有没有一种简单的方法可以让 Apollo 按照我的预期从不同的查询返回缓存数据?

【问题讨论】:

    标签: graphql apollo react-apollo


    【解决方案1】:

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

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

    但是,您可以通过实现query redirects 有效地复制该逻辑。

    const cache = new InMemoryCache({
      cacheRedirects: {
        Query: {
          group: (_, args) => toIdValue(cache.config.dataIdFromObject({ __typename: 'Group', id: args.id })),
        },
      },
    });
    

    【讨论】:

    • 谢谢,似乎正是我想要的。
    猜你喜欢
    • 2020-09-04
    • 2018-08-08
    • 2020-02-12
    • 1970-01-01
    • 2021-04-04
    • 2021-03-13
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    相关资源
    最近更新 更多