Apollo客户端3:如何在客户端上为graphql接口实现缓存?

时间:2020-09-24 20:40:08

标签: graphql apollo-client

在某些情况下,我有一个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接口相对应的类型实现。因此,在这种情况下,对于所有keyFields类型的实现,我都需要在name中将typePolicies定义为n

那么,使用这些interface实现类型的缓存是否有更好的方法呢?

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

1 个答案:

答案 0 :(得分:1)

Inheritance of type and field policies即将在@apollo/client v3.3的下一个次要版本中发布!

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

要及时了解v3.3版本的最新进展,请参见this pull request