useAsyncData
useAsyncData は、SSR フレンドリーなコンポーザブルで非同期に解決されるデータへのアクセスを提供します。
ページ、コンポーネント、プラグイン内で useAsyncData を使用して、非同期に解決されるデータにアクセスできます。
useAsyncData は、Nuxt コンテキスト内で直接呼び出されることを意図したコンポーザブルです。リアクティブなコンポーザブルを返し、応答を Nuxt ペイロードに追加して、ページがハイドレートされるときにクライアント側でデータを再フェッチすることなくサーバーからクライアントに渡せるように処理します。使用方法
app/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 は Vue の ref であり、<script setup> 内で使用する場合は .value でアクセスする必要があります。refresh/execute と clear はプレーンな関数です。ウォッチャー パラメーター
組み込みの watch オプションを使用すると、変更が検出されたときにフェッチャー関数を自動的に再実行できます。
app/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>
リアクティブキー
キーとして computed ref、プレーン ref、または getter 関数を使用でき、キーが変更されたときに自動的に更新される動的なデータフェッチングを可能にします。
app/pages/[id].vue
<script setup lang="ts">
const route = useRoute()
const userId = computed(() => `user-${route.params.id}`)
// When the route changes and userId updates, the data will be automatically refetched
const { data: user } = useAsyncData(
userId,
() => fetchUserById(route.params.id),
)
</script>
useAsyncData は、コンパイラによって変換される予約済みの関数名なので、自身の関数に useAsyncData という名前を付けないでください。パラメータ
key: リクエスト全体でデータフェッチングが適切に重複排除されるようにするためのユニークなキー。キーを指定しない場合、useAsyncDataインスタンスのファイル名と行番号に固有のキーが自動的に生成されます。handler: truthy な値を返す必要がある非同期関数 (たとえば、undefinedやnullであってはなりません)。そうでない場合、クライアント側でリクエストが重複する可能性があります。handler関数は、SSR および CSR のハイドレーション中に予測可能な動作を保証するために副作用がない必要があります。副作用をトリガーする必要がある場合は、callOnceユーティリティを使用してそれを行ってください。options:server: サーバーでデータをフェッチするかどうか (trueがデフォルト)lazy: クライアント側のナビゲーションをブロックする代わりに、ルートのロード後に非同期関数を解決するかどうか (falseがデフォルト)immediate:falseに設定すると、リクエストがすぐに発行されるのを防ぎます (trueがデフォルト)default: 非同期関数が解決する前にdataのデフォルト値を設定するためのファクトリ関数 -lazy: trueまたはimmediate: falseオプションと組み合わせて使用すると便利ですtransform: 解決後にhandler関数の結果を変更するために使用できる関数getCachedData: キャッシュされたデータを返す関数を提供します。nullまたはundefinedの戻り値はフェッチをトリガーします。デフォルトでは、これはconst getDefaultCachedData = (key, nuxtApp, ctx) => nuxtApp.isHydrating ? nuxtApp.payload.data[key] : nuxtApp.static.data[key]nuxt.configのexperimental.payloadExtractionが有効になっている場合にのみデータをキャッシュします。pick:handler関数の結果から、この配列で指定されたキーのみを選択します。watch: リアクティブソースを監視して自動更新します。deep: データをディープ ref オブジェクトで返します。データが深くリアクティブである必要がない場合、パフォーマンスを向上させるために、デフォルトではfalseに設定されており、シャロー ref オブジェクトでデータを返します。dedupe: 同じキーを同時に複数回フェッチするのを避けます (cancelがデフォルト)。可能なオプションは次のとおりです。cancel- 新しいリクエストが作成されると既存のリクエストをキャンセルします。defer- 保留中のリクエストがある場合、新しいリクエストをまったく行いません。
timeout- リクエストがタイムアウトするまで待機するミリ秒単位の数値 (undefinedがデフォルト。これはタイムアウトがないことを意味します)。
内部的には、
lazy: false は <Suspense> を使用して、データがフェッチされる前にルートのロードをブロックします。より軽快なユーザーエクスペリエンスのために、代わりに lazy: true を使用し、ローディング状態を実装することを検討してください。共有状態とオプションの一貫性
複数の useAsyncData 呼び出しで同じキーを使用すると、同じ data、error、status ref が共有されます。これにより、コンポーネント間の一貫性が保証されますが、オプションの一貫性が必要です。
次のオプションは、同じキーを持つすべての呼び出しで一貫している必要があります。
handler関数deepオプションtransform関数pick配列getCachedData関数default値
以下のオプションは、警告をトリガーすることなく異なる場合があります。
サーバーlazyimmediatededupewatch
// ❌ This will trigger a development warning
const { data: users1 } = useAsyncData('users', () => $fetch('/api/users'), { deep: false })
const { data: users2 } = useAsyncData('users', () => $fetch('/api/users'), { deep: true })
// ✅ This is allowed
const { data: users1 } = useAsyncData('users', () => $fetch('/api/users'), { immediate: true })
const { data: users2 } = useAsyncData('users', () => $fetch('/api/users'), { immediate: false })
useAsyncData を使用して作成されたキー付き状態は、useNuxtData を使用して Nuxt アプリケーション全体で取得できます。戻り値
data: 渡された非同期関数の結果。refresh/execute:handler関数によって返されたデータを更新するために使用できる関数。error: データフェッチが失敗した場合のエラーオブジェクト。status: データリクエストのステータスを示す文字列。idle: リクエストが開始されていない場合、たとえばexecuteがまだ呼び出されておらず、{ immediate: false }が設定されている場合- サーバーで HTML をレンダリングし、
{ server: false }が設定されている場合
pending: リクエストが進行中の場合success: リクエストが正常に完了した場合error: リクエストが失敗した場合
clear:dataをundefined(またはoptions.default()が提供されている場合はその値) に設定し、errorをundefinedに設定し、statusをidleに設定し、現在保留中のリクエストをキャンセル済みとしてマークするために使用できる関数。
デフォルトでは、Nuxt は refresh が完了するまで、再度実行されるのを待ちます。
サーバーでデータをフェッチしていない場合 (たとえば、
server: false を使用した場合)、ハイドレーションが完了するまでデータはフェッチされません。これは、クライアント側で useAsyncData を await しても、<script setup> 内の data は undefined のままになることを意味します。タイプ
署名
export function useAsyncData<DataT, DataE> (
handler: (nuxtApp: NuxtApp, options: { signal: AbortSignal }) => Promise<DataT>,
options?: AsyncDataOptions<DataT>
): AsyncData<DataT, DataE>
export function useAsyncData<DataT, DataE> (
key: MaybeRefOrGetter<string>,
handler: (nuxtApp: NuxtApp, options: { signal: AbortSignal }) => 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?: MultiWatchSources | false
getCachedData?: (key: string, nuxtApp: NuxtApp, ctx: AsyncDataRequestContext) => DataT | undefined
timeout?: number
}
type AsyncDataRequestContext = {
/** The reason for this data request */
cause: 'initial' | 'refresh:manual' | 'refresh:hook' | 'watch'
}
type AsyncData<DataT, ErrorT> = {
data: Ref<DataT | undefined>
refresh: (opts?: AsyncDataExecuteOptions) => Promise<void>
execute: (opts?: AsyncDataExecuteOptions) => Promise<void>
clear: () => void
error: Ref<ErrorT | undefined>
status: Ref<AsyncDataRequestStatus>
}
interface AsyncDataExecuteOptions {
dedupe?: 'cancel' | 'defer'
timeout?: number
signal?: AbortSignal
}
type AsyncDataRequestStatus = 'idle' | 'pending' | 'success' | 'error'