useAsyncData
useAsyncData fornece acesso a dados que são resolvidos de forma assíncrona em um composable amigável ao SSR.
Dentro de suas páginas, componentes e plugins, você pode usar useAsyncData para obter acesso a dados que são resolvidos de forma assíncrona.
useAsyncData
é um composable destinado a ser chamado diretamente no contexto do Nuxt. 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 recarregar os dados no lado do cliente quando a página é hidratada.
Uso
const { data, status, error, refresh, clear } = await useAsyncData(
'mountains',
() => $fetch('https://api.nuxtjs.dev/mountains')
)
Se você estiver usando um wrapper customizado de useAsyncData, 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.
Watch Params
A opção watch
embutida permite executar automaticamente a função de busca quando quaisquer alterações são detectadas.
const page = ref(1)
const { data: posts } = await useAsyncData(
'posts',
() => $fetch('https://fakeApi.com/posts', {
params: {
page: page.value
}
}), {
watch: [page]
}
)
Chaves Reativas
Você pode usar um ref computado, ref simples ou uma função getter como chave, permitindo a busca dinâmica de dados que atualiza automaticamente quando a chave muda:
const route = useRoute()
const userId = computed(() => `user-${route.params.id}`)
// Quando a rota muda e userId é atualizado, os dados serão automaticamente buscados novamente
const { data: user } = useAsyncData(
userId,
() => fetchUserById(route.params.id)
)
useAsyncData
é um nome de função reservado transformado pelo compilador, então você não deve nomear sua própria função como useAsyncData
.
Parâmetros
key
: uma chave única para garantir que a busca de dados possa ser devidamente desduplicada entre as requisições. Se você não fornecer uma chave, uma chave única para o nome do arquivo e número da linha da instância deuseAsyncData
será gerada para você.handler
: uma função assíncrona que deve retornar um valor verdadeiro (por exemplo, não deve serundefined
ounull
) ou a requisição pode ser duplicada no lado do cliente.
A função handler
deve ser livre de efeitos colaterais para garantir um comportamento previsível durante a hidratação SSR e CSR. Se você precisar acionar efeitos colaterais, use a utilidade callOnce
para fazê-lo.
options
:server
: se deve buscar os dados no servidor (padrão étrue
)lazy
: se deve resolver a função assíncrona após carregar a rota, em vez de bloquear a navegação no lado do cliente (padrão éfalse
)immediate
: quando definido comofalse
, impedirá que a requisição seja disparada imediatamente. (padrão étrue
)default
: uma função de fábrica para definir o valor padrão dosdata
, antes que a função assíncrona seja resolvida - útil com a opçãolazy: true
ouimmediate: false
transform
: uma função que pode ser usada para alterar o resultado da funçãohandler
após a resoluçãogetCachedData
: Forneça uma função que retorne dados em cache. Um valor de retornonull
ouundefined
acionará uma busca. Por padrão, isso é:
Que só armazena dados em cache quandoconst getDefaultCachedData = (key, nuxtApp, ctx) => nuxtApp.isHydrating ? nuxtApp.payload.data[key] : nuxtApp.static.data[key]
experimental.payloadExtraction
donuxt.config
está habilitado.pick
: escolha apenas chaves especificadas neste array do resultado da funçãohandler
watch
: observe fontes reativas para atualização automáticadeep
: retorne dados em um objeto ref profundo (étrue
por padrão). Pode ser definido comofalse
para retornar dados em um objeto ref raso, o que pode melhorar o desempenho se seus dados não precisarem ser profundamente reativos.dedupe
: evite buscar a mesma chave mais de uma vez ao mesmo tempo (padrão écancel
). Opções possíveis:cancel
- cancela requisições existentes quando uma nova é feitadefer
- não faz novas requisições se já houver uma pendente
Por baixo dos panos, lazy: false
usa <Suspense>
para bloquear o carregamento da rota antes que os dados sejam buscados. Considere usar lazy: true
e implementar um estado de carregamento para uma experiência de usuário mais ágil.
Estado Compartilhado e Consistência de Opções
Ao usar a mesma chave para múltiplas chamadas de useAsyncData
, elas compartilharão os mesmos refs data
, error
e status
. Isso garante consistência entre os componentes, mas requer consistência de opções.
As seguintes opções devem ser consistentes em todas as chamadas com a mesma chave:
- Função
handler
- Opção
deep
- Função
transform
- Array
pick
- Função
getCachedData
- Valor
default
As seguintes opções podem diferir sem acionar avisos:
server
lazy
immediate
dedupe
watch
// ❌ Isso acionará um aviso de desenvolvimento
const { data: users1 } = useAsyncData('users', () => $fetch('/api/users'), { deep: false })
const { data: users2 } = useAsyncData('users', () => $fetch('/api/users'), { deep: true })
// ✅ Isso é permitido
const { data: users1 } = useAsyncData('users', () => $fetch('/api/users'), { immediate: true })
const { data: users2 } = useAsyncData('users', () => $fetch('/api/users'), { immediate: false })
Valores de Retorno
data
: o resultado da função assíncrona que é passada.refresh
/execute
: uma função que pode ser usada para atualizar os dados retornados pela funçãohandler
.error
: um objeto de erro se a busca de dados falhar.status
: uma string indicando o status da requisição de dados:idle
: quando a requisição não foi iniciada, como:- quando
execute
ainda não foi chamado e{ immediate: false }
está definido - ao renderizar HTML no servidor e
{ server: false }
está definido
- quando
pending
: a requisição está em andamentosuccess
: a requisição foi concluída com sucessoerror
: a requisição falhou
clear
: uma função que pode ser usada para definirdata
comoundefined
(ou o valor deoptions.default()
se fornecido), definirerror
comonull
, definirstatus
comoidle
, e marcar quaisquer requisições pendentes como canceladas.
Por padrão, o Nuxt espera até que um refresh
seja concluído antes que possa ser executado novamente.
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 useAsyncData
no lado do cliente, data
permanecerá null
dentro do <script setup>
.
Tipo
function useAsyncData<DataT, DataE>(
handler: (nuxtApp?: NuxtApp) => Promise<DataT>,
options?: AsyncDataOptions<DataT>
): AsyncData<DataT, DataE>
function useAsyncData<DataT, DataE>(
key: string | Ref<string> | ComputedRef<string>,
handler: (nuxtApp?: NuxtApp) => Promise<DataT>,
options?: AsyncDataOptions<DataT>
): Promise<AsyncData<DataT, DataE>>
type AsyncDataOptions<DataT> = {
server?: boolean
lazy?: boolean
immediate?: boolean
deep?: boolean
dedupe?: 'cancel' | 'defer'
default?: () => DataT | Ref<DataT> | null
transform?: (input: DataT) => DataT | Promise<DataT>
pick?: string[]
watch?: WatchSource[] | false
getCachedData?: (key: string, nuxtApp: NuxtApp, ctx: AsyncDataRequestContext) => DataT | undefined
}
type AsyncDataRequestContext = {
/** A razão para esta requisiçã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'
※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-async-data