|
|
@@ -1,21 +1,19 @@
|
|
|
import {
|
|
|
- PublicAPIComponent,
|
|
|
Component,
|
|
|
+ ConcreteComponent,
|
|
|
currentInstance,
|
|
|
ComponentInternalInstance,
|
|
|
isInSSRComponentSetup
|
|
|
} from './component'
|
|
|
import { isFunction, isObject } from '@vue/shared'
|
|
|
-import { ComponentPublicInstance } from './componentProxy'
|
|
|
+import { ComponentPublicInstance } from './componentPublicInstance'
|
|
|
import { createVNode } from './vnode'
|
|
|
import { defineComponent } from './apiDefineComponent'
|
|
|
import { warn } from './warning'
|
|
|
import { ref } from '@vue/reactivity'
|
|
|
import { handleError, ErrorCodes } from './errorHandling'
|
|
|
|
|
|
-export type AsyncComponentResolveResult<T = PublicAPIComponent> =
|
|
|
- | T
|
|
|
- | { default: T } // es modules
|
|
|
+export type AsyncComponentResolveResult<T = Component> = T | { default: T } // es modules
|
|
|
|
|
|
export type AsyncComponentLoader<T = any> = () => Promise<
|
|
|
AsyncComponentResolveResult<T>
|
|
|
@@ -23,8 +21,8 @@ export type AsyncComponentLoader<T = any> = () => Promise<
|
|
|
|
|
|
export interface AsyncComponentOptions<T = any> {
|
|
|
loader: AsyncComponentLoader<T>
|
|
|
- loadingComponent?: PublicAPIComponent
|
|
|
- errorComponent?: PublicAPIComponent
|
|
|
+ loadingComponent?: Component
|
|
|
+ errorComponent?: Component
|
|
|
delay?: number
|
|
|
timeout?: number
|
|
|
suspensible?: boolean
|
|
|
@@ -37,7 +35,7 @@ export interface AsyncComponentOptions<T = any> {
|
|
|
}
|
|
|
|
|
|
export function defineAsyncComponent<
|
|
|
- T extends PublicAPIComponent = { new (): ComponentPublicInstance }
|
|
|
+ T extends Component = { new (): ComponentPublicInstance }
|
|
|
>(source: AsyncComponentLoader<T> | AsyncComponentOptions<T>): T {
|
|
|
if (isFunction(source)) {
|
|
|
source = { loader: source }
|
|
|
@@ -53,8 +51,8 @@ export function defineAsyncComponent<
|
|
|
onError: userOnError
|
|
|
} = source
|
|
|
|
|
|
- let pendingRequest: Promise<Component> | null = null
|
|
|
- let resolvedComp: Component | undefined
|
|
|
+ let pendingRequest: Promise<ConcreteComponent> | null = null
|
|
|
+ let resolvedComp: ConcreteComponent | undefined
|
|
|
|
|
|
let retries = 0
|
|
|
const retry = () => {
|
|
|
@@ -63,8 +61,8 @@ export function defineAsyncComponent<
|
|
|
return load()
|
|
|
}
|
|
|
|
|
|
- const load = (): Promise<Component> => {
|
|
|
- let thisRequest: Promise<Component>
|
|
|
+ const load = (): Promise<ConcreteComponent> => {
|
|
|
+ let thisRequest: Promise<ConcreteComponent>
|
|
|
return (
|
|
|
pendingRequest ||
|
|
|
(thisRequest = pendingRequest = loader()
|
|
|
@@ -135,7 +133,9 @@ export function defineAsyncComponent<
|
|
|
onError(err)
|
|
|
return () =>
|
|
|
errorComponent
|
|
|
- ? createVNode(errorComponent as Component, { error: err })
|
|
|
+ ? createVNode(errorComponent as ConcreteComponent, {
|
|
|
+ error: err
|
|
|
+ })
|
|
|
: null
|
|
|
})
|
|
|
}
|
|
|
@@ -175,11 +175,11 @@ export function defineAsyncComponent<
|
|
|
if (loaded.value && resolvedComp) {
|
|
|
return createInnerComp(resolvedComp, instance)
|
|
|
} else if (error.value && errorComponent) {
|
|
|
- return createVNode(errorComponent as Component, {
|
|
|
+ return createVNode(errorComponent as ConcreteComponent, {
|
|
|
error: error.value
|
|
|
})
|
|
|
} else if (loadingComponent && !delayed.value) {
|
|
|
- return createVNode(loadingComponent as Component)
|
|
|
+ return createVNode(loadingComponent as ConcreteComponent)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -187,7 +187,7 @@ export function defineAsyncComponent<
|
|
|
}
|
|
|
|
|
|
function createInnerComp(
|
|
|
- comp: Component,
|
|
|
+ comp: ConcreteComponent,
|
|
|
{ vnode: { props, children } }: ComponentInternalInstance
|
|
|
) {
|
|
|
return createVNode(comp, props, children)
|