gpt4 book ai didi

apollo - 在 Apollo Client 3 中合并非规范化数据时出现 "Cache data may be lost"警告

转载 作者:行者123 更新时间:2023-12-04 11:33:44 26 4
gpt4 key购买 nike

我正在使用 Apollo Client 将我的应用程序从 v2 升级到 v3,但我找不到以下问题的正确解决方案。
我有一个产品的架构,在这个产品中,有一个价格。这个价格不是一个简单的数字,因为它包含免税值(value)、所有税金包括值(value)和增值税。

type Product {
id: ID
price: Price
}

type Price {
dutyFree: Float
allTaxesIncluded: Float
VAT: Float
}
在 Apollo Client 2 中,只要没有明确的 id 或 _id 属性,InMemoryCache 就会根据对象的路径创建后备假标识符来规范数据。
在 Apollo Client 3 中,不再生成此后备假标识符。相反,您有两种选择来处理非规范化数据。第一个是使用新的 TypePolicy 选项并明确指示您收到的数据不应标准化。在这种情况下,数据将链接到父规范化数据。
文档:

Objects that are not normalized are instead embedded within their parent object in the cache. You can't access these objects directly, but you can access them via their parent.

new InMemoryCache({
typePolicies: {
Price {
keyFields: false
}
}
})
都很开心,虽然我的问题解决了。好吧,错了......我可以在我的应用程序中创建一个产品并添加一个价格。但是,每当我更改现有价格时,都会收到以下警告:

Cache data may be lost when replacing the price field of a Product object.


因为,当我在更新后获取我的 Product 时,InMemoryCache 不知道如何合并字段 Price 因为没有定义 id,这是非规范化数据的点。
我知道有第二个选项可以为我的 Product.price 字段显式定义合并函数,但这个例子是现实的一个更简单的版本。我通过多个类型为 Price 的对象有大量字段,并且为每个对象手动定义一个合并函数(即使通过外部化函数中的公共(public)逻辑)是我发现效率非常低和错误的来源。
所以我的问题是:我对 keyFields: false 有什么误解?选项,我可以做些什么来解决这个问题,而不必求助于在我的应用程序中为 50 多个字段定义合并函数?
谢谢您的帮助 :)

最佳答案

我不确定你是否误解了 keyFields: false .我的理解是,当Product在缓存中更新,InMemoryCache必须处理 Price 中的任何差异嵌入在 price 中的对象老场Product和新 Product .如果没有 TypePolicy为了定义应该如何完成,缓存会记录警告。
从 Apollo Client 3.3 开始,merge功能可以是defined for types in addition to fields .这是他们文档中的一个示例:

const cache = new InMemoryCache({
typePolicies: {
Book: {
fields: {
// No longer necessary!
// author: {
// merge: true,
// },
},
},

Author: {
merge: true,
},
},
});
由于您不想逐个字段地定义合并函数,您可以尝试为 Price 定义合并函数。改为键入。

关于apollo - 在 Apollo Client 3 中合并非规范化数据时出现 "Cache data may be lost"警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63584507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com