将嵌套对象写入 Apollo 客户端缓存

Posted

技术标签:

【中文标题】将嵌套对象写入 Apollo 客户端缓存【英文标题】:Writing nested object to Apollo client cache 【发布时间】:2019-07-29 12:15:27 【问题描述】:

我正在尝试将嵌套对象写入 apollo 缓存,但它不起作用。简单的变量写入工作正常。我正在使用 Apollo-client v2.4

// Schema
const GET_DATA_FROM_CACHE = gql `
  name
  address
  age
`
// Reading data from cache
  render() 
    return (
    <Query query = GET_DATA_FROM_CACHE fetchPolicy = "cache-only">
      ( data ) => (
        <View >
          <Text> Name: data.name </Text>
        </View>
      )
    </Query>
   )
  
// THIS WORKS as I can see the name in my Text field

client.writeData(
  data: 
    name: 'mr x',
    age: 25
  
)
// THROWS ERROR: "cannot read property country of undefined"

client.writeData(
  data: 
    name: 'mr x',
    address: 
      country: 'y',
      city: 'z'
    ,
    age: 25
  
)

【问题讨论】:

请比“这不起作用”更具体。您是否在控制台中看到任何错误?当您的代码运行时,您实际看到的预期行为和意外行为是什么? 了解您如何查询此客户端状态以及您的 apollo 客户端配置是什么也可能会有所帮助,因为这些都是可能导致“不工作”的因素 我已经更新了 readQuery 部分。这是对缓存的非常简单的写入。我只是想为缓存中的应用添加一些默认值,以检查我以后是否可以将我的应用状态从 this.state= 推送到 apollo 缓存 【参考方案1】:

我遇到了这个问题,并通过确保在嵌套对象中包含具有适当值的 __typename 字段来解决它。例如:

client.writeData(
  data: 
    name: 'mr x',
    address: 
      id: 1,
      country: 'y',
      city: 'z',
      __typename: "Address"
    ,
    age: 25
  
)

我还要补充一点,最好包含一个“id”字段(除非您配置了getIdFromObject 选项)。 Apollo 的Cache Normalization section 有更多信息。

作为参考,我得到的错误是:

Invariant Violation:存储错误:应用程序试图写入 一个没有提供 id 但商店已经包含 id 的对象 此对象的 Typename:id。

【讨论】:

非常感谢。我在整个对象的数据中都有“__typename”,但没有单个嵌套对象的“__typename”。

以上是关于将嵌套对象写入 Apollo 客户端缓存的主要内容,如果未能解决你的问题,请参考以下文章

写入缓存时,Apollo 客户端链接状态“ 中缺少字段”?

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

缓存对象上的 Apollo 客户端查询重复数据删除

Apollo GraphQL,有没有办法在查询期间操作正在写入缓存的数据?

Apollo 从缓存中查询对象值

如何在 Apollo 客户端 InMemoryCache 中获取和设置新缓存的相关对象的引用?