# Componentes Asíncronos
new
# Visión General
Aquí es una visión general de alto nivel de los que ya han cambiado:
- Nuevo método de ayuda
defineAsyncComponent
que explícitamente define componentes asíncronos - La opción
component
es renombrada aloader
- Función de cargador no recibe inherentemente argumentos
resolve
yreject
y debe retornar un Promise
Para una explicación más profundo, ¡sigue leyendo!
# Introducción
Anteriormente, los componentes asíncronos son creados mediante simplemente definir un componente como una función que retorne un Promise, tal como:
const asyncModal = () => import('./Modal.vue')
O, para la más avanzada sintaxis de componente con opciones:
const asyncModal = {
component: () => import('./Modal.vue'),
delay: 200,
timeout: 3000,
error: ErrorComponent,
loading: LoadingComponent
}
2
3
4
5
6
7
# Sintaxis para 3.x
Ahora, en Vue 3, debido a que componentes funcionales son definidos como funciones puras, las definiciones de componentes asíncronos necesitan ser definidas mediante envolverla en un nuevo ayudante defineAsyncComponent
helper:
import { defineAsyncComponent } from 'vue'
import ErrorComponent from './components/ErrorComponent.vue'
import LoadingComponent from './components/LoadingComponent.vue'
// Componente asíncrono sin opciones
const asyncModal = defineAsyncComponent(() => import('./Modal.vue'))
// Componente asíncrono con opciones
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
NOTE
Vue Router soporta un mecanismo similar para cargar componentes de ruta asíncronamente, conocido como cargamiento perezoso (lazy loading). Pese a las semejanzas, esta característica es distinta del soporte Vue para components asíncronos. No debe utilizar defineAsyncComponent
cuando configura componentes de ruta con Vue Router. Puede leer más sobre este en la sección rutas cargadas perezosamente (opens new window) de la documentación de Vue Router.
Otro cambio que se ha hecho desde 2.x es que la opción component
ahora es renombrada a loader
para informar con prcisión que una definición de componente no se puede proveer directamente.
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
Además, al contrario de 2.x, la función de cargador ya no recibe los argumentos resolve
y reject
y debe siempre retornar un Promise.
// versión 2.x
const oldAsyncComponent = (resolve, reject) => {
/* ... */
}
// versión 3.x
const asyncComponent = defineAsyncComponent(
() =>
new Promise((resolve, reject) => {
/* ... */
})
)
2
3
4
5
6
7
8
9
10
11
12
Para más información sobre el uso de componentes asíncronos, vea: