Apollo Client 3:如何在客户端为 graphql 接口实现缓存?
Posted
技术标签:
【中文标题】Apollo Client 3:如何在客户端为 graphql 接口实现缓存?【英文标题】:Apollo Client 3: How to implement caching on client side for graphql interfaces? 【发布时间】:2021-01-11 04:44:22 【问题描述】:我有一个interface
的情况,它在graphql 中定义了不同的type
实现。我可能无法分享确切的代码。但是这个案例看起来像:
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
接口。因此,在这种情况下,我需要在 typePolicies
中为所有 n
类型实现将 keyFields
定义为 name
。
那么,有没有更好的方法来实现这些类型的interface
实现缓存?
任何帮助将不胜感激。谢谢!!!
【问题讨论】:
【参考方案1】:Inheritance of type and field policies 将出现在 @apollo/client
的下一个次要版本 v3.3 中!
您现在可以通过安装@apollo/client@3.3.0-beta.5
来试用它。
要及时了解 v3.3 版本的最新进展,请参阅this pull request。
【讨论】:
感谢您的帮助! ??一定会看看这个!以上是关于Apollo Client 3:如何在客户端为 graphql 接口实现缓存?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 localStorage 与 apollo-client 和 reactjs 一起使用?
如何为 Vue Apollo 导入 Apollo Client 3?
带有命名空间查询的 Apollo Client 3.0 缓存