如何解决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 举报,一经查实,本站将立刻删除。