
3 changed files with 207 additions and 44 deletions
@ -0,0 +1,98 @@ |
|||||
|
<template> |
||||
|
<div class="content-loading-overlay" v-if="isLoading"> |
||||
|
<div class="loading-content"> |
||||
|
<div ref="animationContainer" class="animation-container"></div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div v-else> |
||||
|
<slot></slot> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import lottie from 'lottie-web' |
||||
|
import { mapState } from 'vuex' |
||||
|
import defaultAnimation from '@/assets/loadingAni.json' // 导入JSON文件 |
||||
|
|
||||
|
export default { |
||||
|
name: 'Loading', |
||||
|
data() { |
||||
|
return { |
||||
|
anim: null |
||||
|
} |
||||
|
}, |
||||
|
computed: { |
||||
|
...mapState(['isLoading', 'loadingText']) |
||||
|
}, |
||||
|
watch: { |
||||
|
isLoading(newVal) { |
||||
|
if (newVal) { |
||||
|
this.$nextTick(()=>{ |
||||
|
this.playAnimation() |
||||
|
}) |
||||
|
} else { |
||||
|
this.stopAnimation() |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
mounted() { |
||||
|
if (this.isLoading) { |
||||
|
this.playAnimation() |
||||
|
} |
||||
|
}, |
||||
|
beforeDestroy() { |
||||
|
this.stopAnimation() |
||||
|
}, |
||||
|
methods: { |
||||
|
playAnimation() { |
||||
|
this.anim = lottie.loadAnimation({ |
||||
|
container: this.$refs.animationContainer, |
||||
|
renderer: 'svg', |
||||
|
loop: true, |
||||
|
autoplay: true, |
||||
|
animationData: defaultAnimation // 你的JSON动画路径 |
||||
|
}) |
||||
|
if (this.anim) { |
||||
|
this.anim.play() |
||||
|
} |
||||
|
}, |
||||
|
stopAnimation() { |
||||
|
if (this.anim) { |
||||
|
this.anim.stop() |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.content-loading-overlay { |
||||
|
position: absolute; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
bottom: 0; |
||||
|
background: rgba(255, 255, 255, 0.8); |
||||
|
z-index: 1000; |
||||
|
/* 确保高于内容 */ |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.loading-content { |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.animation-container { |
||||
|
width: 180px; |
||||
|
height: 180px; |
||||
|
margin: 0 auto; |
||||
|
} |
||||
|
|
||||
|
.loading-text { |
||||
|
margin-top: 20px; |
||||
|
font-size: 16px; |
||||
|
color: #333; |
||||
|
} |
||||
|
</style> |
Loading…
Reference in new issue