useAsyncData
useAsyncData предоставляет доступ к данным, которые разрешаются асинхронно, в композабле, соответствующем серверному рендерингу (SSR).
Вы можете использовать useAsyncData на страницах, в компонентах и плагинах, чтобы получить доступ к данным, которые разрешаются асинхронно.
useAsyncData
это композабл, предназначенный для вызова непосредственно в Nuxt context. Этот метод возвращает реактивные композаблы и обрабатывает добавление ответов в Nuxt payload, чтобы они могли быть переданы от сервера к клиенту без повторной загрузки данных на клиенте при гидратации страницы.Использование
pages/index.vue
<script setup lang="ts">
const { data, status, error, refresh, clear } = await useAsyncData(
'mountains',
() => $fetch('https://api.nuxtjs.dev/mountains')
)
</script>
Если вы используете пользовательскую обертку
useAsyncData
, не используйте await внутри нее, так как это может привести к неожиданному поведению. Пожалуйста, следуйте этому рецепту для получения дополнительной информации о том, как сделать пользовательскую асинхронную функцию для получения данных.data
, status
и error
являются ref
, и они должны быть получены с помощью .value
при использовании внутри <script setup>
, в то время как refresh
/execute
и clear
являются обычными функциями.Наблюдение за параметрами
Встроенный параметр watch
позволяет автоматически повторно выполнять функцию-загрузчик при обнаружении любых изменений.
pages/index.vue
<script setup lang="ts">
const page = ref(1)
const { data: posts } = await useAsyncData(
'posts',
() => $fetch('https://fakeApi.com/posts', {
params: {
page: page.value
}
}), {
watch: [page]
}
)
</script>
useAsyncData
- это зарезервированное имя функции, преобразованное компилятором, поэтому вам не следует называть свою собственную функцию useAsyncData
.Параметры
key
: уникальный ключ, который гарантирует, что получение данных может быть правильно дедуплицировано между запросами. Если вы не предоставляете ключ, то ключ, уникальный для имени файла и номера строки экземпляраuseAsyncData
, будет сгенерирован для вас.handler
: асинхронная функция, которая должна возвращать истинное значение (например, она не должна бытьundefined
илиnull
), иначе запрос может быть дублирован на клиенте.options
:server
: параметр, определяющий, следует ли получать данные на сервере (по умолчаниюtrue
)lazy
: параметр, определяющий, следует ли разрешать асинхронную функцию после загрузки маршрута, вместо блокировки навигации на клиенте. (по умолчаниюfalse
)immediate
: если установить значениеfalse
, это предотвратит немедленное выполнение запроса. (по умолчаниюtrue
)default
: функция-фабрика для установки значения по умолчанию для data перед тем, как асинхронная функция будет разрешена. Это полезно при использовании параметровlazy: true
илиimmediate: false
.transform
: функция, которая может быть использована для изменения результата функции-обработчика после ее разрешения.getCachedData
: функция, которая возвращает кэшированные данные. Возвращаемое значение null или undefined будет вызывать выборку данных. По умолчанию это:key => nuxt.isHydrating ? nuxt.payload.data[key] : nuxt.static.data[key]
, которая кэширует данные, только если включеноpayloadExtraction
.pick
: выбрать из результата функцииhandler
только указанные ключи в этом массивеwatch
: следить за реактивными источниками для автоматического обновленияdeep
: возвращать данные в виде глубокого ref-объекта. Можно установить значениеfalse
, чтобы возвращать данные в виде объекта с неглубокой реактивностью, что может повысить производительность, если ваши данные не нуждаются в этом.dedupe
: избегайте получения одного и того же ключа более одного раза за раз (по умолчаниюcancel
). Возможные параметры:cancel
- отменяет существующие запросы при поступлении новогоdefer
- вообще не делает новых запросов, если есть отложенный запрос
Под капотом
lazy: false
использует <Suspense>
для блокировки загрузки маршрута до того, как данные будут получены. Рассмотрите возможность использования lazy: true
и реализации состояния загрузки вместо этого для более быстрого пользовательского опыта.Вы можете использовать
useLazyAsyncData
, чтобы получить то же поведение, что и lazy: true
с useAsyncData
.Узнайте, как использовать
transform
и getCachedData
, чтобы избежать лишних обращений к API и кэшировать данные для посетителей на клиенте.Возвращаемые значения
data
: результат работы переданной асинхронной функции.refresh
/execute
: функция, которая может быть использована для обновления данных, возвращенных функциейhandler
.error
: объект ошибки, если получение данных не удалось.status
: строка, указывающая на статус запроса данных ("idle"
,"pending"
,"success"
,"error"
).clear
: функция, которая установитdata
вundefined
,error
вnull
,pending
вfalse
,status
вidle
, и отметит любые текущие ожидающие запросы как отмененные.
По умолчанию Nuxt ждет, пока refresh
не будет завершен, прежде чем его можно будет выполнить снова.
Если вы не извлекали данные на сервере (например, с
server: false
), то данные не будут извлечены до завершения гидратации. Это означает, что даже если вы ожидаете useAsyncData
на стороне клиента, data
останется null
внутри <script setup>
.Тип
Signature
function useAsyncData<DataT, DataE>(
handler: (nuxtApp?: NuxtApp) => Promise<DataT>,
options?: AsyncDataOptions<DataT>
): AsyncData<DataT, DataE>
function useAsyncData<DataT, DataE>(
key: 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[]
getCachedData?: (key: string, nuxtApp: NuxtApp) => DataT
}
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'