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>