首页 > 解决方案 > 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
}

有查询返回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'] } })

实现的主键字段Charactername字段,我需要使用它来将其值存储在缓存中。

在 Apollo 客户端 3 中,提到typePolicies用于定义keyFields类型。

因此,我需要询问是否应该为两种类型实现定义类型策略,在两种情况下都指定keyFieldsname

new InMemoryCache({ 
    possibleTypes: { Character: ['Human', 'Droid'] }, 
    typePolicies: { Human: { keyFields: ['name'] }, Droid: { keyFields: ['name'] } } 
});

在我的示例中,我只提供了 2 个这样的类型实现,但可以有n多个类型实现对应于Character接口。因此,在这种情况下,我将需要为所有类型实现定义keyFieldsas namein 。typePoliciesn

那么,有没有更好的方法来实现这些类型的实现缓存 interface

任何帮助将不胜感激。谢谢!!!

标签: graphqlapollo-client

解决方案


类型和字段策略的继承将在下一个小版本@apollo/clientv3.3 中出现!

您现在可以通过安装@apollo/client@3.3.0-beta.5.

要及时了解 v3.3 版本的最新进展,请参阅此拉取请求


推荐阅读