Consultas
INFO
La fuente original (en ingles) de este tutorial se encuentra aquí
Conceptos Básicos de Consulta
Una consulta es una dependencia declarativa de una fuente de datos asincrónica que está vinculada a una clave única. Se puede utilizar una consulta con cualquier método basado en Promise (incluidos los métodos GET y POST) para recuperar datos de un servidor. Si su método modifica datos en el servidor, le recomendamos utilizar Mutaciones en su lugar.
Para suscribirse a una consulta en sus componentes o ganchos personalizados, llame al enlace useQuery con al menos:
- Una clave única para la consulta
- Una función que devuelve una promesa que:
- Resuelve los datos, o
- arroja un error
import { useQuery } from '@tanstack/vue-query'
const result = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })La clave única que proporciona se utiliza internamente para recuperar, almacenar en caché y compartir sus consultas en toda su aplicación.
El resultado de la consulta devuelto por useQuery contiene toda la información sobre la consulta que necesitará para crear plantillas y cualquier otro uso de los datos:
const result = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })El objeto result contiene algunos estados muy importantes que deberá conocer para ser productivo. Una consulta sólo puede estar en uno de los siguientes estados en un momento dado:
isPendingostatus === 'pending'- La consulta aún no tiene datosisErrorostatus === 'error'- La consulta encontró un errorisSuccessostatus === 'success'- La consulta fue exitosa y los datos están disponibles
Más allá de esos estados primarios, hay más información disponible según el estado de la consulta:
error: Si la consulta está en estadoisError, el error está disponible a través de la propiedaderror.data: Si la consulta está en estadoisSuccess, los datos están disponibles a través de la propiedaddata.isFetching: En cualquier estado, si la consulta se recupera en cualquier momento (incluida la recuperación en segundo plano),isFetchingserátrue.
Para la mayoría de las consultas, generalmente es suficiente verificar el estado isPending, luego el estado isError y, finalmente, asumir que los datos están disponibles y representar el estado exitoso:
<script setup>
import { useQuery } from '@tanstack/vue-query'
const { isPending, isError, data, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
})
</script>
<template>
<span v-if="isPending">Loading...</span>
<span v-else-if="isError">Error: {{ error.message }}</span>
<!-- We can assume by this point that `isSuccess === true` -->
<ul v-else-if="data">
<li v-for="todo in data" :key="todo.id">{{ todo.title }}</li>
</ul>
</template>Si los valores booleanos no son lo tuyo, siempre puedes usar también el status del estado:
<script setup>
import { useQuery } from '@tanstack/vue-query'
const { status, data, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
})
</script>
<template>
<span v-if="status === 'pending'">Loading...</span>
<span v-else-if="status === 'error'">Error: {{ error.message }}</span>
<!-- also status === 'success', but "else" logic works, too -->
<ul v-else-if="data">
<li v-for="todo in data" :key="todo.id">{{ todo.title }}</li>
</ul>
</template>TypeScript también limitará el tipo de data correctamente si ha verificado si hay pending y error antes de acceder a ellos.
FetchStatus
Además del campo status, también obtendrá una propiedad fetchStatus adicional con las siguientes opciones:
fetchStatus === 'fetching'- La consulta se está recuperando actualmente.fetchStatus === 'paused'- La consulta quería recuperarse, pero está en pausa. Lea más sobre esto en la guía Modo de Red.fetchStatus === 'idle'- La consulta no hace nada en este momento.
¿Por qué dos estados diferentes?
Las recuperaciones en segundo plano y la lógica obsoleta mientras se revalida hacen posibles todas las combinaciones de status y fetchStatus. Por ejemplo:
- una consulta en status
successgeneralmente estará en fetchStatusidle, pero también podría estar enfetchingsi se está realizando una recuperación en segundo plano. - una consulta que se monta y no tiene datos normalmente estará en status
pendingy fetchStatusfetching, pero también podría serpausedsi no hay conexión de red.
Por lo tanto, tenga en cuenta que una consulta puede estar en status pending sin obtener datos. Como una regla de oro:
- El
statusda información sobre ladata: ¿Tenemos alguna o no? - El
fetchStatusbrinda información sobrequeryFn: ¿Se está ejecutando o no?
