useFetch
SSRフレンドリーなコンポーザブルを使用して、APIエンドポイントからデータを取得します。
このコンポーザブルは、useAsyncData
と$fetch
の便利なラッパーを提供します。URLとフェッチオプションに基づいてキーを自動的に生成し、サーバールートに基づいてリクエストURLの型ヒントを提供し、APIレスポンスの型を推測します。
useFetch
は、setup関数、プラグイン、またはルートミドルウェアで直接呼び出すことを目的としたコンポーザブルです。リアクティブなコンポーザブルを返し、レスポンスをNuxtペイロードに追加して処理するため、ページがハイドレートされる際にクライアント側でデータを再フェッチすることなく、サーバーからクライアントにデータを転送できます。使用方法
pages/modules.vue
<script setup lang="ts">
const { data, status, error, refresh, clear } = await useFetch('/api/modules', {
pick: ['title']
})
</script>
カスタムのuseFetchラッパーを使用している場合は、コンポーザブル内でawaitしないでください。予期しない動作の原因となる可能性があります。カスタム非同期データフェッチャーの作成方法については、このレシピを参照してください。
data
、status
、error
はVueのrefであり、<script setup>
内で使用する場合.value
を使用してアクセスする必要があります。refresh
/execute
とclear
は通常の関数です。query
オプションを使用すると、クエリに検索パラメーターを追加できます。このオプションはunjs/ofetchから拡張されており、unjs/ufoを使用してURLを作成します。オブジェクトは自動的に文字列化されます。
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 }) {
// Set the request headers
// note that this relies on ofetch >= 1.4.0 - you may need to refresh your lockfile
options.headers.set('Authorization', '...')
},
onRequestError({ request, options, error }) {
// Handle the request errors
},
onResponse({ request, response, options }) {
// Process the response data
localStorage.setItem('token', response._data.token)
},
onResponseError({ request, response, options }) {
// Handle the response errors
}
})
useFetch
はコンパイラーによって変換される予約済みの関数名であるため、独自の関数をuseFetch
と名付けるべきではありません。useFetch
からデストラクトされたdata
変数がJSONパースされたオブジェクトではなく文字列を返す場合は、コンポーネントにimport { useFetch } from '@vueuse/core
のようなインポート文が含まれていないことを確認してください。ドキュメント > 例 > 高度な設定 > カスタムフェッチコンポーザブルの使用でライブ例を参照して編集できます。
ドキュメント > 例 > 機能 > データ取得でライブ例を参照して編集できます。
パラメーター
URL
: 取得するURL。オプション
(unjs/ofetchオプションとAsyncDataOptionsを拡張)method
: リクエストメソッド。query
: ufoを使用してURLにクエリ検索パラメーターを追加します。params
:query
のエイリアス。body
: リクエストボディ - (オブジェクトが渡された場合)自動的に文字列化されます。headers
: リクエストヘッダー。baseURL
: リクエストのベースURL。timeout
: リクエストを自動的に中止するミリ秒数。cache
: Fetch APIに従ってキャッシュ制御を処理します。- キャッシュを無効にするにはブール値を渡すことができます。または、
default
、no-store
、reload
、no-cache
、force-cache
、only-if-cached
のいずれかの値を渡すことができます。
- キャッシュを無効にするにはブール値を渡すことができます。または、
すべてのfetchオプションには、
computed
またはref
値を渡すことができます。これらは監視され、新しい値が更新されると、自動的に新しいリクエストが作成されます。オプション
(useAsyncData
から)key
: データ取得をリクエスト間で適切に重複排除できるようにするためのユニークなキー。指定されていない場合、URLとフェッチオプションに基づいて自動的に生成されます。server
: サーバーでデータを取得するかどうか(デフォルトはtrue
)。lazy
: クライアント側のナビゲーションをブロックするのではなく、ルートの読み込み後に非同期関数を解決するかどうか(デフォルトはfalse
)。immediate
:false
に設定すると、リクエストがすぐに実行されなくなります。(デフォルトはtrue
)。default
: 非同期関数が解決される前にdata
のデフォルト値を設定するためのファクトリー関数。lazy: true
またはimmediate: false
オプションと併用すると便利です。transform
: 解決後にhandler
関数の結果を変更するために使用できる関数。getCachedData
: キャッシュされたデータ返す関数を提供します。値が*null*または*undefined*の場合、フェッチがトリガーされます。デフォルトでは、key => nuxt.isHydrating ? nuxt.payload.data[key] : nuxt.static.data[key]
であり、payloadExtraction
が有効な場合にのみデータをキャッシュします。pick
:handler
関数の結果からこの配列内の指定されたキーのみを選択します。watch
: リアクティブなソースの配列を監視し、それらが変更されたときにフェッチ結果を自動的に更新します。フェッチオプションとURLはデフォルトで監視されます。watch: false
を使用して、リアクティブなソースを完全に無視できます。immediate: false
と組み合わせて使用することで、完全に手動のuseFetch
が可能です。(watch
の使用方法の例はこちらを参照してください)。deep
: 深いrefオブジェクトでデータ返す(デフォルトはtrue
)。データに深いリアクティブ性が不要な場合は、浅いrefオブジェクトでデータ返すようにfalse
に設定してパフォーマンスを向上させることができます。dedupe
: 同一のキーを一度に複数回フェッチすることを回避します(デフォルトはcancel
)。可能なオプションcancel
- 新しいリクエストが作成されると、既存のリクエストがキャンセルされます。defer
- 保留中のリクエストがある場合、新しいリクエストはまったく作成されません。
url
パラメーターとして関数またはrefを提供する場合、またはoptions
パラメーターに引数として関数を提供する場合、オプションが同一に見える場合でも、useFetch
呼び出しはコードベースの他のuseFetch
呼び出しと一致しません。options
で独自のキーを提供することで、一致を強制できます。開発環境で自己署名証明書を使用して(外部)HTTPS URLを呼び出すために
useFetch
を使用する場合は、環境変数にNODE_TLS_REJECT_UNAUTHORIZED=0
を設定する必要があります。戻り値
data
: 渡された非同期関数の結果。refresh
/execute
:handler
関数によって返されたデータを更新するために使用できる関数。error
: データ取得に失敗した場合のエラーオブジェクト。status
: データリクエストのステータスを示す文字列("idle"
、"pending"
、"success"
、"error"
)。clear
:data
をundefined
に設定し、error
をnull
に設定し、status
を'idle'
に設定し、現在保留中のリクエストをすべてキャンセル済みにマークする関数。
デフォルトでは、Nuxtはrefresh
が完了するまで、再度実行できません。
サーバー側でデータを取得していない場合(例:
server: false
)、データはハイドレーションが完了するまで取得されません。これは、クライアント側でuseFetch
をawaitしても、<script setup>
内ではdata
がnullのままになることを意味します。型
シグネチャ
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) => DataT
deep?: boolean
dedupe?: 'cancel' | 'defer'
default?: () => DataT
transform?: (input: DataT) => DataT | Promise<DataT>
pick?: string[]
watch?: WatchSource[] | false
}
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'