Files
jobslink-user-clent/components/p-valid-code/p-valid-code.vue
18500206848 91172a730c 11
2024-02-02 14:44:30 +08:00

169 lines
3.0 KiB
Vue
Raw Permalink 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.

<!--
自定义验证码输入密码输入使用
使用方法
maxlength输入最大长度
isPwd是否是密码模式
@finish回调函数
<validcode :maxlength="4" :isPwd="false" @finish="finish"></validcode>
-->
<template>
<view class="code-area">
<view class="flex-box">
<input :value="val" type="number" :focus="true" :maxlength="maxlength" class="hide-input" @input="getVal" @focus="focus"
@blur="blur" />
<view :key="index" v-for="(i,index) in maxlength - 1" v-bind:class="['item', { active: focusing && codeIndex === index }]">
<view class="line"></view>
<block v-if="val.length - 1 < index"></block>
<block v-else-if="isPwd">
<text class="dot">.</text>
</block>
<block v-else> {{ val[index] }}</block>
</view>
<view v-bind:class="['item', { active: focusing && codeIndex >= maxlength - 1 }]">
<view class="line" v-if="val.length - 1 < maxlength - 1"></view>
<block v-else-if="isPwd">
<text class="dot">.</text>
</block>
<block v-else> {{ val[maxlength - 1] }}</block>
</view>
</view>
</view>
</template>
<script>
export default {
props: {
//最大长度 值为4或者6
maxlength: {
type: Number,
default: 4
},
//是否是密码
isPwd: {
type: Boolean,
default: false
}
},
data() {
return {
focusing: true,
val: '', //输入框的值
};
},
methods: {
//取值
getVal(e) {
let {
value
} = e.detail;
if (value.length <= this.maxlength) {
this.val = value;
}
},
//清除验证码或者密码
clear() {
this.val = "";
},
blur() {
this.focusing = false
},
focus() {
this.focusing = true
}
},
computed: {
codeIndex() {
return this.val.length
}
},
watch: {
val(val) {
if (val.length === this.maxlength) {
this.$emit('finish', val);
}
}
}
};
</script>
<style lang="scss">
.code-area {
text-align: center;
.flex-box {
display: flex;
flex-wrap: wrap;
position: relative;
justify-content: space-between;
}
.item {
position: relative;
width: 80upx;
height: 80upx;
margin-right: 18upx;
font-size: 30upx;
font-weight: bold;
color: #333333;
line-height: 80upx;
box-sizing: border-box;
border: 2upx solid #cccccc;
}
.item:last-child {
margin-right: 0;
}
.active {
border-color: #1B66FF
}
.active .line {
display: block;
}
.line {
display: none;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 2upx;
height: 40upx;
background: #1B66FF;
animation: twinkling 1s infinite ease;
}
.hide-input {
position: absolute;
top: 0;
left: -100%;
width: 200%;
height: 100%;
text-align: left;
z-index: 9;
opacity: 1;
}
@keyframes twinkling {
0% {
opacity: 0.2;
}
50% {
opacity: 0.5;
}
100% {
opacity: 0.2;
}
}
.dot {
font-size: 80upx;
line-height: 40upx;
}
}
</style>