You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
822 B
43 lines
822 B
import {
|
|
AsyncComponentLoader,
|
|
Component,
|
|
defineAsyncComponent,
|
|
defineComponent,
|
|
h,
|
|
markRaw,
|
|
ref,
|
|
} from "vue";
|
|
let num = 0;
|
|
export function useAsyncComponent(comp: AsyncComponentLoader<any>) {
|
|
let retryFn: Function;
|
|
const asyncComp = defineAsyncComponent({
|
|
loader: comp,
|
|
// loader: () =>
|
|
// new Promise<Component>((resolve, reject) => {
|
|
// // resolve(comp());
|
|
// // resolve(() => h("div", {}, "aaa"));
|
|
// reject();
|
|
// }),
|
|
loadingComponent: () => h("div", "loading"),
|
|
errorComponent: () =>
|
|
h(
|
|
"div",
|
|
{
|
|
onClick() {
|
|
if (retryFn) {
|
|
retryFn();
|
|
}
|
|
},
|
|
},
|
|
"error"
|
|
),
|
|
timeout: 3000,
|
|
onError(err, retry, fail, attempts) {
|
|
console.error(err);
|
|
retryFn = retry;
|
|
},
|
|
});
|
|
return markRaw(h(asyncComp));
|
|
}
|
|
|
|
export default useAsyncComponent;
|