使用 Apollo 缓存识别方法的最佳实践是什么?

问题描述 投票:0回答:1

根据官方文档 Apollo 的缓存 identify 方法用于获取缓存项的 id,因为该 id 可以是自定义的并且由不同字段组成。这很清楚。

为此,我们需要从缓存中接收一个项目,并将该项目传递到

cache.identify
并接收该项目 ID。

要获取缓存项,根据文档,我们有以下可能性:

  1. 读取查询
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,
   },
 });
  1. 读取片段
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。
但它们需要 ID,因此在执行其中任何一个时,必须知道

所以我想知道使用 cache.identify 的最佳实践是什么?

到目前为止,我知道这可能是唯一的 1 个用例。
update 回调中获取可能的缓存项 ID,该 ID 可用作仅更新 现有 项的突变的选项。后端可以返回带有修改后的对象的响应,并且可以将此对象传递到

cache.identify
以获取 ID 并将其进一步传递到适当的缓存更新方法中。但我不确定我是否正确,因此想向更有经验的 Apollo 开发人员澄清这一点。
这是 cache.identify 方法的唯一目的吗?

感谢您的帮助!

javascript apollo apollo-client react-apollo
1个回答
0
投票

所以第一种方法实际上不需要缓存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。该对象可以来自应用程序中的任何位置。在我们的示例中,我们只是从查询结果中选取它。

我希望这能澄清一些事情!

© www.soinside.com 2019 - 2024. All rights reserved.