根据官方文档 Apollo 的缓存 identify 方法用于获取缓存项的 id,因为该 id 可以是自定义的并且由不同字段组成。这很清楚。
为此,我们需要从缓存中接收一个项目,并将该项目传递到
cache.identify
并接收该项目 ID。
要获取缓存项,根据文档,我们有以下可能性:
const READ_TODO = gql`
query ReadTodo($id: ID!) {
todo(id: $id) {
id
text
completed
}
}
`;
// Fetch the cached to-do item with ID 5
const { todo } = client.readQuery({
query: READ_TODO,
variables: {
id: 5,
},
});
const todo = client.readFragment({
id: 'Todo:5', // The value of the to-do item's cache ID
fragment: gql`
fragment MyTodo on Todo {
id
text
completed
}
`,
});
这些方法将从缓存中返回一个项目,我们可以进一步将其传递到
cache.identify
中以接收 ID。 所以我想知道使用 cache.identify 的最佳实践是什么?
到目前为止,我知道这可能是唯一的 1 个用例。
在 update 回调中获取可能的缓存项 ID,该 ID 可用作仅更新 现有 项的突变的选项。后端可以返回带有修改后的对象的响应,并且可以将此对象传递到
cache.identify
以获取 ID 并将其进一步传递到适当的缓存更新方法中。但我不确定我是否正确,因此想向更有经验的 Apollo 开发人员澄清这一点。 感谢您的帮助!
所以第一种方法实际上不需要缓存ID。
正如您所提到的,可以根据您的配置自定义缓存 ID。默认情况下,它使用
__typename
和 id
。所以在你的例子中它将是Todo:5
。
假设您的缓存 ID 基于字段
[id, completed]
。缓存 ID 将类似于 Todo:{"id": "idFromBackEnd", "completed": true}
。 更多这里。
readFragment
功能需要此缓存ID。 更多这里。
但是当你使用
readQuery
时,它不需要缓存ID,而只需要一个你用来查询后端的字符串。 ID
行中的query ReadTodo($id: ID!)
是一个标量,实际上与String
相同,它只是帮助我们作为开发人员知道我们应该期望它是唯一的。 更多这里。
因此,根据
readQuery
的结果,您可以使用 cache.identify
来查找确切的缓存 ID。
所以它看起来像这样:
const { todo } = client.readQuery({
query: READ_TODO,
variables: {
id: 5,
},
});
const todoFragment = client.readFragment({
id: client.cache.identify(todo) // it will figure out the cache Id,
fragment: gql`
fragment MyTodo on Todo {
id
text
completed
}
`,
});
cache.identify
的目的严格来说是根据对象查找缓存ID。该对象可以来自应用程序中的任何位置。在我们的示例中,我们只是从查询结果中选取它。
我希望这能澄清一些事情!