useFetch
SSR 친화적인 composable을 사용하여 API 엔드포인트에서 데이터를 가져옵니다.
이 composable은 useAsyncData
와 $fetch
를 편리하게 감싸는 래퍼를 제공합니다. URL과 fetch 옵션에 기반하여 자동으로 키를 생성하고, 서버 경로에 기반한 요청 URL에 대한 타입 힌트를 제공하며, API 응답 타입을 추론합니다.
useFetch
는 setup 함수, 플러그인, 또는 라우트 미들웨어에서 직접 호출되도록 설계된 composable입니다. 이는 반응형 composable을 반환하고, 페이지가 하이드레이션될 때 클라이언트 측에서 데이터를 다시 가져오지 않고 서버에서 클라이언트로 응답을 전달하는 것을 처리합니다.
사용법
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에 의존하므로, lockfile을 새로 고쳐야 할 수 있습니다.
options.headers.set('Authorization', '...')
},
onRequestError({ request, options, error }) {
// 요청 오류 처리
},
onResponse({ request, response, options }) {
// 응답 데이터 처리
localStorage.setItem('token', response._data.token)
},
onResponseError({ request, response, options }) {
// 응답 오류 처리
}
})
반응형 키와 공유 상태
URL로 계산된 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'
와 같은 import 문이 포함되어 있지 않은지 확인하십시오.
타입
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): fetch 요청에 대한 구성. unjs/ofetch 옵션과AsyncDataOptions
를 확장합니다. 모든 옵션은 정적 값,ref
, 또는 계산된 값일 수 있습니다.
Option | Type | Default | Description |
---|---|---|---|
key | string | auto-gen | 중복 제거를 위한 고유 키. 제공되지 않으면 URL과 옵션에서 생성됩니다. |
method | string | 'GET' | HTTP 요청 메서드. |
query | object | - | URL에 추가할 쿼리/검색 매개변수. 별칭: params . refs/computed를 지원합니다. |
params | object | - | query 의 별칭. |
body | RequestInit['body'] | Record<string, any> | - | 요청 본문. 객체는 자동으로 문자열로 변환됩니다. refs/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 구현. |
모든 fetch 옵션은 computed
또는 ref
값으로 제공될 수 있습니다. 이들은 감시되며, 업데이트될 경우 자동으로 새로운 요청이 이루어집니다.
getCachedData 기본값:
const getDefaultCachedData = (key, nuxtApp, ctx) => nuxtApp.isHydrating
? nuxtApp.payload.data[key]
: nuxtApp.static.data[key]
이는 nuxt.config
에서 experimental.payloadExtraction
이 활성화된 경우에만 데이터를 캐시합니다.
반환 값
Name | Type | Description |
---|---|---|
data | Ref<DataT | null> | 비동기 fetch의 결과. |
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