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
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¶m2=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:
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
.
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 = {
/** 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 eAsyncDataOptions
. Todas as opções podem ser um valor estático, umref
ou um valor computado.
Opção | Tipo | Padrão | Descrição |
---|---|---|---|
key | string | auto-gerado | Chave única para desduplicação. Se não fornecida, gerada a partir da URL e opções. |
method | string | 'GET' | Método de solicitação HTTP. |
query | object | - | Parâmetros de busca/consulta para anexar à URL. Alias: params . Suporta refs/computados. |
params | object | - | Alias para query . |
body | RequestInit['body'] | Record<string, any> | - | Corpo da solicitação. Objetos são automaticamente convertidos em strings. Suporta refs/computados. |
headers | Record<string, string> | [key, value][] | Headers | - | Cabeçalhos da solicitação. |
baseURL | string | - | URL base para a solicitação. |
timeout | number | - | Tempo limite em milissegundos para abortar a solicitação. |
cache | boolean | string | - | Controle de cache. Booleano desativa o cache, ou use valores da API Fetch: default , no-store , etc. |
server | boolean | true | Se deve buscar no servidor. |
lazy | boolean | false | Se verdadeiro, resolve após o carregamento da rota (não bloqueia a navegação). |
immediate | boolean | true | Se 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. |
pick | string[] | - | Apenas seleciona as chaves especificadas do resultado. |
watch | WatchSource[] | false | - | Array de fontes reativas para observar e atualizar automaticamente. false desativa a observação. |
deep | boolean | false | Retorna dados em um objeto ref profundo. |
dedupe | 'cancel' | 'defer' | 'cancel' | Evita buscar a mesma chave mais de uma vez ao mesmo tempo. |
$fetch | typeof $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
Nome | Tipo | Descrição |
---|---|---|
data | Ref<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 . |
error | Ref<ErrorT | null> | Objeto de erro se a busca de dados falhar. |
status | Ref<'idle' | 'pending' | 'success' | 'error'> | Status da solicitação de dados. Veja abaixo para valores possíveis. |
clear | () => void | Redefine 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 andamentosuccess
: Solicitação concluída com sucessoerror
: 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
※Esta página é uma tradução não oficial da documentação oficial do Nuxt.js.
A página correspondente na documentação oficial está aqui:
https://nuxt.com/docs/3.x/api/composables/use-fetch