useFetch
SSRに優しいComposableでAPIエンドポイントからデータを取得します。
このComposableは、useAsyncData
と$fetch
の便利なラッパーを提供します。URLとフェッチオプションに基づいてキーを自動生成し、サーバールートに基づいてリクエストURLの型ヒントを提供し、APIレスポンスタイプを推測します。
useFetch
は、セットアップ関数、プラグイン、またはルートミドルウェアで直接呼び出すことを意図したComposableです。リアクティブなComposableを返し、ページがハイドレートされる際にクライアント側でデータを再フェッチすることなく、サーバーからクライアントにレスポンスを渡すためにNuxtペイロードにレスポンスを追加する処理を行います。
使用法
const { data, status, error, refresh, clear } = await useFetch('/api/modules', {
pick: ['title']
})
カスタムのuseFetchラッパーを使用している場合、Composable内でそれをawaitしないでください。予期しない動作を引き起こす可能性があります。カスタム非同期データフェッチャーの作成方法についてはこのレシピを参照してください。
data
、status
、error
はVueのrefであり、<script setup>
内で使用する際には.value
でアクセスする必要があります。一方、refresh
/execute
とclear
は通常の関数です。
query
オプションを使用すると、クエリに検索パラメータを追加できます。このオプションはunjs/ofetchから拡張されており、URLの作成にはunjs/ufoを使用しています。オブジェクトは自動的に文字列化されます。
const param1 = ref('value1')
const { data, status, error, refresh } = await useFetch('/api/modules', {
query: { param1, param2: 'value2' }
})
上記の例はhttps://api.nuxt.com/modules?param1=value1¶m2=value2
となります。
また、インターセプターを使用することもできます:
const { data, status, error, refresh, clear } = await useFetch('/api/auth/login', {
onRequest({ request, options }) {
// リクエストヘッダーを設定
// これはofetch >= 1.4.0に依存していることに注意 - ロックファイルを更新する必要があるかもしれません
options.headers.set('Authorization', '...')
},
onRequestError({ request, options, error }) {
// リクエストエラーを処理
},
onResponse({ request, response, options }) {
// レスポンスデータを処理
localStorage.setItem('token', response._data.token)
},
onResponseError({ request, response, options }) {
// レスポンスエラーを処理
}
})
リアクティブキーと共有状態
URLとしてcomputed refまたは通常のrefを使用することで、URLが変更されると自動的に更新される動的なデータフェッチが可能です:
const route = useRoute()
const id = computed(() => route.params.id)
// ルートが変更されidが更新されると、データは自動的に再フェッチされます
const { data: post } = await useFetch(() => `/api/posts/${id.value}`)
同じURLとオプションで複数のコンポーネントでuseFetch
を使用する場合、それらは同じdata
、error
、status
のrefを共有します。これにより、コンポーネント間での一貫性が確保されます。
useFetch
はコンパイラによって変換される予約関数名であるため、自分の関数をuseFetch
と名付けないでください。
useFetch
からデストラクトされたdata
変数が文字列であり、JSON解析されたオブジェクトでない場合は、コンポーネントにimport { useFetch } from '@vueuse/core'
のようなインポート文が含まれていないことを確認してください。
型
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 = {
/** このデータリクエストの理由 */
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'
パラメータ
-
URL
(string | Request | Ref<string | Request> | () => string | Request
): フェッチするURLまたはリクエスト。文字列、Requestオブジェクト、Vueのref、または文字列/Requestを返す関数で指定可能。動的エンドポイントのリアクティビティをサポート。 -
options
(object): フェッチリクエストの設定。unjs/ofetchオプションとAsyncDataOptions
を拡張。すべてのオプションは静的値、ref
、またはcomputed値にできる。
オプション | 型 | デフォルト | 説明 |
---|---|---|---|
key | string | 自動生成 | 重複排除のためのユニークキー。指定しない場合、URLとオプションから生成されます。 |
method | string | 'GET' | HTTPリクエストメソッド。 |
query | object | - | URLに追加するクエリ/検索パラメータ。エイリアス: params 。ref/computedをサポート。 |
params | object | - | query のエイリアス。 |
body | RequestInit['body'] | Record<string, any> | - | リクエストボディ。オブジェクトは自動的に文字列化されます。ref/computedをサポート。 |
headers | Record<string, string> | [key, value][] | Headers | - | リクエストヘッダー。 |
baseURL | string | - | リクエストのベースURL。 |
timeout | number | - | リクエストを中止するまでのタイムアウト(ミリ秒)。 |
cache | boolean | string | - | キャッシュ制御。Booleanでキャッシュを無効化、またはFetch APIの値を使用: default , no-store など。 |
server | boolean | true | サーバーでフェッチするかどうか。 |
lazy | boolean | false | trueの場合、ルートがロードされた後に解決(ナビゲーションをブロックしない)。 |
immediate | boolean | true | falseの場合、リクエストが即座に発火するのを防ぎます。 |
default | () => DataT | - | 非同期解決前のdata のデフォルト値のファクトリー。 |
transform | (input: DataT) => DataT | Promise<DataT> | - | 解決後の結果を変換する関数。 |
getCachedData | (key, nuxtApp, ctx) => DataT | undefined | - | キャッシュされたデータを返す関数。デフォルトは以下を参照。 |
pick | string[] | - | 結果から指定されたキーのみを選択。 |
watch | WatchSource[] | false | - | リアクティブなソースの配列を監視して自動リフレッシュ。false で監視を無効化。 |
deep | boolean | false | データを深いrefオブジェクトで返す。 |
dedupe | 'cancel' | 'defer' | 'cancel' | 同じキーを一度に複数回フェッチしないようにする。 |
$fetch | typeof $fetch | - | カスタム$fetch実装。 |
すべてのフェッチオプションはcomputed
またはref
値を与えることができます。これらは監視され、更新されると新しいリクエストが自動的に行われます。
getCachedDataのデフォルト:
const getDefaultCachedData = (key, nuxtApp, ctx) => nuxtApp.isHydrating
? nuxtApp.payload.data[key]
: nuxtApp.static.data[key]
これはnuxt.config
でexperimental.payloadExtraction
が有効な場合にのみデータをキャッシュします。
戻り値
名前 | 型 | 説明 |
---|---|---|
data | Ref<DataT | null> | 非同期フェッチの結果。 |
refresh | (opts?: AsyncDataExecuteOptions) => Promise<void> | データを手動でリフレッシュするための関数。デフォルトでは、Nuxtはrefresh が終了するまで再実行を待ちます。 |
execute | (opts?: AsyncDataExecuteOptions) => Promise<void> | refresh のエイリアス。 |
error | Ref<ErrorT | null> | データフェッチが失敗した場合のエラーオブジェクト。 |
status | Ref<'idle' | 'pending' | 'success' | 'error'> | データリクエストのステータス。可能な値は以下を参照。 |
clear | () => void | data をundefined (または提供された場合はoptions.default() の値)にリセットし、error をnull に設定し、status をidle に設定し、保留中のリクエストをキャンセルします。 |
ステータス値
idle
: リクエストが開始されていない(例:{ immediate: false }
またはサーバーレンダリングで{ server: false }
)pending
: リクエストが進行中success
: リクエストが正常に完了error
: リクエストが失敗
サーバーでデータをフェッチしていない場合(例えば、server: false
を使用している場合)、データはハイドレーションが完了するまでフェッチされません。つまり、クライアントサイドでuseFetch
をawaitしても、<script setup>
内ではdata
はnullのままです。
例
※このページは Nuxt.js 公式ドキュメントの翻訳ページ(非公式)です。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/api/composables/use-fetch