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

有一个查询返回HumanDroid 类型作为响应。

响应可能包含以下内容:


  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 接口实现缓存?的主要内容,如果未能解决你的问题,请参考以下文章

用户认证后如何设置 Apollo 客户端?

如何将 localStorage 与 apollo-client 和 reactjs 一起使用?

如何为 Vue Apollo 导入 Apollo Client 3?

带有命名空间查询的 Apollo Client 3.0 缓存

如何在 Apollo Client React 中获取多个条件查询?

如何使用 Apollo Client 虚拟字段