nuxt logo

Tradução da Documentação

useFetch

Buscar dados de um endpoint de API com um composable compatível com SSR.

Este composable fornece um wrapper conveniente em torno de useAsyncData e $fetch. Ele gera automaticamente uma chave com base na URL e nas opções de busca, fornece dicas de tipo para a URL da solicitação com base nas rotas do servidor e infere o tipo de resposta da API.

useFetch é um composable destinado a ser chamado diretamente em uma função de configuração, plugin ou middleware de rota. Ele retorna composables reativos e lida com a adição de respostas ao payload do Nuxt para que possam ser passadas do servidor para o cliente sem buscar novamente os dados no lado do cliente quando a página é hidratada.

Uso

pages/modules.vue
const { data, status, error, refresh, clear } = await useFetch('/api/modules', {
  pick: ['title']
})

Se você estiver usando um wrapper customizado de useFetch, não o aguarde no composable, pois isso pode causar comportamentos inesperados. Por favor, siga esta receita para mais informações sobre como criar um buscador de dados assíncrono personalizado.

data, status e error são refs do Vue, e devem ser acessados com .value quando usados dentro do <script setup>, enquanto refresh/execute e clear são funções simples.

Usando a opção query, você pode adicionar parâmetros de busca à sua consulta. Esta opção é estendida de unjs/ofetch e usa unjs/ufo para criar a URL. Objetos são automaticamente convertidos em strings.

const param1 = ref('value1')
const { data, status, error, refresh } = await useFetch('/api/modules', {
  query: { param1, param2: 'value2' }
})

O exemplo acima resulta em https://api.nuxt.com/modules?param1=value1&param2=value2.

Você também pode usar interceptores:

const { data, status, error, refresh, clear } = await useFetch('/api/auth/login', {
  onRequest({ request, options }) {
    // Defina os cabeçalhos da solicitação
    // note que isso depende do ofetch >= 1.4.0 - você pode precisar atualizar seu lockfile
    options.headers.set('Authorization', '...')
  },
  onRequestError({ request, options, error }) {
    // Lide com os erros da solicitação
  },
  onResponse({ request, response, options }) {
    // Processe os dados da resposta
    localStorage.setItem('token', response._data.token)
  },
  onResponseError({ request, response, options }) {
    // Lide com os erros da resposta
  }
})

Chaves Reativas e Estado Compartilhado

Você pode usar um ref computado ou um ref simples como a URL, permitindo a busca de dados dinâmica que atualiza automaticamente quando a URL muda:

pages/[id\
const route = useRoute()
const id = computed(() => route.params.id)

// Quando a rota muda e o id é atualizado, os dados serão automaticamente buscados novamente
const { data: post } = await useFetch(() => `/api/posts/${id.value}`)

Ao usar useFetch com a mesma URL e opções em vários componentes, eles compartilharão os mesmos refs data, error e status. Isso garante consistência entre os componentes.

useFetch é um nome de função reservado transformado pelo compilador, então você não deve nomear sua própria função como useFetch.

Se você encontrar a variável data desestruturada de um useFetch retornando uma string e não um objeto JSON analisado, certifique-se de que seu componente não inclua uma declaração de importação como import { useFetch } from '@vueuse/core.

Veja também 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 = {
  /** A razão para esta solicitação de dados */
  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): A URL ou solicitação a ser buscada. Pode ser uma string, um objeto Request, um ref do Vue ou uma função que retorna uma string/Request. Suporta reatividade para endpoints dinâmicos.

  • options (objeto): Configuração para a solicitação de busca. Estende as opções de unjs/ofetch e AsyncDataOptions. Todas as opções podem ser um valor estático, um ref ou um valor computado.

OpçãoTipoPadrãoDescrição
keystringauto-geradoChave única para desduplicação. Se não fornecida, gerada a partir da URL e opções.
methodstring'GET'Método de solicitação HTTP.
queryobject-Parâmetros de busca/consulta para anexar à URL. Alias: params. Suporta refs/computados.
paramsobject-Alias para query.
bodyRequestInit['body'] | Record<string, any>-Corpo da solicitação. Objetos são automaticamente convertidos em strings. Suporta refs/computados.
headersRecord<string, string> | [key, value][] | Headers-Cabeçalhos da solicitação.
baseURLstring-URL base para a solicitação.
timeoutnumber-Tempo limite em milissegundos para abortar a solicitação.
cacheboolean | string-Controle de cache. Booleano desativa o cache, ou use valores da API Fetch: default, no-store, etc.
serverbooleantrueSe deve buscar no servidor.
lazybooleanfalseSe verdadeiro, resolve após o carregamento da rota (não bloqueia a navegação).
immediatebooleantrueSe falso, impede que a solicitação seja disparada imediatamente.
default() => DataT-Fábrica para o valor padrão de data antes da resolução assíncrona.
transform(input: DataT) => DataT | Promise<DataT>-Função para transformar o resultado após a resolução.
getCachedData(key, nuxtApp, ctx) => DataT | undefined-Função para retornar dados em cache. Veja abaixo para o padrão.
pickstring[]-Apenas seleciona as chaves especificadas do resultado.
watchWatchSource[] | false-Array de fontes reativas para observar e atualizar automaticamente. false desativa a observação.
deepbooleanfalseRetorna dados em um objeto ref profundo.
dedupe'cancel' | 'defer''cancel'Evita buscar a mesma chave mais de uma vez ao mesmo tempo.
$fetchtypeof $fetch-Implementação personalizada de $fetch.

Todas as opções de busca podem receber um valor computed ou ref. Estes serão observados e novas solicitações feitas automaticamente com quaisquer novos valores se forem atualizados.

getCachedData padrão:

const getDefaultCachedData = (key, nuxtApp, ctx) => nuxtApp.isHydrating 
 ? nuxtApp.payload.data[key] 
 : nuxtApp.static.data[key]

Isso só armazena dados em cache quando experimental.payloadExtraction no nuxt.config está habilitado.

Valores de Retorno

NomeTipoDescrição
dataRef<DataT | null>O resultado da busca assíncrona.
refresh(opts?: AsyncDataExecuteOptions) => Promise<void>Função para atualizar manualmente os dados. Por padrão, o Nuxt espera até que um refresh seja concluído antes que possa ser executado novamente.
execute(opts?: AsyncDataExecuteOptions) => Promise<void>Alias para refresh.
errorRef<ErrorT | null>Objeto de erro se a busca de dados falhar.
statusRef<'idle' | 'pending' | 'success' | 'error'>Status da solicitação de dados. Veja abaixo para valores possíveis.
clear() => voidRedefine data para undefined (ou o valor de options.default() se fornecido), error para null, define status para idle e cancela quaisquer solicitações pendentes.

Valores de Status

  • idle: Solicitação não foi iniciada (por exemplo, { immediate: false } ou { server: false } na renderização do servidor)
  • pending: Solicitação está em andamento
  • success: Solicitação concluída com sucesso
  • error: Solicitação falhou

Se você não buscou dados no servidor (por exemplo, com server: false), então os dados não serão buscados até que a hidratação seja concluída. Isso significa que mesmo se você aguardar useFetch no lado do cliente, data permanecerá nulo dentro do <script setup>.

Exemplos

Editar e visualizar o código de exemploexamples > advanced > use-custom-fetch-composable
Editar e visualizar o código de exemploexamples > features > data-fetching