useFetch
This composable provides a convenient wrapper around useAsyncData
and $fetch
.
It automatically generates a key based on URL and fetch options, provides type hints for request url based on server routes, and infers API response type.
function useFetch( url: string | Request | Ref<string | Request> | () => string | Request, options?: UseFetchOptions<DataT>): Promise<AsyncData<DataT>>type UseFetchOptions = { key?: string method?: string params?: SearchParams body?: RequestInit['body'] | Record<string, any> headers?: { key: string, value: string }[] baseURL?: string server?: boolean lazy?: boolean immediate?: boolean default?: () => DataT transform?: (input: DataT) => DataT pick?: string[] watch?: WatchSource[] initialCache?: boolean}type AsyncData<DataT> = { data: Ref<DataT> pending: Ref<boolean> refresh: (opts?: { override?: boolean }) => Promise<void> execute: () => Promise<void> error: Ref<Error | boolean>}
method
: Request method.params
: Query params.body
: Request body - automatically stringified (if an object is passed).headers
: Request headers.baseURL
: Base URL for the request.useAsyncData
):key
: a unique key to ensure that data fetching can be properly de-duplicated across requests, if not provided, it will be generated based on the static code location where useAyncData
is used.server
: Whether to fetch the data on the server (defaults to true
).default
: A factory function to set the default value of the data, before the async function resolves - particularly useful with the lazy: true
option.pick
: Only pick specified keys in this array from the handler
function result.watch
: watch reactive sources to auto-refresh.initialCache
: When set to false
, will skip payload cache for initial fetch (defaults to true
).transform
: A function that can be used to alter handler
function result after resolving.immediate
: When set to false
, will prevent the request from firing immediately. (defaults to true
)url
parameter, or if you provide functions as arguments to the options
parameter, then the useFetch
call will not match other useFetch
calls elsewhere in your codebase, even if the options seem to be identical. If you wish to force a match, you may provide your own key in options
.handler
function.By default, Nuxt waits until a refresh
is finished before it can be executed again.
server: false
), then the data will not be fetched until hydration completes. This means even if you await useFetch
on client-side, data
will remain null within <script setup>
.const { data, pending, error, refresh } = await useFetch('https://api.nuxtjs.dev/mountains',{ pick: ['title']})
Using interceptors:
const { data, pending, error, refresh } = await useFetch('/api/auth/login', { onRequest({ request, options }) { // Set the request headers options.headers = options.headers || {} options.headers.authorization = '...' }, onRequestError({ request, options, error }) { // Handle the request errors }, onResponse({ request, response, options }) { // Process the response data return response._data }, onResponseError({ request, response, options }) { // Handle the response errors }})