1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
| import { createVNode, defineComponent, h, reactive, render, VNode } from 'vue';
| import type { LoadingProps } from './typing';
|
| import Loading from './Loading.vue';
|
| export function createLoading(props?: Partial<LoadingProps>, target?: HTMLElement, wait = false) {
| let vm: Nullable<VNode> = null;
| const data = reactive({
| tip: '',
| loading: true,
| ...props,
| });
|
| const LoadingWrap = defineComponent({
| render() {
| return h(Loading, { ...data });
| },
| });
|
| vm = createVNode(LoadingWrap);
|
| let container: Nullable<HTMLElement> = null;
| if (wait) {
| setTimeout(() => {
| render(vm, (container = document.createElement('div')));
| }, 0);
| } else {
| render(vm, (container = document.createElement('div')));
| }
|
| function close() {
| if (vm?.el && vm.el.parentNode) {
| vm.el.parentNode.removeChild(vm.el);
| }
| }
|
| function open(target: HTMLElement = document.body) {
| if (!vm || !vm.el) {
| return;
| }
| target.appendChild(vm.el as HTMLElement);
| }
|
| function destroy() {
| container && render(null, container);
| container = vm = null;
| }
|
| if (target) {
| open(target);
| }
| return {
| vm,
| close,
| open,
| destroy,
| setTip: (tip: string) => {
| data.tip = tip;
| },
| setLoading: (loading: boolean) => {
| data.loading = loading;
| },
| get loading() {
| return data.loading;
| },
| get $el() {
| return vm?.el as HTMLElement;
| },
| };
| }
|
|