微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Apollo Client - 使用对象列表中的缓存结果来响应对单个对象的查询

如何解决Apollo Client - 使用对象列表中的缓存结果来响应对单个对象的查询

是否可以将 Apollo 客户端配置为从返回项目列表的查询获取单个缓存的项目,以便在查询单个项目时预取数据?

架构:

type Item {
  id: ID!
  name: String!
}

type Query {
  items: [Item!]!
  itemById(id: ID!): Item!
}

查询 1:

query HomePagelist {
  items {
    id
    name
  }
}

查询 2:

query ItemDetail($id: ID!) {
  itemById(id: $id) {
    id
    name
  }
}

鉴于个别项目的数据已经在缓存中,应该可以使用已经缓存的数据,同时仍然执行提取,以防任何数据发生变化。

然而,查询并没有使用缓存的数据(至少认情况下),似乎我们需要以某种方式告诉 Apollo 我们知道该 Item 已经在缓存中。

非常感谢任何帮助。

解决方法

此功能存在,但如果您不知道要查找什么,则很难找到。在 Apollo Client v2 中,您正在寻找缓存重定向功能,在 Apollo Client v3 中,这被类型策略/字段读取策略 (v3 docs) 取代。

Apollo 不“知道”您的 GraphQL 架构,这使得在日常使用中可以轻松设置和使用。然而,这意味着给定一些查询(例如 getBooks)它不知道结果类型将是什么预先。只要启用了 __typename,它就会知道它之后。这是默认行为,是规范化缓存所必需的。

假设您有一个 getBooks 查询,用于获取 Book 的列表。如果在此请求完成后使用 Apollo devtools 检查缓存,您应该使用 Book:123 键查找缓存中的书籍,其中 Book 是类型名称,123 是 ID。如果它存在(并被查询!)id 字段用作缓存的标识符。如果您的 id 字段有其他名称,您可以使用缓存的 typePolicies 将这个字段通知 Apollo InMemoryCache。

如果您已经设置好并在之后运行 getBook 查询,使用某个 ID 作为输入,您将不会获得任何缓存数据。原因如前所述:Apollo 不知道该查询将返回哪种类型。

因此在 Apollo v2 中,您将使用 cacheRedirect 将 Apollo“重定向”到正确的缓存:

  cacheRedirects: {
    Query: {
      getBook(_,args,{ getCacheKey }) {
        return getCacheKey({
          __typename: 'Book',id: args.id,});
      }
    },},

(如果您在 typePolicy 中指定了另一个键,则应将 args.id 替换为另一个标识符)

当使用 Apollo v3 时,你需要一个 typepolicy / field read policy:

  typePolicies: {
    Query: {
      fields: {
        getBook(_,{ args,toReference }) {
          return toReference({
            __typename: 'Book',});
        }
      }
    }
  }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。