# 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 exemplefoodevient$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 lesxmillisecondes). 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)).keyest la clĂ© de requĂȘte dans l'optionapollo.error(error, vm, key, type, options)est un hook appelĂ© lorsqu'une erreur survient.errorest une erreur Apollo avec soit une propriĂ©tĂ©graphQLErrorsou bien une propriĂ©tĂ©networkError.vmest l'instance du composant correspondant.keyest la clĂ© de la requĂȘte intelligente.typeest soit'query'ou'subscription'.optionsest l'objet d'optionswatchQueryfinal.loadingKeymet Ă jour la propriĂ©tĂ© de donnĂ©e du composant passĂ©e en valeur. Vous devez initialiser cette propriĂ©tĂ© Ă0dans le hookdatadu 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ĂštrecountModifierest Ă©gal Ă1quand la requĂȘte charge, ou-1quand elle a terminĂ©.manualest 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).deepest un boolĂ©en qui permet d'utiliserdeep: truesur les observateurs Vue.skipest 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$queryet dans lesdefaultOptionsd'ApolloProvider.subscribeToMore: un objet ou un tableau d'objets d'options subscribeToMore.prefetchest 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
watchQueryoptions (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 â