Apollo Client 3: Comment implémenter la mise en cache côté client pour les interfaces graphql?

Sep 25 2020

J'ai un cas où j'ai un interface, qui a différentes typeimplémentations définies dans graphql. Je ne pourrai peut-être pas partager le code exact. Mais l'affaire ressemble à quelque chose comme:

interface Character {
  name: String!
}
type Human implements Character {
  name: String!
  friends: [Character]
}

type Droid implements Character {
  name: String!
  material: String
}

Il y a une requête qui retourne Humanou Droidsaisit la réponse.

La réponse peut contenir quelque chose comme:

{
  name: 'Human_01',
  friends: []
  __typename: 'Human'
}

ou

{
  name: 'Droid_01',
  material: 'Aluminium'
  __typename: 'Droid'
}

J'utilise Apollo Client 3 côté client pour interroger les données et j'ai des fragments pour ceux-ci comme:

fragment Human on Human {
 friends
}

fragment Droid on Droid {
 material
}

fragment Character on Character {
  name
  ...Human
  ...Droid
}


Je demande les Characterdonnées en tant que:

 character {
  ...Character
 }

Puisque c'est le cas de interface, et tel que défini dans la documentation pour Apollo client 3, nous devons utiliser possibleTypespour faire correspondre les fragments dans de tels cas. À des fins de mise en cache, j'ai défini InMemoryCache comme:

new InMemoryCache({ possibleTypes: { Character: ['Human', 'Droid'] } })

Le champ de clé primaire pour une Characterimplémentation est le namechamp, que je dois utiliser pour stocker sa valeur dans le cache.

Dans Apollo client 3, il est mentionné à utiliser typePoliciespour définir keyFieldsun type.

Donc, je dois demander si je devrais définir, type politique pour les deux implémentations de type, en spécifiant keyFieldscomme namedans les deux cas comme:

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

Dans mon exemple, je n'ai fourni que 2 implémentations de type de ce type mais il peut y avoir un ncertain nombre d'implémentations de type correspondant à l' Characterinterface. Donc, dans ce cas , je vais devoir définir keyFieldscomme namedans typePoliciespour toutes les nimplémentations de type.

Alors, existe-t-il un meilleur moyen d'implémenter la mise en cache avec ces types d' interfaceimplémentations?

Toute aide serait vraiment appréciée. Merci!!!

Réponses

1 Ben Sep 28 2020 at 21:56

L'héritage des politiques de type et de champ arrive dans la prochaine version mineure de @apollo/client, v3.3!

Vous pouvez l'essayer maintenant en installant @apollo/[email protected].

Pour rester à jour sur la progression de la version v3.3, consultez cette demande d'extraction .