J'ai besoin d'aide pour comprendre ce qu'est une approche générale sur les abonnements et la mise à jour en temps réel. J'ai une application React Native et j'utilise le service Apollo et Graphcool comme backend.Comment approcher les abonnements dans l'application React
Il existe plusieurs scénarios dans lesquels l'utilisateur qui regarde l'application reçoit une notification push indiquant que quelque chose a changé. Naturellement, les données de l'écran doivent également être mises à jour. Les abonnements sont un candidat évident pour ce travail et je l'ai fait fonctionner essentiellement.
J'ai un abonnement comme celui-ci qui fonctionne très bien seul (utilisé pour positionner les avatars du joueur sur google map).
subscription PlayerMap($gameId: ID) {
Game(filter: { mutation_in: [CREATED, UPDATED], node: { id: $gameId } }) {
node {
players {
id
character {
id
name
}
user {
id
latitude
longitude
}
}
}
}
}
Ensuite, il y a un autre écran d'application exécutant une mutation createPlayer
avec refetchQueries
d'Apollo (pour simplifier) qui exécute cette requête pour mettre à jour des choses.
query GameCharacters($gameId: ID!) {
Game(id: $gameId) {
players {
id
character {
id
name
}
}
}
}
Maintenant, lorsque cela est terminé, la requête d'abonnement (qui est toujours actif sur un autre écran) obtient également mis à jour, mais pour une raison tout noeud Game
manque dans l'objet data
.
Pour la gestion des abonnements, j'ai un composant comme celui-ci. Je peux ensuite l'utiliser simplement comme ceci avec un motif de rendu de rendu.
const OrgMapScreen = ({ gameId, data: initialData }: Props) => (
<Subscriber
data={initialData}
query={OrgMapSubscription}
variables={{ gameId }}
shouldResubscribe={(nextData, prevData) => nextData.Game !== prevData.Game}
>
{({ Game }) => {
const markers = Game.players.map(makePlayerMarker)
return <MapScreen mapProps={{ markers }} />
}}
</Subscriber>
)
Je suis plutôt confus pourquoi cela se produit-il. Y at-il une façon recommandée de gérer des choses comme ça? Peut-être au lieu de refetchQueries
je devrais mettre en place un autre abonnement pour GameCharacters
aussi?
Yeah s'avère que 'updateQuery' est un peu nécessaire. Je ne sais pas pourquoi j'ai eu l'impression qu'Apollo explorerait le résultat lui-même et mettrait à jour le magasin en fonction des types et de 'dataIdFromObject'. Tant pis. J'ai dû utiliser 'immutable-helper' pour une structure profondément imbriquée comme la mienne, mais cela semble fonctionner maintenant. Merci – FredyC