nuxt logo

Traducción de Documentación (No Oficial)

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

pages/modules.vue
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&param2=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:

pages/[id\
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.

Ver también getting-started > data-fetching

Tipo

Signature
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 y AsyncDataOptions. Todas las opciones pueden ser un valor estático, una ref o un valor computado.

OpciónTipoPredeterminadoDescripción
keystringauto-genClave única para la desduplicación. Si no se proporciona, se genera a partir de la URL y las opciones.
methodstring'GET'Método de solicitud HTTP.
queryobject-Parámetros de búsqueda/consulta para agregar a la URL. Alias: params. Soporta refs/computed.
paramsobject-Alias para query.
bodyRequestInit['body'] | Record<string, any>-Cuerpo de la solicitud. Los objetos se convierten automáticamente en cadenas. Soporta refs/computed.
headersRecord<string, string> | [key, value][] | Headers-Encabezados de la solicitud.
baseURLstring-URL base para la solicitud.
timeoutnumber-Tiempo de espera en milisegundos para abortar la solicitud.
cacheboolean | string-Control de caché. Booleano desactiva la caché, o usa valores de la API Fetch: default, no-store, etc.
serverbooleantrueSi se debe obtener en el servidor.
lazybooleanfalseSi es verdadero, se resuelve después de que la ruta se carga (no bloquea la navegación).
immediatebooleantrueSi 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.
pickstring[]-Solo selecciona claves especificadas del resultado.
watchWatchSource[] | false-Array de fuentes reactivas para observar y auto-refrescar. false desactiva la observación.
deepbooleanfalseDevuelve datos en un objeto de referencia profunda.
dedupe'cancel' | 'defer''cancel'Evita obtener la misma clave más de una vez a la vez.
$fetchtypeof $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

NombreTipoDescripción
dataRef<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.
errorRef<ErrorT | null>Objeto de error si la obtención de datos falló.
statusRef<'idle' | 'pending' | 'success' | 'error'>Estado de la solicitud de datos. Ver abajo para posibles valores.
clear() => voidRestablece 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 progreso
  • success: La solicitud se completó con éxito
  • error: 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

Editar y previsualizar el código de ejemploexamples > advanced > use-custom-fetch-composable
Editar y previsualizar el código de ejemploexamples > features > data-fetching