# RequĂȘte intelligente
Chaque requĂȘte dĂ©clarĂ©e dans la dĂ©finition apollo
(c'est-Ă -dire, qui ne commence pas avec un signe $
) d'un composant donne lieu Ă la crĂ©ation d'une requĂȘte intelligente.
# Options
query
: document GraphQL (un fichier ou une chaĂźnegql
).variables
: un objet ou une fonction réactive qui retourne un objet. Chaque clé est mappée avec un'$'
dans le document GraphQL, par exemplefoo
devient$foo
.throttle
: régule les mises à jour des variables (en millisecondes).debounce
: stabilise les mises Ă jour des variables (en millisecondes).pollInterval
: mise Ă jour automatique en utilisant le polling (en requĂȘtant toutes lesx
millisecondes). Par défaut :undefined
,0
- arrĂȘt du polling.update(data) {return ...}
pour personnaliser la valeur qui est assignée dans la propriété Vue, par exemple si les noms de champs ne correspondent pas.result(ApolloQueryResult, key)
est un hook appelé lorsqu'un résultat est reçu (consultez la documentation de ApolloQueryResult (opens new window)).key
est la clĂ© de requĂȘte dans l'optionapollo
.error(error, vm, key, type, options)
est un hook appelé lorsqu'une erreur survient.error
est une erreur Apollo avec soit une propriétégraphQLErrors
ou bien une propriéténetworkError
.vm
est l'instance du composant correspondant.key
est la clĂ© de la requĂȘte intelligente.type
est soit'query'
ou'subscription'
.options
est l'objet d'optionswatchQuery
final.loadingKey
met Ă jour la propriĂ©tĂ© de donnĂ©e du composant passĂ©e en valeur. Vous devez initialiser cette propriĂ©tĂ© Ă0
dans le hookdata
du composant. Quand la requĂȘte charge, cette propriĂ©tĂ© est incrĂ©mentĂ©e de 1. Quand elle termine de charger, elle est dĂ©crĂ©mentĂ©e de 1. De cette façon, cette propriĂ©tĂ© peut servir de compteur des requĂȘtes en cours.watchLoading(isLoading, countModifier)
est un hook appelĂ© lorsque l'Ă©tat de chargement d'une requĂȘte change. Le paramĂštrecountModifier
est Ă©gal Ă1
quand la requĂȘte charge, ou-1
quand elle a terminé.manual
est un booléen qui permet de désactiver les mises à jour automatiques des propriétés. Si vous l'utilisez, vous devez spécifier une fonction de retourresult
(voir l'exemple ci-dessous).deep
est un booléen qui permet d'utiliserdeep: true
sur les observateurs Vue.skip
est un boolĂ©en ou une fonction (rĂ©active) qui retourne un boolĂ©en. La fonction reçoit le composant en cours et la clĂ© d'une requĂȘte intelligente en arguments, pour pouvoir ĂȘtre utilisĂ© dans$query
et dans lesdefaultOptions
d'ApolloProvider
.subscribeToMore
: un objet ou un tableau d'objets d'options subscribeToMore.prefetch
est soit un boolĂ©en, soit une fonction qui dĂ©termine si une requĂȘte doit ĂȘtre prĂ©-requĂȘtĂ©e. Consultez Rendu cĂŽtĂ© serveur (SSR).- Vous pouvez Ă©galement utiliser n'importe quelle autre option
watchQuery
options (consultez la documentation d'Apollo (opens new window)).
Exemple :
// Options spécifiques à Apollo
apollo: {
// RequĂȘte avancĂ©e avec des paramĂštres
// La méthode 'variables' est observée par Vue
pingMessage: {
query: gql`query PingMessage($message: String!) {
ping(message: $message)
}`,
// ParamÚtres réactifs
variables () {
// Utilisez des propriétés réactives Vue
return {
message: this.pingInput,
}
},
// Variables : observation imbriquée
deep: false,
// On utilise une fonction de retour personnalisée car
// les noms de champs ne correspondent pas
// Par défaurt, l'attribut 'pingMessage'
// serait utilisé sur l'objet de résultat 'data'
// Ici, nous savons que le résultat est dans l'attribut 'ping'
// sachant comment le serveur Apollo fonctionn
update (data) {
console.log(data)
// La valeur retournée met à jour
// la propriété Vue 'pingMessage'
return data.ping
},
// Hook de résultat optionnel
result ({ data, loading, networkStatus }) {
console.log('Nous avons des résultats !')
},
// Gestion d'erreur
error (error) {
console.error('Nous avons une erreur !', error)
},
// Ătat de chargement
// loadingKey est le nom de la propriété
// qui sera incrĂ©mentĂ©e quand la requĂȘte chargera
// et décrémentée lorsqu'elle sera terminée.
loadingKey: 'loadingQueriesCount',
// watchLoading est appelé quand l'état de chargement change
watchLoading (isLoading, countModifier) {
// isLoading est un booléen
// countModifier est soit 1 ou -1
},
},
},
Si vous utilisez ES2015
, vous pouvez Ă©galement Ă©crire update
de cette façon :
update: data => data.ping
Exemple en mode manuel :
{
query: gql`...`,
manual: true,
result ({ data, loading }) {
if (!loading) {
this.items = data.items
}
},
}
# Propriétés
# Skip
Vous pouvez mettre skip
en pause ou pas :
this.$apollo.queries.users.skip = true
# loading
Si la requĂȘte est en cours :
this.$apollo.queries.users.loading
# MĂ©thodes
# refresh
ArrĂȘte et reprend la requĂȘte :
this.$apollo.queries.users.refresh()
# start
DĂ©marre la requĂȘte :
this.$apollo.queries.users.start()
# stop
ArrĂȘte la requĂȘte :
this.$apollo.queries.users.stop()
# fetchMore
Charge plus de données pour la pagination :
this.page++
this.$apollo.queries.tagsPage.fetchMore({
// Nouvelles variables
variables: {
page: this.page,
pageSize,
},
// Transformation du résultat précédent avec de nouvelles données
updateQuery: (previousResult, { fetchMoreResult }) => {
const newTags = fetchMoreResult.tagsPage.tags
const hasMore = fetchMoreResult.tagsPage.hasMore
this.showMoreEnabled = hasMore
return {
tagsPage: {
__typename: previousResult.tagsPage.__typename,
// Union des tableaux de libellés
tags: [...previousResult.tagsPage.tags, ...newTags],
hasMore,
},
}
},
})
# subscribeToMore
Souscrire Ă plus de data en utilisant des souscription GraphQL :
// Nous devons nous désinscrire avant de souscrire à nouveau
if (this.tagsSub) {
this.tagsSub.unsubscribe()
}
// Souscription dans la requĂȘte
this.tagsSub = this.$apollo.queries.tags.subscribeToMore({
document: TAG_ADDED,
variables: {
type,
},
// Mutation du résultat précédent
updateQuery: (previousResult, { subscriptionData }) => {
// Si nous avons déjà ajouté le libellé, on ne fait rien
// Cela peut ĂȘtre causĂ© par `updateQuery` dans notre mutation addTag
if (previousResult.tags.find(tag => tag.id === subscriptionData.data.tagAdded.id)) {
return previousResult
}
return {
tags: [
...previousResult.tags,
// Ajout du nouveau libellé
subscriptionData.data.tagAdded,
],
}
},
})
# refetch
RequĂȘte Ă nouveau, potentiellement avec de nouvelles variables :
this.$apollo.queries.users.refetch()
// Avec de nouvelles variables
this.$apollo.queries.users.refetch({
friendsOf: 'id-user'
})
# setVariables
Met Ă jour les variables de la requĂȘte et l'exĂ©cute Ă nouveau si elle a changĂ©. Pour forcer une requĂȘte, vous pouvez utiliser refetch
.
this.$apollo.queries.users.setVariables({
friendsOf: 'id-uset'
})
# setOptions
Met Ă jour les options Apollo watchQuery (opens new window) et requĂȘte Ă nouveau :
this.$apollo.queries.users.setOptions({
fetchPolicy: 'cache-and-network'
})
# startPolling
Commence une mise Ă jour automatique en utilisant le polling (en requĂȘtant toutes les x
millisecondes) :
this.$apollo.queries.users.startPolling(2000) // millisecondes
# stopPolling
ArrĂȘt du polling :
this.$apollo.queries.users.stopPolling()
â ApolloSSR Souscription intelligente â