graphql - Apollo Client 3:如何在客户端为 graphql 接口实现缓存?
问题描述
我有一个案例,我有一个interface
,它type
在 graphql 中定义了不同的实现。我可能无法分享确切的代码。但这个案子看起来像:
interface Character {
name: String!
}
type Human implements Character {
name: String!
friends: [Character]
}
type Droid implements Character {
name: String!
material: String
}
有查询返回Human
或Droid
输入响应。
响应可能包含以下内容:
{
name: 'Human_01',
friends: []
__typename: 'Human'
}
或者
{
name: 'Droid_01',
material: 'Aluminium'
__typename: 'Droid'
}
我在客户端使用 Apollo Client 3 来查询数据并有如下片段:
fragment Human on Human {
friends
}
fragment Droid on Droid {
material
}
fragment Character on Character {
name
...Human
...Droid
}
我正在查询Character
数据:
character {
...Character
}
既然是这种情况interface
,并且正如 Apollo 客户端 3 的文档中所定义的那样,我们需要使用possibleTypes
它来匹配这种情况下的片段。出于缓存目的,我将 InMemoryCache 定义为:
new InMemoryCache({ possibleTypes: { Character: ['Human', 'Droid'] } })
实现的主键字段Character
是name
字段,我需要使用它来将其值存储在缓存中。
在 Apollo 客户端 3 中,提到typePolicies
用于定义keyFields
类型。
因此,我需要询问是否应该为两种类型实现定义类型策略,在两种情况下都指定keyFields
为name
:
new InMemoryCache({
possibleTypes: { Character: ['Human', 'Droid'] },
typePolicies: { Human: { keyFields: ['name'] }, Droid: { keyFields: ['name'] } }
});
在我的示例中,我只提供了 2 个这样的类型实现,但可以有n
多个类型实现对应于Character
接口。因此,在这种情况下,我将需要为所有类型实现定义keyFields
as name
in 。typePolicies
n
那么,有没有更好的方法来实现这些类型的实现缓存 interface
?
任何帮助将不胜感激。谢谢!!!
解决方案
类型和字段策略的继承将在下一个小版本@apollo/client
v3.3 中出现!
您现在可以通过安装@apollo/client@3.3.0-beta.5
.
要及时了解 v3.3 版本的最新进展,请参阅此拉取请求。
推荐阅读
- java - 在mybatis中使用$ vs #
- javascript - 如何更改此 iframe 的大小?
- java - 方法 publishProgress 必须从工作线程调用,目前推断线程为主线程
- windows - 无法从沙箱中重命名文件
- gcloud - 我们可以使用 gmail 帐户一次性登录多个 gcloud 项目吗?
- android - Kotlin 多平台:集成引用托管 git 存储库的 cocoapods?
- node.js - 编写一个打印“Hello World!”的nodejs程序 作为应用程序所有路由的输出
- javascript - 向数组添加常用对象和格式
- node.js - ExpressJS 中的 API 错误处理和数据验证
- c# - 使用 travis 和 sonarcloud 分析 c# 项目给出“没有代码行”