useFetch

이 컴포저블은 useAsyncData $fetch 를 감싼 형태며, URL 및 가져오기 옵션을 기반으로 자동으로 키를 생성하고, 서버 경로를 기반으로 요청 URL의 유형에 대한 힌트를 제공하고, API 응답 유형을 추론한다.

useFetch 는 setup 함수, 플러그인 또는 경로 미들웨어에서 직접 호출되는 컴포저블이다. 반응형 컴포저블을 반환하고 Nuxt 페이로드에 응답을 추가하므로 페이지가 하이드레이션될 때 클라이언트 측에서 데이터를 다시 가져오지 않고도 서버에서 클라이언트로 응답이 전달될 수 있다.

 

사용법

// pages/index.vue

<script setup>
const route = useRoute()

const { data, pending, error, refresh } = await useFetch(`https://api.nuxtjs.dev/mountains/${route.params.slug}`, {
  pick: ['title']
})
</script>

query 옵션을 사용하면 쿼리에 검색 매개변수를 추가할 수 있습니다. 이 옵션은 unjs/ofetch 에서 확장되었으며 unjs/ufo를 사용하여 URL을 생성한다. 객체는 자동으로 문자열화된다.

const param1 = ref('value1')
const { data, pending, error, refresh } = await useFetch('https://api.nuxtjs.dev/mountains', {
  query: { param1, param2: 'value2' }
})

위의 예로 호출되는 URL 은 https://api.nuxtjs.dev/mountains?param1=value1&param2=value2 와 동일하다.

 

인터셉터를 사용할 수도 있다.

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
    localStorage.setItem('token', response._data.token)
  },
  onResponseError({ request, response, options }) {
    // Handle the response errors
  }
})

주의) useFetch 는 컴파일러에 의해 변환된 예약된 함수 이름이므로 사용자 함수로 useFetch 를 사용하면 안된다.

 

fetch 사용자 함수 예)

import type { UseFetchOptions } from 'nuxt/app'
import { defu } from 'defu'

export function useCustomFetch<T> (url: string | (() => string), options: UseFetchOptions<T> = {}) {
  const userAuth = useCookie('token')
  const config = useRuntimeConfig()

  const defaults: UseFetchOptions<T> = {
    baseURL: config.baseUrl ?? 'https://api.nuxtjs.dev',
    // this overrides the default key generation, which includes a hash of
    // url, method, headers, etc. - this should be used with care as the key
    // is how Nuxt decides how responses should be deduplicated between
    // client and server
    key: url,

    // set user token if connected
    headers: userAuth.value
      ? { Authorization: `Bearer ${userAuth.value}` }
      : {},

    onResponse (_ctx) {
      // _ctx.response._data = new myBusinessResponse(_ctx.response._data)
    },

    onResponseError (_ctx) {
      // throw new myBusinessError()
    }
  }

  // for nice deep defaults, please use unjs/defu
  const params = defu(options, defaults)

  return useFetch(url, params)
}

참고) Nuxt-개요 > 데이터 가져오기

 

매개변수

모든 가져오기 옵션에는 computed 또는ref 값을 지정할 수 있다. . 이를 감시하고 업데이트된 경우 새 값으로 자동으로 새 요청이 수행됩니다.

 

옵션 ( useAsyncData 에서 유래)

  • key : 데이터 가져오기가 요청 전반에 걸쳐 적절하게 중복 제거될 수 있도록 보장하는 고유 키입니다. 키를 제공하지 않으면 useAsyncData 인스턴스의 파일 이름과 행번호로 생성된 고유한 키가 생성된다.
  • server : 서버에서 데이터를 가져올지 여부 (기본값은 true)
  • lazy : 클라이언트 측 탐색을 차단하는 대신 경로를 로드한 후 비동기 기능을 해결할지 여부(기본값은 false)
  • immediate : 로 설정하면 false요청이 즉시 실행되지 않는다. (기본값은 true)
  • default : 비동기 함수가 리졸브 되기전에 의 data 기본값을 설정하는 팩토리 함수 - lazy: true 혹은 immediate: false 옵션 과 함께 유용함.
  • transform : 리졸브 후 handler 함수 결과를 변경하는 데 사용할 수 있는 함수
  • pick : handler 함수 결과에서 이 배열의 지정된 키만 선택한다.
  • watch : 자동 새로고침을 위해 반응 소스를 관찰한다.
  • deep : 깊은 참조 객체의 데이터를 반환합니다(기본값 true). 얕은 참조 객체에 데이터를 반환 하도록 false 로 설정할 수 있으며, 이는 데이터가 깊게 반응할 필요가 없는 경우 성능을 향상시킬 수 있다.

 

기본적으로 Nuxt는 다시 실행되기 전에 refresh 가 완료될 때까지 기다린다.

서버에서 데이터를 가져오지 않은 경우(예: server: false) 하이드레이션이 완료될 때까지 데이터를 가져오지 않는다. 즉, 클라이언트 측에서 useFetch를 기다리더라도 <script setup> 내에서는 데이터가 null 로 유지된다.

 

Type (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) => DataT
  deep?: boolean
  default?: () => DataT
  transform?: (input: DataT) => DataT
  pick?: string[]
  watch?: WatchSource[] | false
}

type AsyncData<DataT, ErrorT> = {
  data: Ref<DataT | null>
  pending: Ref<boolean>
  refresh: (opts?: AsyncDataExecuteOptions) => Promise<void>
  execute: (opts?: AsyncDataExecuteOptions) => Promise<void>
  error: Ref<ErrorT | null>
  status: Ref<AsyncDataRequestStatus>
}

interface AsyncDataExecuteOptions {
  dedupe?: boolean
}

type AsyncDataRequestStatus = 'idle' | 'pending' | 'success' | 'error'

 

'Nuxt 공식문서 번역 > Composables' 카테고리의 다른 글

useHead  (0) 2023.12.14
useHeadSafe  (0) 2023.12.13
useError  (0) 2023.12.13
useCookie  (0) 2023.12.13
useAsyncData  (0) 2023.12.12
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유