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 deuseAsyncDataserá gerada para você.handler: uma função assíncrona que deve retornar um valor verdadeiro (por exemplo, não deve serundefinedounull) 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: trueouimmediate: falsetransform: uma função que pode ser usada para alterar o resultado da funçãohandlerapós a resoluçãogetCachedData: Forneça uma função que retorne dados em cache. Um valor de retornonullouundefinedacionará 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.payloadExtractiondonuxt.configestá habilitado.pick: escolha apenas chaves especificadas neste array do resultado da funçãohandlerwatch: observe fontes reativas para atualização automáticadeep: retorne dados em um objeto ref profundo (étruepor padrão). Pode ser definido comofalsepara 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:
serverlazyimmediatededupewatch
// ❌ 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
executeainda 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 definirdatacomoundefined(ou o valor deoptions.default()se fornecido), definirerrorcomonull, definirstatuscomoidle, 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