【问题标题】:Apollo Client - using cached results from object list in response to query for single objectApollo 客户端 - 使用对象列表中的缓存结果来响应对单个对象的查询
【发布时间】:2021-04-26 18:27:27
【问题描述】:

是否可以将 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 我们知道该项目已经在缓存中。

非常感谢任何帮助。

【问题讨论】:

    标签: javascript caching graphql apollo apollo-client


    【解决方案1】:

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

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

    假设您有一个获取Books 列表的getBooks 查询。如果在此请求完成后使用 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 / 字段读取策略:

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

    【讨论】:

    • 优秀的答案@Bram,这很有效,帮助我了解发生了什么。
    猜你喜欢
    • 2018-12-15
    • 2021-02-01
    • 2020-03-09
    • 2019-07-29
    • 2020-06-19
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多