import { createApp } from 'vue'
import App from './App.vue'
import Loading from "./components/Loading/index.ts";const app = createApp(App)
type Lod = {show: () => void,hide: () => void
}
declare module '@vue/runtime-core' {export interface ComponentCustomProperties {$loading: Lod}
}app.use(Loading)
app.mount('#app')
<template>
<!-- App.vue--><div><img id="img" width="400" height="400" src="./assets/unnamed.jpg" alt=""/></div>
</template><script setup lang="ts">
import {getCurrentInstance} from "vue";const instance = getCurrentInstance()
instance?.proxy?.$loading.show()
setTimeout(() => {instance?.proxy?.$loading.hide()
}, 5000)</script><style></style>
import type {App, VNode} from 'vue'
import {createVNode, render} from "vue";
import Loading from './index.vue'export default {install(app: App) {const Vnode: VNode = createVNode(Loading)render(Vnode, document.body)app.config.globalProperties.$loading = {show: Vnode.component?.exposed?.show,hide: Vnode.component?.exposed?.hide,}}
}
<template>
<!-- components/Loading/index.vue--><div v-if="isShow" class="loading"><div class="loading-content">Loading...</div></div>
</template><script setup lang='ts'>
import { ref } from 'vue';
const isShow = ref(false) const show = () => {isShow.value = true
}
const hide = () => {isShow.value = false
}
defineExpose({isShow,show,hide
})
</script><style scoped lang="less">
.loading {position: fixed;inset: 0;background: rgba(0, 0, 0, 0.8);display: flex;justify-content: center;align-items: center;&-content {font-size: 30px;color: #fff;}
}
</style>
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/98ca596f3e85405180509577a0656694.png)