将嵌套对象写入 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 GraphQL 客户端不会在查询中返回缓存的嵌套类型