useAsyncData

useAsyncData는 SSR 친화적인 컴포저블에서 비동기적으로 확인되는 데이터에 대한 액세스를 제공한다.

 

페이지, 구성 요소 및 플러그인 내에서 useAsyncData를 사용하여 비동기적으로 확인되는 데이터에 액세스할 수 있다.

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

 

사용법

<!--
page/index.vue
-->

<script setup>
const { data, pending, error, refresh } = await useAsyncData(
  'mountains',
  () => $fetch('https://api.nuxtjs.dev/mountains')
)
</script>

 

Watch Params

내장 watch옵션을 사용하면 변경 사항이 감지될 때 fetcher기능을 자동으로 다시 실행할 수 있다.

<!--
pages/index.vue
-->

<script setup>
const page = ref(1)
const { data: posts } = await useAsyncData(
  'posts',
  () => $fetch('https://fakeApi.com/posts', {
    params: {
      page: page.value
    }
  }), {
    watch: [page]
  }
)
</script>

주의) useAsyncData은 컴파일러에 의해 변환된 예약된 함수 이름이므로 자신의 함수 이름을 useAsyncData 로 지정해서는 안 된다.

 

매개변수

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

 

반환 값

  • data: 전달된 비동기 함수의 결과.
  • pending: 데이터를 아직 가져오는 중인지 여부를 나타내는 부울값.
  • refresh / execute: handler 함수에서 반환된 데이터를 새로 고치는 데 사용할 수 있는 함수.
  • error: 데이터 가져오기에 실패한 경우 오류 개체.
  • status: 데이터 요청 상태를 나타내는 문자열( "idle", "pending", "success", "error").

 

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

서버에서 데이터를 가져오지 않은 경우(예: 를 사용하여 server: false) 하이드레이션이 완료될 때까지 데이터를 가져오지 않는다 . 이는 클라이언트 측에서 useAsyncData 가 대기하더라도 <script setup> 내에  data 가 null 로 남아 있음을 의미한다.

 

Type

// signature

function useAsyncData<DataT, DataE>(
  handler: (nuxtApp?: NuxtApp) => Promise<DataT>,
  options?: AsyncDataOptions<DataT>
): AsyncData<DataT, DataE>
function useAsyncData<DataT, DataE>(
  key: string,
  handler: (nuxtApp?: NuxtApp) => Promise<DataT>,
  options?: AsyncDataOptions<DataT>
): Promise<AsyncData<DataT, DataE>

type AsyncDataOptions<DataT> = {
  server?: boolean
  lazy?: boolean
  immediate?: boolean
  deep?: boolean
  default?: () => DataT | Ref<DataT> | null
  transform?: (input: DataT) => DataT
  pick?: string[]
  watch?: WatchSource[]
  getCachedData?: (key: string) => DataT
}

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' 카테고리의 다른 글

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