jiuyiUniapp/shop/components/rf-loading/index.vue

136 lines
3.0 KiB
Vue
Raw Normal View History

2024-12-18 15:46:27 +08:00
<template>
<transition name="fade" v-if="styleLoadingIsOpen">
<view
class="mask"
v-show="isActive"
:class="{ 'full-screen': isFullScreen }"
:style="{ backgroundColor }"
>
<view
class="spinner"
:style="{ transform: `translate(-50%, -${translateY}%)` }"
>
<slot>
<loop v-if="styleLoadingType === 'loop'" :color="themeColor.color" :size="size" />
<shrinkRect v-if="styleLoadingType === 'shrinkRect'" :color="themeColor.color" :size="size" />
<bounce v-if="styleLoadingType === 'bounce'" :color="themeColor.color" :size="size" />
<doubleBounce v-if="styleLoadingType === 'doubleBounce'" :color="themeColor.color" :size="size" />
<doubleCube v-if="styleLoadingType === 'doubleCube'" :color="themeColor.color" :size="size" />
<doubleDot v-if="styleLoadingType === 'doubleDot'" :color="themeColor.color" :size="size" />
<rotatePlane v-if="styleLoadingType === 'rotatePlane'" :color="themeColor.color" :size="size" />
<scaleOut v-if="styleLoadingType === 'scaleOut'" :color="themeColor.color" :size="size" />
</slot>
<view v-if="text.length" :style="{ color: textColor }">
{{ text }}
</view>
</view>
</view>
</transition>
</template>
<script>
// ==========在这里选一个您要的其他去掉也行==========
import loop from './loaders/loop.vue';
import bounce from './loaders/bounce.vue';
import doubleBounce from './loaders/double-bounce.vue';
import doubleCube from './loaders/double-cube.vue';
import doubleDot from './loaders/double-dot.vue';
import rotatePlane from './loaders/rotate-plane.vue';
import scaleOut from './loaders/scale-out.vue';
import shrinkRect from './loaders/shrink-rect.vue';
// ==========在这里选一个您要的其他去掉也行==========
export default {
name: 'rfLoading',
components: {
loop,
bounce,
doubleBounce,
doubleCube,
doubleDot,
rotatePlane,
scaleOut,
shrinkRect
},
props: {
active: Boolean,
translateY: {
type: Number,
default: 150
},
text: {
type: String,
default: ''
},
color: {
type: String,
default: '#333'
},
textColor: {
type: String,
default: '#333'
},
isFullScreen: {
type: Boolean,
default: false
},
backgroundColor: {
type: String,
default: 'rgba(255, 255, 255, .9)'
},
size: {
type: Number,
default: 40
}
},
data() {
return {
isActive: this.active || false,
styleLoadingIsOpen: this.$mSettingConfig.styleLoadingIsOpen,
styleLoadingType: this.$mSettingConfig.styleLoadingType
};
},
watch: {
active(value) {
this.isActive = value;
}
}
};
</script>
<style scoped>
.mask {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 3000;
transition: opacity 0.3s linear;
}
.full-screen {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.spinner {
position: absolute;
top: 50%;
left: 50%;
text-align: center;
}
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.3s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
</style>