OfficeSystem/node_modules/@climblee/uv-ui/components/uv-loading-page/uv-loading-page.vue
WindowBird 7ab9e16c35 init
2025-10-30 16:42:12 +08:00

96 lines
3.0 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="uv-loading-page uv-flex-column" v-if="showLoading" :style="[loadingPageStyle]">
<image v-if="image!=''" :src="image" class="uv-loading-page__img" mode="widthFit" :style="[{
width: $uv.addUnit(iconSize),
height: $uv.addUnit(iconSize)
}]"></image>
<uv-loading-icon v-else :mode="loadingMode" :size="iconSize" :color="loadingColor"></uv-loading-icon>
<slot>
<text class="uv-loading-page__text" :style="[{
fontSize: $uv.addUnit(fontSize),
color: color
}]">{{ loadingText }}</text>
</slot>
</view>
</template>
<script>
import mpMixin from '../../libs/mixin/mpMixin.js'
import mixin from '../../libs/mixin/mixin.js'
import props from "./props.js";
/**
* loadingPage 加载动画
* @description 警此组件为一个小动画目前用在uvui的loadmore加载更多和switch开关等组件的正在加载状态场景。
* @tutorial https://www.uvui.cn/components/loading.html
*
* @property {Boolean} loading 是否加载中 (默认 false
* @property {String | Number} loadingText 提示内容 (默认 '正在加载' )
* @property {String} image 文字上方用于替换loading动画的图片
* @property {String} loadingMode 加载动画的模式circle-圆形spinner-花朵形semicircle-半圆形 (默认 'circle'
* @property {String} bgColor 背景色 (默认 '#ffffff'
* @property {String} color 文字颜色 (默认 '#C8C8C8'
* @property {String | Number} fontSize 文字大小 (默认 19
* @property {String | Number} iconSize 图标大小 (默认 28
* @property {String} loadingColor 加载中图标的颜色只能rgb或者十六进制颜色值 (默认 '#C8C8C8'
* @property {String | Number} duration 关闭加载时的过渡时间单位ms (默认 300
*
* @example <uv-loading mode="circle"></uv-loading>
*/
export default {
name: "uv-loading-page",
mixins: [mpMixin, mixin, props],
data() {
return {
showLoading: false,
opacity: 1
}
},
watch: {
loading: {
immediate: true,
handler(newVal) {
if (newVal) {
this.showLoading = true;
this.opacity = 1;
} else {
this.opacity = 0;
this.$nextTick(() => {
this.$uv.sleep(this.duration).then(res => {
this.showLoading = false;
})
})
}
}
}
},
computed: {
loadingPageStyle() {
const style = {
'position': 'fixed',
'top': '0',
'left': '0',
'right': '0',
'bottom': '0',
'zIndex': '999',
'background-color': this.bgColor,
'transition-duration': `${this.duration}ms`,
'opacity': this.opacity
}
return this.$uv.deepMerge(style, this.$uv.addStyle(this.customStyle))
}
}
}
</script>
<style scoped lang="scss">
@import '../../libs/css/components.scss';
$uv-loading-icon-margin-bottom: 10px !default;
.uv-loading-page {
flex: 1;
justify-content: center;
align-items: center;
padding-bottom: 150px;
transition-property: opacity;
&__text {
margin-top: $uv-loading-icon-margin-bottom;
}
}
</style>