Pau*_*erg 2 apollo graphql apollo-client apollo-cache-inmemory
我阅读了有关与缓存数据交互的文档,虽然我了解如何cacheRedirects工作,但我有点困惑为什么首先需要它。这就是我问另一个问题的部分原因:Apollo 客户端是否缓存 React 中的嵌套对象?
我们知道数据很可能已经在客户端缓存中,但由于它是通过不同的查询请求的,Apollo 客户端并不知道这一点。
这是为什么?
为了清楚起见,复制粘贴文档中的示例:
query ListView {
books {
id
title
abstract
}
}
query DetailView {
book(id: $id) {
id
title
abstract
}
}
Run Code Online (Sandbox Code Playgroud)
Apollo 以标准化方式缓存接收到的数据。
如果您ListView返回的数据如下:
{
"data": {
"books": [
{
"id": 1,
"title" "ABC",
"__typename": "Book"
},
{
"id": 2,
"title" "DEF",
"__typename": "Book"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
id每本书都将存储在基于其和__typename( Book:1、Book:2等)的键下的缓存中。然后,该特定的缓存键列表与books根字段相关联。如果您books再次请求,Apollo 将看到缓存中已存在该查询,并将根据键列表重新创建结果。
如果books采用一些参数,则每组参数都被视为不同的缓存条目。books(onSale: true)可能会返回与 不同的一套书books(subject: "Computer Science")。每组缓存键都是单独存储的。如果您运行第一个查询,然后运行第二个查询,则第二个查询将是缓存未命中,并且仍会命中服务器。
同样,您可以有一个查询,它接受一些参数并返回一本书,例如book(id: 1). 然而,在所有这些例子中,阿波罗并不“理解”参数id和onSale是什么。这些参数与返回结果的关系是业务逻辑的一部分。Apollo“知道”的只是给定这个查询和这组参数,您将获得这个特定的对象或对象数组。
作为一个人,我可以从命名中推断出类似的查询book(id: 2)会返回一本 id 为 的书2。但是像 Apollo 这样的库无法准确推断该信息 - 它如何猜测字段的正确类型或者它返回单个对象而不是对象数组?就此而言,它如何推断id: 2出“Book where id = 2”?毕竟,实际的参数可以有多种方式:book(identifier: 2)、book(filter: { id: 2 })等等。
因此,我们用来cacheRedirects“教”Apollo 如何查找可能已经在我们的缓存中的数据。这有效地复制了通常驻留在服务器上的一些业务逻辑,但有助于我们避免对服务器的额外调用。
| 归档时间: |
|
| 查看次数: |
291 次 |
| 最近记录: |