如何通过 ID 从 Apollo 缓存中读取嵌套对象?

Posted

技术标签:

【中文标题】如何通过 ID 从 Apollo 缓存中读取嵌套对象?【英文标题】:How can I read a nested object from Apollo cache by its ID? 【发布时间】:2020-10-25 15:44:27 【问题描述】:

我对 GraphQL 有点陌生,我正在使用 React 和 Apollo Client 构建一个应用程序。

当我的应用程序启动时,我在 React 应用程序的最顶层组件中使用一个 GraphQL 查询来获取我需要的几乎所有数据。在组件树更下方的组件中,我想通过其 ID 直接获取模型。我到底该怎么做?

例如说我最初的 gql 查询是:

query User($id: ID!) 
user(id: $id) 
  username
  todoLists 
    id
    title
    todoList 
      todoListId
      id
      name
      updatedAt
      todo 
        id
        title
        content
        updatedAt
      
    
  

然后我将如何通过本地缓存获取 ID 为 1 的待办事项?

当然我可以再次获取整个用户并映射到对象,但这似乎是错误的。

我尝试过使用 readQuery,但最后总是收到“找不到字段...”错误。我应该使用本地解析器吗?

什么是最佳做法?

非常感谢任何带有示例的提示。

【问题讨论】:

【参考方案1】:

有很多方法可以做到这一点,但推荐的方法是readFragment。

这需要您将查询的“待办事项”部分转换为片段,但这可能是您无论如何都想做的事情。

使用 Fragment 可以让 Apollo 明确指出“todo”是“todo”是“todo”,无论它出现在哪个查询中。readFragment / writeFragment 让您可以直接使用该“todo”,而无需担心关于它来自哪个查询或它需要写入哪个查询。

【讨论】:

以上是关于如何通过 ID 从 Apollo 缓存中读取嵌套对象?的主要内容,如果未能解决你的问题,请参考以下文章

从缓存graphql apollo 2.0读取数据

Apollo 可以从缓存中读取部分片段吗?

Apollo/GraphQL:如何获取嵌套元素?

Apollo GraphQL 客户端不会在查询中返回缓存的嵌套类型

Apollo 客户端 - 从缓存中读取

如何从 Apollo 缓存中查询没有 ROOT_QUERY 上的查询