2 changed files with 100 additions and 0 deletions
@ -0,0 +1,99 @@ |
|||||
|
<template> |
||||
|
<view |
||||
|
v-if="visible" |
||||
|
class="common-loading" |
||||
|
:class="{'common-loading--mask': mask}" |
||||
|
@touchmove.stop.prevent="noop" |
||||
|
@tap.stop="noop" |
||||
|
> |
||||
|
<view class="common-loading__box"> |
||||
|
<image class="common-loading__gif" src="/static/images/img/loading.gif" mode="aspectFit"></image> |
||||
|
<view v-if="title" class="common-loading__text">{{ title }}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { LOADING_HIDE_EVENT, LOADING_SHOW_EVENT, getLoadingState } from '@/utils/loading.js' |
||||
|
|
||||
|
export default { |
||||
|
name: 'CommonLoading', |
||||
|
data() { |
||||
|
return { |
||||
|
visible: false, |
||||
|
title: '加载中...', |
||||
|
mask: true |
||||
|
} |
||||
|
}, |
||||
|
created() { |
||||
|
const state = getLoadingState() |
||||
|
this.visible = state.visible |
||||
|
this.title = state.title |
||||
|
this.mask = state.mask |
||||
|
uni.$on(LOADING_SHOW_EVENT, this.show) |
||||
|
uni.$on(LOADING_HIDE_EVENT, this.hide) |
||||
|
}, |
||||
|
beforeDestroy() { |
||||
|
uni.$off(LOADING_SHOW_EVENT, this.show) |
||||
|
uni.$off(LOADING_HIDE_EVENT, this.hide) |
||||
|
}, |
||||
|
methods: { |
||||
|
show(options = {}) { |
||||
|
this.visible = true |
||||
|
this.title = options.title || '加载中...' |
||||
|
this.mask = options.mask !== false |
||||
|
}, |
||||
|
hide() { |
||||
|
this.visible = false |
||||
|
}, |
||||
|
noop() {} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.common-loading { |
||||
|
position: fixed; |
||||
|
top: 0; |
||||
|
right: 0; |
||||
|
bottom: 0; |
||||
|
left: 0; |
||||
|
z-index: 99999; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
pointer-events: none; |
||||
|
background: rgba(0, 0, 0, 0.18); |
||||
|
} |
||||
|
|
||||
|
.common-loading--mask { |
||||
|
pointer-events: auto; |
||||
|
} |
||||
|
|
||||
|
.common-loading__box { |
||||
|
min-width: 180rpx; |
||||
|
min-height: 180rpx; |
||||
|
padding: 34rpx 36rpx 30rpx; |
||||
|
border-radius: 28rpx; |
||||
|
background: rgba(255, 255, 255, 0.96); |
||||
|
box-shadow: 0 18rpx 46rpx rgba(0, 0, 0, 0.16); |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
} |
||||
|
|
||||
|
.common-loading__gif { |
||||
|
width: 92rpx; |
||||
|
height: 92rpx; |
||||
|
} |
||||
|
|
||||
|
.common-loading__text { |
||||
|
margin-top: 18rpx; |
||||
|
max-width: 320rpx; |
||||
|
font-size: 26rpx; |
||||
|
line-height: 36rpx; |
||||
|
color: #333; |
||||
|
text-align: center; |
||||
|
} |
||||
|
</style> |
||||
Loading…
Reference in new issue