You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
264 lines
5.5 KiB
264 lines
5.5 KiB
<!--本文件由FirstUI授权予内蒙古晟誉网络科技有限责任公司(手机号: 15 1 4 82 28108,身份证尾号:1R6T39)专用,请尊重知识产权,勿私下传播,违者追究法律责任。-->
|
|
<template>
|
|
<view class="fui-countdown__verify" :class="{'fui-cdv__disabled':status>1}"
|
|
:style="{ width: width+'rpx', height: height+'rpx', marginLeft: marginLeft+'rpx',marginRight:marginRight+'rpx', borderRadius: radius+'rpx', background: background,borderColor:!getBorderColor || getBorderColor===true?background:getBorderColor }">
|
|
<text :style="{fontSize: size + 'rpx',lineHeight:size + 'rpx', color: getColor}"
|
|
class="fui-countdown__verify-text" :class="{'fui-cdv__color':!getColor}">{{ showText }}</text>
|
|
<view class="fui-countdown__verify-main fui-countdown__verify-active" :style="{borderRadius: radius+'rpx'}"
|
|
@tap.stop="sendCode" v-if="status===1"></view>
|
|
<!-- #ifndef APP-NVUE -->
|
|
<view class="fui-countdown__verify-line" :class="{'fui-cdv__border-color':!getBorderColor}"
|
|
:style="{borderColor: getBorderColor, borderRadius: (radius * 2)+'rpx'}">
|
|
</view>
|
|
<!-- #endif -->
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: 'fui-countdown-verify',
|
|
emits: ['send', 'countdown', 'end'],
|
|
props: {
|
|
//发送前显示文本
|
|
text: {
|
|
type: String,
|
|
default: '发送验证码'
|
|
},
|
|
//发送中显示文本
|
|
sending: {
|
|
type: String,
|
|
default: '正在发送...'
|
|
},
|
|
//发送后倒计时显示文本(前面会自动拼接时间)
|
|
sent: {
|
|
type: String,
|
|
default: 's后重新获取'
|
|
},
|
|
//倒计时秒数
|
|
seconds: {
|
|
type: [Number, String],
|
|
default: 60
|
|
},
|
|
//宽度
|
|
width: {
|
|
type: [Number, String],
|
|
default: 192
|
|
},
|
|
//高度
|
|
height: {
|
|
type: [Number, String],
|
|
default: 60
|
|
},
|
|
marginLeft: {
|
|
type: [Number, String],
|
|
default: 0
|
|
},
|
|
marginRight: {
|
|
type: [Number, String],
|
|
default: 0
|
|
},
|
|
//圆角
|
|
radius: {
|
|
type: [Number, String],
|
|
default: 8
|
|
},
|
|
//字体大小 rpx
|
|
size: {
|
|
type: [Number, String],
|
|
default: 24
|
|
},
|
|
//字体颜色
|
|
color: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
//背景色
|
|
background: {
|
|
type: String,
|
|
default: 'transparent'
|
|
},
|
|
//边框颜色
|
|
borderColor: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
//自定义参数
|
|
param: {
|
|
type: [Number, String],
|
|
default: 0
|
|
}
|
|
},
|
|
computed: {
|
|
getColor() {
|
|
let color = this.color;
|
|
// #ifdef APP-NVUE
|
|
if (!color || color === true) {
|
|
const app = uni && uni.$fui && uni.$fui.color;
|
|
color = (app && app.primary) || '#465CFF';
|
|
}
|
|
// #endif
|
|
return color
|
|
},
|
|
getBorderColor() {
|
|
let color = this.borderColor;
|
|
// #ifdef APP-NVUE
|
|
if (!color || color === true) {
|
|
const app = uni && uni.$fui && uni.$fui.color;
|
|
color = (app && app.primary) || '#465CFF';
|
|
}
|
|
// #endif
|
|
return color
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
showText: '',
|
|
//1-发送前,2-发送中 3-发送成功,倒计时
|
|
status: 1,
|
|
timer: null
|
|
};
|
|
},
|
|
created() {
|
|
if (this.start) {
|
|
this.doLoop();
|
|
} else {
|
|
this.showText = this.text;
|
|
this.clearTimer();
|
|
}
|
|
},
|
|
// #ifndef VUE3
|
|
beforeDestroy() {
|
|
this.clearTimer();
|
|
},
|
|
// #endif
|
|
// #ifdef VUE3
|
|
beforeUnmount() {
|
|
this.clearTimer();
|
|
},
|
|
// #endif
|
|
methods: {
|
|
sendCode(e) {
|
|
// #ifdef APP-NVUE
|
|
e.stopPropagation();
|
|
// #endif
|
|
if (this.status > 1) return;
|
|
this.clearTimer();
|
|
this.status = 2;
|
|
this.showText = this.sending;
|
|
this.$emit('send', {
|
|
param: this.param
|
|
});
|
|
},
|
|
doLoop() {
|
|
this.clearTimer();
|
|
this.status = 3;
|
|
let seconds = Number(this.seconds || 60);
|
|
this.showText = seconds + this.sent;
|
|
this.timer = setInterval(() => {
|
|
if (seconds > 1) {
|
|
--seconds;
|
|
this.showText = seconds + this.sent;
|
|
this.$emit('countdown', {
|
|
seconds: seconds,
|
|
param: this.param
|
|
});
|
|
} else {
|
|
this.reset();
|
|
this.$emit('end', {
|
|
param: this.param
|
|
});
|
|
}
|
|
}, 1000);
|
|
},
|
|
success() {
|
|
this.doLoop();
|
|
},
|
|
reset() {
|
|
this.clearTimer();
|
|
this.showText = this.text;
|
|
this.status = 1;
|
|
},
|
|
clearTimer() {
|
|
clearInterval(this.timer);
|
|
this.timer = null;
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style scoped>
|
|
.fui-countdown__verify {
|
|
position: relative;
|
|
/* #ifndef APP-NVUE */
|
|
display: flex;
|
|
box-sizing: border-box;
|
|
white-space: nowrap;
|
|
/* #endif */
|
|
align-items: center;
|
|
justify-content: center;
|
|
overflow: hidden;
|
|
/* #ifdef APP-NVUE */
|
|
border-width: 0.5px;
|
|
border-style: solid;
|
|
/* #endif */
|
|
|
|
/* #ifndef APP-NVUE */
|
|
border-width: 0;
|
|
/* #endif */
|
|
}
|
|
|
|
.fui-countdown__verify-main {
|
|
position: absolute;
|
|
left: 0;
|
|
top: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
background-color: transparent;
|
|
/* #ifndef APP-NVUE */
|
|
z-index: 3;
|
|
/* #endif */
|
|
|
|
/* #ifdef H5 */
|
|
cursor: pointer;
|
|
/* #endif */
|
|
}
|
|
|
|
.fui-countdown__verify-active:active {
|
|
background-color: rgba(0, 0, 0, .2);
|
|
}
|
|
|
|
.fui-cdv__disabled {
|
|
opacity: .5;
|
|
}
|
|
|
|
.fui-countdown__verify-text {
|
|
font-weight: normal;
|
|
text-align: center;
|
|
}
|
|
|
|
/* #ifndef APP-NVUE */
|
|
.fui-countdown__verify-line {
|
|
position: absolute;
|
|
width: 200%;
|
|
height: 200%;
|
|
transform-origin: 0 0;
|
|
transform: scale(0.5, 0.5) translateZ(0);
|
|
box-sizing: border-box;
|
|
border-style: solid;
|
|
border-width: 1px;
|
|
left: 0;
|
|
top: 0;
|
|
pointer-events: none;
|
|
z-index: 2;
|
|
}
|
|
|
|
.fui-cdv__color {
|
|
color: var(--fui-color-primary, #465CFF) !important;
|
|
}
|
|
|
|
.fui-cdv__border-color {
|
|
border-color: var(--fui-color-primary, #465CFF) !important;
|
|
}
|
|
|
|
/* #endif */
|
|
</style>
|