【问题标题】:Writing nested object to Apollo client cache将嵌套对象写入 Apollo 客户端缓存
【发布时间】: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 缓存

标签: javascript graphql apollo apollo-client


【解决方案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”。
猜你喜欢
  • 2020-05-02
  • 2020-03-09
  • 2019-07-12
  • 2017-03-18
  • 2021-02-01
  • 2021-04-21
  • 2020-11-03
  • 2021-06-10
相关资源
最近更新 更多