Oro*_*dan 7 apollo apollo-client
我正在将使用 Apollo Client 的应用程序从 v2 升级到 v3,但找不到以下问题的正确解决方案。
我有一个产品的架构,在这个产品中,有一个价格。这个价格不是一个简单的数字,因为它包含免税价值、所有税金包括价值和增值税。
type Product {
id: ID
price: Price
}
type Price {
dutyFree: Float
allTaxesIncluded: Float
VAT: Float
}
Run Code Online (Sandbox Code Playgroud)
在 Apollo Client 2 中,只要没有明确的 id 或 _id 属性,InMemoryCache 就会根据对象的路径创建回退假标识符来规范数据。
在 Apollo Client 3 中,不再生成此后备假标识符。相反,您有两种选择来处理非规范化数据。第一个是使用新的 TypePolicy 选项并明确指示您收到的数据不应标准化。在这种情况下,数据将链接到父规范化数据。
文档:
未规范化的对象会嵌入到缓存中的父对象中。您不能直接访问这些对象,但可以通过它们的父对象访问它们。
new InMemoryCache({
typePolicies: {
Price {
keyFields: false
}
}
})
Run Code Online (Sandbox Code Playgroud)
都很开心,虽然我的问题解决了。好吧,错了......我可以在我的应用程序中创建一个产品并添加一个价格。但是,每当我更改现有价格时,都会收到以下警告:
替换 Product 对象的 price 字段时,缓存数据可能会丢失。
因为,当我在更新后获取我的 Product 时,InMemoryCache 不知道如何合并字段 Price 因为没有定义 id,这是非规范化数据的点。
我知道有第二个选项可以为我的 Product.price 字段显式定义合并函数,但这个例子是现实的一个更简单的版本。我通过多个类型为 Price 的对象有大量字段,并且为每个对象手动定义一个合并函数(即使通过外部化函数中的公共逻辑)是我发现效率非常低和错误的来源。
所以我的问题是:我对这个keyFields: false选项有什么误解,我可以做些什么来解决这个问题,而不必求助于在我的应用程序中为 50 多个字段定义合并函数?
谢谢您的帮助 :)
我不确定你是否误解了keyFields: false。我的理解是,当Product在缓存中更新时,InMemoryCache必须处理旧的和新的字段Price中嵌入的对象的任何差异。如果没有定义如何完成此操作,缓存会记录一条警告。priceProductProductTypePolicy
从 Apollo Client 3.3 开始,除了 fields 之外,merge还可以为类型定义函数。这是他们文档中的一个示例:
const cache = new InMemoryCache({
typePolicies: {
Book: {
fields: {
// No longer necessary!
// author: {
// merge: true,
// },
},
},
Author: {
merge: true,
},
},
});
Run Code Online (Sandbox Code Playgroud)
由于您不想逐个字段地定义合并函数,因此您可以尝试为该Price类型定义合并函数。
| 归档时间: |
|
| 查看次数: |
852 次 |
| 最近记录: |