nuxt logo

문서 번역(비공식)

useFetch

SSR 친화적인 composable을 사용하여 API 엔드포인트에서 데이터를 가져옵니다.

이 composable은 useAsyncData$fetch를 편리하게 감싸는 래퍼를 제공합니다. URL과 fetch 옵션에 기반하여 자동으로 키를 생성하고, 서버 경로에 기반한 요청 URL에 대한 타입 힌트를 제공하며, API 응답 타입을 추론합니다.

useFetch는 setup 함수, 플러그인, 또는 라우트 미들웨어에서 직접 호출되도록 설계된 composable입니다. 이는 반응형 composable을 반환하고, 페이지가 하이드레이션될 때 클라이언트 측에서 데이터를 다시 가져오지 않고 서버에서 클라이언트로 응답을 전달하는 것을 처리합니다.

사용법

pages/modules.vue
const { data, status, error, refresh, clear } = await useFetch('/api/modules', {
  pick: ['title']
})

커스텀 useFetch 래퍼를 사용하는 경우, composable 내에서 이를 await하지 마십시오. 이는 예기치 않은 동작을 유발할 수 있습니다. 커스텀 비동기 데이터 페처를 만드는 방법에 대한 자세한 정보는 이 레시피를 참조하십시오.

data, status, error는 Vue ref이며, <script setup> 내에서 사용할 때 .value로 접근해야 합니다. 반면 refresh/executeclear는 일반 함수입니다.

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&param2=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이 변경될 때 자동으로 업데이트되는 동적 데이터 페칭을 허용합니다:

pages/[id\
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 문이 포함되어 있지 않은지 확인하십시오.

이것도 참고 getting-started > data-fetching

타입

Signature
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, 또는 계산된 값일 수 있습니다.

OptionTypeDefaultDescription
keystringauto-gen중복 제거를 위한 고유 키. 제공되지 않으면 URL과 옵션에서 생성됩니다.
methodstring'GET'HTTP 요청 메서드.
queryobject-URL에 추가할 쿼리/검색 매개변수. 별칭: params. refs/computed를 지원합니다.
paramsobject-query의 별칭.
bodyRequestInit['body'] | Record<string, any>-요청 본문. 객체는 자동으로 문자열로 변환됩니다. refs/computed를 지원합니다.
headersRecord<string, string> | [key, value][] | Headers-요청 헤더.
baseURLstring-요청의 기본 URL.
timeoutnumber-요청을 중단할 밀리초 단위의 타임아웃.
cacheboolean | string-캐시 제어. Boolean은 캐시를 비활성화하거나 Fetch API 값: default, no-store 등을 사용합니다.
serverbooleantrue서버에서 가져올지 여부.
lazybooleanfalsetrue인 경우, 라우트 로드 후 해결됩니다 (탐색을 차단하지 않음).
immediatebooleantruefalse인 경우, 요청이 즉시 실행되지 않도록 방지합니다.
default() => DataT-비동기 해결 전 data의 기본값을 위한 팩토리.
transform(input: DataT) => DataT | Promise<DataT>-해결 후 결과를 변환하는 함수.
getCachedData(key, nuxtApp, ctx) => DataT | undefined-캐시된 데이터를 반환하는 함수. 아래의 기본값을 참조하십시오.
pickstring[]-결과에서 지정된 키만 선택.
watchWatchSource[] | false-감시하고 자동으로 새로 고침할 반응형 소스 배열. false는 감시를 비활성화합니다.
deepbooleanfalse데이터를 깊은 ref 객체로 반환.
dedupe'cancel' | 'defer''cancel'동일한 키를 한 번에 여러 번 가져오는 것을 방지.
$fetchtypeof $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이 활성화된 경우에만 데이터를 캐시합니다.

반환 값

NameTypeDescription
dataRef<DataT | null>비동기 fetch의 결과.
refresh(opts?: AsyncDataExecuteOptions) => Promise<void>데이터를 수동으로 새로 고치는 함수. 기본적으로 Nuxt는 refresh가 완료될 때까지 기다린 후 다시 실행할 수 있습니다.
execute(opts?: AsyncDataExecuteOptions) => Promise<void>refresh의 별칭.
errorRef<ErrorT | null>데이터 가져오기가 실패한 경우 오류 객체.
statusRef<'idle' | 'pending' | 'success' | 'error'>데이터 요청의 상태. 가능한 값은 아래를 참조하십시오.
clear() => voiddataundefined로 재설정 (또는 제공된 경우 options.default()의 값), errornull로 설정, statusidle로 설정하고, 대기 중인 요청을 취소합니다.

상태 값

  • idle: 요청이 시작되지 않음 (예: { immediate: false } 또는 서버 렌더링 시 { server: false })
  • pending: 요청이 진행 중
  • success: 요청이 성공적으로 완료됨
  • error: 요청 실패

서버에서 데이터를 가져오지 않은 경우 (예: server: false인 경우), 데이터는 하이드레이션이 완료될 때까지 가져오지 않습니다. 이는 클라이언트 측에서 useFetch를 await하더라도 <script setup> 내에서 data가 null로 남아 있음을 의미합니다.

예시

샘플 코드 편집 및 미리보기examples > advanced > use-custom-fetch-composable
샘플 코드 편집 및 미리보기examples > features > data-fetching