본문 바로가기
Vue.js

Vue.js] 17. Component > Async Components

by Fastlane 2025. 1. 2.
728x90
반응형

필요할 때만 서버에서 컴포넌트를 로드해야 할 수 있다. 이를 구현하기 위해 defuneAsyncComponent 함수를 제공한다. 

import { defineAsyncComponent } from 'vue'

const AsyncComp = defineAsyncComponent(() => {
  return new Promise((resolve, reject) => {
    // ...서버에서 컴포넌트를 로드하는 로직
    resolve(/* 로드 된 컴포넌트 */)
  })
})
// ... 일반 컴포넌트처럼 `AsyncComp`를 사용

rosolve 콜백을 호출해 서버에서 가져온 정의되어 있는 컴포넌트를 반환한다. 로드가 실패했음을 나타내기 위해 reject(reason)을 호출할 수도 있다. 

 

import { defineAsyncComponent } from 'vue'

const AsyncComp = defineAsyncComponent(() =>
  import('./components/MyComponent.vue')
)

일반 컴포넌트처럼, 비동기 컴포넌트도 전역/로컬 등록이 가능하다. 

app.component('MyComponent', defineAsyncComponent(() =>
  import('./components/MyComponent.vue')
))

 

<script>
import { defineAsyncComponent } from 'vue'

export default {
  components: {
    AdminPage: defineAsyncComponent(() =>
      import('./components/AdminPageComponent.vue')
    )
  }
}
</script>

<template>
  <AdminPage />
</template>

 

로딩 및 에러 상태

비동기 작업에는 필연적으로 로드 및 에러 상태가 포함된다. 

const AsyncComp = defineAsyncComponent({
  // 로더 함수
  loader: () => import('./Foo.vue'),

  // 비동기 컴포넌트가 로드되는 동안 사용할 로딩 컴포넌트입니다.
  loadingComponent: LoadingComponent,
  // 로딩 컴포넌트를 표시하기 전에 지연할 시간. 기본값: 200ms
  delay: 200,

  // 로드 실패 시 사용할 에러 컴포넌트
  errorComponent: ErrorComponent,
  // 시간 초과 시, 에러 컴포넌트가 표시됩니다. 기본값: 무한대
  timeout: 3000
})

로딩 컴포넌트가 제공되면 내부 컴포넌트가 로딩되는 동안 먼저 표시됩니다. 로딩 컴포넌트가 표시되기 전에 기본 200ms 지연시간이 있습니다. 이는 빠른 네트워크에서 인스턴트 로딩 상태가 너무 빨리 교체되어 깜박임처럼 보일 수 있기 때문입니다.

에러 컴포넌트가 제공되면 로더 함수의 Promise가 reject로 반환될 때 표시됩니다. 요청이 너무 오래 걸릴 때 에러 컴포넌트를 표시하도록 시간 초과를 지정할 수도 있습니다.

728x90
반응형

댓글