如何解决如何配置 apollo 缓存以根据其父主键唯一标识子元素
为没有自己的 ID 但在其父级结构中唯一的子数组字段配置 apollo 缓存规范化的正确方法是什么?
假设我们有以下架构:
type Query {
clients: [Client!]!
}
type Client {
clientId: ID
name: String!
events: [Events!]!
}
type Events {
month: String!
year: Int!
day: Int!
clients: [Client!]!
}
起初我以为我可以使用多个 keyFields
来实现这样的唯一标识符:
const createCache = () => new InMemoryCache({
typePolicies: {
Event: {
keyFields: ['year','month','name'],},});
每天的活动永远不会超过 1 个,因此可以肯定地说,根据日期,该活动对于客户来说是独一无二的
但是创建的缓存条目缺少 clientId
(在缓存键中),因此无法区分同一日期但针对不同客户端的 2 个事件
是否有适当的方法为这种关系配置 typePolicies
?
例如可以将键字段设置为使用subfield:
const cache = new InMemoryCache({
typePolicies: {
Book: {
keyFields: ["title","author",["name"]],});
上面的 Book 类型使用一个子字段作为其主键的一部分。 ["name"] 项表示数组(作者)中前一个字段的名称字段是主键的一部分。 Book 的 author 字段必须是一个包含名称字段的对象才能使其有效。
就我而言,我想使用父字段作为主键的一部分
解决方法
如果您无法添加唯一的事件 ID,则回退是 disable normalization:
未规范化的对象会嵌入到缓存中的父对象中。您无法直接访问这些对象,但可以通过其父对象访问它们。
为此,您将 keyFields
设置为 false
:
const createCache = () => new InMemoryCache({
typePolicies: {
Event: {
keyFields: false
},},});
基本上每个 Event
对象都将存储在其父 Client
对象下的缓存中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。