效果图

使用
import loading from "@/utils/index";
loading.show();
setTimeout(() => {
loading.hide();
}, 3000);
代码
loading组件
<template>
<div v-show="props.show" class="loading-container">
<div class="loading-wrapper">
<div class="my-loading">
<div class="loading">
<span>加</span>
<span>载</span>
<span>中</span>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
const props = defineProps({
show: {
type: Boolean,
default: true,
},
});
</script>
<style lang="scss" scoped>
.loading-container {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(42, 122, 197, 0.7);
}
.loading-wrapper {
height: 350rpx;
width: 350rpx;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.my-loading {
height: 350rpx;
width: 350rpx;
background: url("../../static/loading.gif");
border-radius: 50%;
background-size: 100% 100%;
background-repeat: no-repeat;
}
.loading-text {
text-align: center;
color: white;
line-height: 350rpx;
}
.loading {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
width: 100%;
}
.loading span {
display: inline-block;
width: 16px;
height: 16px;
margin: 0 10px;
border-radius: 50%;
color: black;
animation: loading 1.5s ease-in-out infinite;
}
.loading span:nth-child(1) {
/* background-color: #000; */
animation-delay: 0.1s;
color: white;
}
.loading span:nth-child(2) {
/* background-color: #111; */
animation-delay: 0.2s;
color: white;
}
.loading span:nth-child(3) {
/* background-color: #222; */
animation-delay: 0.3s;
color: white;
}
@keyframes loading {
0% {
transform: scale(1);
}
50% {
transform: scale(1.5);
}
100% {
transform: scale(1);
}
}
</style>
loading效果图

调用函数
import { createApp, ref, h } from "vue";
import Loading from "@/components/loading/index.vue";
let loadingInstance: any = null;
function initInstance() {
const container = document.createElement("div");
container.id = "loading-box";
document.body.appendChild(container);
const app = createApp({
setup() {
const loadingRef = ref({
show: true,
text: "",
});
return {
loadingRef,
};
},
render() {
return h(Loading, {
show: this.loadingRef.show,
});
},
});
loadingInstance = app.mount("#loading-box");
}
function show() {
if (!loadingInstance) {
initInstance();
}
loadingInstance.loadingRef.show = true;
}
function hide() {
if (loadingInstance) {
loadingInstance.loadingRef.show = false;
}
}
export default {
show,
hide,
};
- initInstance:初始化loading实例。用ref保持响应式,render和h渲染组件,h函数的第二个参数将props传递给组件。
- show,hide:切换loading的显示和隐藏