useFetch
Obtén datos de un endpoint de API con un composable compatible con SSR.
Este composable proporciona un envoltorio conveniente alrededor de useAsyncData
y $fetch
.
Genera automáticamente una clave basada en la URL y las opciones de fetch, proporciona sugerencias de tipo para la URL de solicitud basadas en rutas del servidor e infiere el tipo de respuesta de la API.
useFetch
es un composable que debe ser llamado directamente en una función de configuración, plugin o middleware de ruta. Devuelve composables reactivos y maneja la adición de respuestas al payload de Nuxt para que puedan ser pasadas del servidor al cliente sin volver a obtener los datos en el lado del cliente cuando la página se hidrata.
Uso
const { data, status, error, refresh, clear } = await useFetch('/api/modules', {
pick: ['title']
})
Si estás usando un envoltorio personalizado de useFetch, no lo esperes en el composable, ya que eso puede causar un comportamiento inesperado. Por favor, sigue esta receta para más información sobre cómo crear un fetch de datos asíncrono personalizado.
data
, status
y error
son referencias de Vue, y deben ser accedidas con .value
cuando se usan dentro de <script setup>
, mientras que refresh
/execute
y clear
son funciones simples.
Usando la opción query
, puedes agregar parámetros de búsqueda a tu consulta. Esta opción se extiende de unjs/ofetch y utiliza unjs/ufo para crear la URL. Los objetos se convierten automáticamente en cadenas.
const param1 = ref('value1')
const { data, status, error, refresh } = await useFetch('/api/modules', {
query: { param1, param2: 'value2' }
})
El ejemplo anterior resulta en https://api.nuxt.com/modules?param1=value1¶m2=value2
.
También puedes usar interceptores:
const { data, status, error, refresh, clear } = await useFetch('/api/auth/login', {
onRequest({ request, options }) {
// Establecer los encabezados de la solicitud
// nota que esto depende de ofetch >= 1.4.0 - puede que necesites actualizar tu archivo de bloqueo
options.headers.set('Authorization', '...')
},
onRequestError({ request, options, error }) {
// Manejar los errores de la solicitud
},
onResponse({ request, response, options }) {
// Procesar los datos de la respuesta
localStorage.setItem('token', response._data.token)
},
onResponseError({ request, response, options }) {
// Manejar los errores de la respuesta
}
})
Claves Reactivas y Estado Compartido
Puedes usar una referencia computada o una referencia simple como la URL, permitiendo la obtención de datos dinámica que se actualiza automáticamente cuando la URL cambia:
const route = useRoute()
const id = computed(() => route.params.id)
// Cuando la ruta cambia y el id se actualiza, los datos se volverán a obtener automáticamente
const { data: post } = await useFetch(() => `/api/posts/${id.value}`)
Cuando usas useFetch
con la misma URL y opciones en múltiples componentes, compartirán las mismas referencias data
, error
y status
. Esto asegura consistencia entre componentes.
useFetch
es un nombre de función reservado transformado por el compilador, por lo que no debes nombrar tu propia función useFetch
.
Si encuentras que la variable data
desestructurada de un useFetch
devuelve una cadena y no un objeto JSON analizado, asegúrate de que tu componente no incluya una declaración de importación como import { useFetch } from '@vueuse/core
.
Tipo
function useFetch<DataT, ErrorT>(
url: string | Request | Ref<string | Request> | (() => string | Request),
options?: UseFetchOptions<DataT>
): Promise<AsyncData<DataT, ErrorT>>
type UseFetchOptions<DataT> = {
key?: string
method?: string
query?: SearchParams
params?: SearchParams
body?: RequestInit['body'] | Record<string, any>
headers?: Record<string, string> | [key: string, value: string][] | Headers
baseURL?: string
server?: boolean
lazy?: boolean
immediate?: boolean
getCachedData?: (key: string, nuxtApp: NuxtApp, ctx: AsyncDataRequestContext) => DataT | undefined
deep?: boolean
dedupe?: 'cancel' | 'defer'
default?: () => DataT
transform?: (input: DataT) => DataT | Promise<DataT>
pick?: string[]
watch?: WatchSource[] | false
}
type AsyncDataRequestContext = {
/** La razón para esta solicitud de datos */
cause: 'initial' | 'refresh:manual' | 'refresh:hook' | 'watch'
}
type AsyncData<DataT, ErrorT> = {
data: Ref<DataT | null>
refresh: (opts?: AsyncDataExecuteOptions) => Promise<void>
execute: (opts?: AsyncDataExecuteOptions) => Promise<void>
clear: () => void
error: Ref<ErrorT | null>
status: Ref<AsyncDataRequestStatus>
}
interface AsyncDataExecuteOptions {
dedupe?: 'cancel' | 'defer'
}
type AsyncDataRequestStatus = 'idle' | 'pending' | 'success' | 'error'
Parámetros
-
URL
(string | Request | Ref<string | Request> | () => string | Request
): La URL o solicitud a obtener. Puede ser una cadena, un objeto Request, una referencia de Vue o una función que devuelve una cadena/Request. Soporta reactividad para endpoints dinámicos. -
options
(objeto): Configuración para la solicitud de fetch. Extiende las opciones de unjs/ofetch yAsyncDataOptions
. Todas las opciones pueden ser un valor estático, unaref
o un valor computado.
Opción | Tipo | Predeterminado | Descripción |
---|---|---|---|
key | string | auto-gen | Clave única para la desduplicación. Si no se proporciona, se genera a partir de la URL y las opciones. |
method | string | 'GET' | Método de solicitud HTTP. |
query | object | - | Parámetros de búsqueda/consulta para agregar a la URL. Alias: params . Soporta refs/computed. |
params | object | - | Alias para query . |
body | RequestInit['body'] | Record<string, any> | - | Cuerpo de la solicitud. Los objetos se convierten automáticamente en cadenas. Soporta refs/computed. |
headers | Record<string, string> | [key, value][] | Headers | - | Encabezados de la solicitud. |
baseURL | string | - | URL base para la solicitud. |
timeout | number | - | Tiempo de espera en milisegundos para abortar la solicitud. |
cache | boolean | string | - | Control de caché. Booleano desactiva la caché, o usa valores de la API Fetch: default , no-store , etc. |
server | boolean | true | Si se debe obtener en el servidor. |
lazy | boolean | false | Si es verdadero, se resuelve después de que la ruta se carga (no bloquea la navegación). |
immediate | boolean | true | Si es falso, evita que la solicitud se dispare inmediatamente. |
default | () => DataT | - | Fábrica para el valor predeterminado de data antes de que se resuelva asíncronamente. |
transform | (input: DataT) => DataT | Promise<DataT> | - | Función para transformar el resultado después de resolver. |
getCachedData | (key, nuxtApp, ctx) => DataT | undefined | - | Función para devolver datos en caché. Ver abajo para el predeterminado. |
pick | string[] | - | Solo selecciona claves especificadas del resultado. |
watch | WatchSource[] | false | - | Array de fuentes reactivas para observar y auto-refrescar. false desactiva la observación. |
deep | boolean | false | Devuelve datos en un objeto de referencia profunda. |
dedupe | 'cancel' | 'defer' | 'cancel' | Evita obtener la misma clave más de una vez a la vez. |
$fetch | typeof $fetch | - | Implementación personalizada de $fetch. |
Todas las opciones de fetch pueden recibir un valor computed
o ref
. Estos serán observados y se realizarán nuevas solicitudes automáticamente con cualquier nuevo valor si se actualizan.
getCachedData predeterminado:
const getDefaultCachedData = (key, nuxtApp, ctx) => nuxtApp.isHydrating
? nuxtApp.payload.data[key]
: nuxtApp.static.data[key]
Esto solo almacena en caché los datos cuando experimental.payloadExtraction
en nuxt.config
está habilitado.
Valores de Retorno
Nombre | Tipo | Descripción |
---|---|---|
data | Ref<DataT | null> | El resultado del fetch asíncrono. |
refresh | (opts?: AsyncDataExecuteOptions) => Promise<void> | Función para refrescar manualmente los datos. Por defecto, Nuxt espera hasta que un refresh se complete antes de que pueda ejecutarse nuevamente. |
execute | (opts?: AsyncDataExecuteOptions) => Promise<void> | Alias para refresh . |
error | Ref<ErrorT | null> | Objeto de error si la obtención de datos falló. |
status | Ref<'idle' | 'pending' | 'success' | 'error'> | Estado de la solicitud de datos. Ver abajo para posibles valores. |
clear | () => void | Restablece data a undefined (o el valor de options.default() si se proporciona), error a null , establece status a idle y cancela cualquier solicitud pendiente. |
Valores de Estado
idle
: La solicitud no ha comenzado (por ejemplo,{ immediate: false }
o{ server: false }
en renderizado del servidor)pending
: La solicitud está en progresosuccess
: La solicitud se completó con éxitoerror
: La solicitud falló
Si no has obtenido datos en el servidor (por ejemplo, con server: false
), entonces los datos no se obtendrán hasta que la hidratación se complete. Esto significa que incluso si esperas useFetch
en el lado del cliente, data
permanecerá nulo dentro de <script setup>
.
Ejemplos
※Esta página es una traducción no oficial de la documentación oficial de Nuxt.js.
La página correspondiente en la documentación oficial está aquí:
https://nuxt.com/docs/3.x/api/composables/use-fetch