10月8日至10日加入我们,在纽约市学习关于 GraphQL 联盟和 API 平台工程的最新技巧、趋势和新闻。参加2024年纽约市的 GraphQL 大会
文档
免费开始
您正在查看此软件的早期版本文档。 切换到最新稳定版本。

监控缓存的请求

在响应缓存更改时更新您的UI


因为您的规范化缓存可以消除您的

当执行一个 时,您可以使用 ApolloCall.watch 方法在该相关缓存数据更改时自动通知该操作:

apolloClient.query(TodoDetailsQuery())
.watch()
.collect { response ->
// This code now executes on response *and*
// every time cached data changes
}

让我们看看一些示例。

监控查询

我们假设我们正在构建一个协作待办事项列表应用程序,该应用程序执行以下两个查询

# AllTodos.graphql
# Gets all todo items
query AllTodos {
items {
id
completed
title
}
}
# TodoDetails.graphql
# Gets one todo item's details
query TodoDetails($id: String!) {
item(id: $id) {
id
completed
title
content
}
}

应用的主体视图执行 AllTodos 查询以显示待办事项 Item 列表,包括每个项目的 标题完成状态。以下是一个示例响应:

{
"data": {
"items": [
{
"id": "0",
"title": "Write code for Apollo Kotlin 3",
"completed": true,
},
{
"id": "1",
"title": "Write documentation for Apollo Kotlin 3",
"completed": false,
}
]
}
}

当有人选择了用户界面中的特定项目时,应用执行 TodoDetails 来显示该项目的全部详情。由于这是一个 协作 待办事项列表,自执行 AllTodos (即另一个用户做出了更改) 之后,这些详情可能已在后端发生变更。

在这种情况下,TodoDetails 查询可能返回如下内容:

{
"data": {
"item": {
"id": "1",
"title": "Write documentation for Apollo Kotlin 3",
"completed": true,
"content": "Don't forget docs about the normalized cache!"
}
}
}

在具有 标准化缓存正确配置的缓存ID 的情况下,更新后的 Item 将自动与从 AllTodos 返回的 现有 缓存 Item 合并。 但是,我们的UI并不会自动更新以反映新的缓存数据。

要处理这个问题,我们在执行任何查询时可以调用 watch()

apolloClient.query(TodoDetailsQuery())
.watch()
.collect { response ->
// This code now executes on response *and*
// every time cached data changes
}

现在如果另一个 操作 更新了此查询的缓存 ,我们的UI将使用在查询最初返回时使用的相同逻辑进行渲染。

在突变后更新缓存

有时您需要更新缓存中的数据,以反映由一个造成的更改。

例如,在我们的待办事项列表应用程序中,用户可能会勾选已完成的项。这可能会执行以下变异以修改一个Item's completed 字段:

mutation SetTodoCompleted($id: String!, $completed: Boolean!) {
setTodocompleted(id: $id, completed: $completed) { # Returns the modified Item
id
}
}

按原样,此变异更新服务器上的completed 字段,但不在缓存中。这是因为变异's Item's completed 字段未包含在响应中。

要自动使用新值更新缓存,您需要请求响应中所有修改过的字段

mutation SetTodoCompleted($id: String!, $completed: Boolean!) {
setTodoCompleted(id: $id, completed: $completed) {
id
# Ask for `completed` to update the cache
completed
}
}

由于上面的 setTodoCompleted 字段返回一个同时包含 idcompleted 字段的 Item 类型,Apollo Kotlin 可以使用新数据更新缓存中的 Item 记录。此外,任何监听此 Itemcompleted 字段的观察者会自动收到通知。

乐观更新

通常可以在你的 GraphQL 服务器返回之前预测一个 变异 的最可能结果。Apollo Kotlin 可以利用这个 "最可能的结果" 来乐观地更新你的 UI,让你的应用对用户更加响应。

你可以这样使用 optimisticUpdates 方法提供乐观数据:

apolloClient.mutation(SetTodocompletedMutation(id = "1", completed = true))
.optimisticUpdates(
SetTodocompletedMutation.Data(
id = "1",
completed = true,
)
)
.execute()

这个乐观数据会立即写入缓存,并且任何对应数据的观察者都会收到通知。然后当操作返回时,缓存会再次更新任何变化,并且观察者会再次收到通知。如果乐观数据是正确的,第二次缓存更新对用户来说是不可见的,因为没有数据变化。

上一页
程序性缓存 ID
下一页
ApolloStore
评分文章评分在GitHub上编辑编辑论坛Discord

©2024Apollo Graph Inc.,别名Apollo GraphQL。

隐私政策

公司