nuxt logo

Tradução da Documentação (Não Oficial)

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