# Componentes Assíncronos
new
# Visão Geral
Sobre o que mudou, em visão geral:
- Novo método helper
defineAsyncComponent
que define explicitamente componentes assíncronos - Opção
component
renomeada paraloader
- Função Loader não recebe inerentemente os argumentos
resolve
ereject
e deve retornar uma Promise
Para uma explicação mais aprofundada, continue lendo!
# Introdução
Anteriormente, componentes assíncronos eram criados simplesmente definindo um componente como uma função que retornava uma Promise, tal como:
const asyncModal = () => import('./Modal.vue')
Ou, para os componentes com sintaxe mais avançada com opções:
const asyncModal = {
component: () => import('./Modal.vue'),
delay: 200,
timeout: 3000,
error: ErrorComponent,
loading: LoadingComponent
}
2
3
4
5
6
7
# Sintaxe v3.x
Agora, no Vue 3, uma vez que os componentes funcionais são definidos como funções puras, as definições de componentes assíncronos precisam ser definidas explicitamente, envolvendo-o em um novo helper defineAsyncComponent
:
import { defineAsyncComponent } from 'vue'
import ErrorComponent from './components/ErrorComponent.vue'
import LoadingComponent from './components/LoadingComponent.vue'
// Componente Assíncrono sem opções
const asyncModal = defineAsyncComponent(() => import('./Modal.vue'))
// Componente Assíncrono com opções
const asyncModalWithOptions = defineAsyncComponent({
loader: () => import('./Modal.vue'),
delay: 200,
timeout: 3000,
errorComponent: ErrorComponent,
loadingComponent: LoadingComponent
})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
NOTA
O Vue Router suporta um mecanismo similar para carregar componentes de rota de maneira assíncrona, conhecido como lazy loading. Apesar das similaridades, este recurso é distinto do suporte do Vue para componentes assíncronos. Você não deve usar defineAsyncComponent
ao configurar componentes de rota com o Vue Router. Você pode ler mais sobre isso na seção Lazy Loading Routes (opens new window) da documentação do Vue Router.
Outra mudança em relação a v2.x é a de que a opção component
foi renomeada para loader
a fim de comunicar com precisão que uma definição de componente não pode ser fornecida diretamente.
import { defineAsyncComponent } from 'vue'
const asyncModalWithOptions = defineAsyncComponent({
loader: () => import('./Modal.vue'),
delay: 200,
timeout: 3000,
errorComponent: ErrorComponent,
loadingComponent: LoadingComponent
})
2
3
4
5
6
7
8
9
Além disso, ao contrário da versão 2.x, a função loader não recebe mais os argumentos resolve
e reject
, e deve sempre retornar uma Promise.
// Versão 2.x
const oldAsyncComponent = (resolve, reject) => {
/* ... */
}
// Versão 3.x
const asyncComponent = defineAsyncComponent(
() =>
new Promise((resolve, reject) => {
/* ... */
})
)
2
3
4
5
6
7
8
9
10
11
12
Para mais informações sobre o uso de componentes assincronos, leia: