Apollo Client 3: Comment implémenter la mise en cache côté client pour les interfaces graphql?
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
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 .