• 【uniapp】六格验证码输入框实现


    效果图

    在这里插入图片描述

    代码实现

    <view>
    	<view class="tips">
    	    已发送验证码至
    	    <text class="tips-phone">{{ phoneNumber }}text>
    	view>
    	<view class="code-input-wrap">
    	    <input class="code-input" v-model="codeNumber" type="number" :adjust-position="false" :auto-blur="true" maxlength="6" @input="handleInputClick" />
    	    <view class="code-list">
    	        <block v-for="(item, index) in 6" :key="index">
    	            <view :class="['code-list-item', codeNumber.length == index ? 'active-item' : '']">{{ codeNumber[index] }}view>
    	        block>
    	    view>
    	view>
    	<view class="resending" v-if="isSending">{{ '重新发送(' + counter + 's)' }}view>
    	<view class="normal" v-else @click="handleResend">重新发送view>
    view>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    data() {
        return {
            phoneNumber: '',
            codeNumber: '',
            isPhoneValid: false,
            isCodeValid: false,
            isSending: false, // 验证码是否在发送中
            // 计时器对象
            timer: null,
            // 倒数60秒
            counter: 60
        }
    },
    methods: {
        // 输入验证码
        handleInputClick(e) {
            let val = e.detail.value
            this.codeNumber = val
            if (val && val.length == 6) {
                this.isCodeValid = true
            } else {
                this.isCodeValid = false
            }
        },
        // 获取验证码
        sendSmsCode() {
            if (this.isPhoneValid) {
                // 判断手机号格式是否符合要求
                if (!/^1[3456789]\d{9}$/.test(this.phoneNumber)) {
                    uni.showToast({
                        title: '手机号格式不正确',
                        icon: 'none'
                    })
                    return false
                }
                // 判断复选框
                if (!this.isChecked) {
                    this.showTips = true
                    return false
                }
                // 调用接口,此处代码省略······
            }
        },
        // 倒计时
        countDown() {
            this.counter = 60
            this.isSending = true
            this.timer = setInterval(() => {
                this.counter--
                if (this.counter < 0) {
                    this.reset()
                }
            }, 1000)
        },
        // 重置倒计时
        reset() {
            this.isSending = false
            if (this.timer) {
                clearInterval(this.timer)
                this.counter = 60
                this.timer = null
            }
        },
        // 重新发送
        handleResend() {
            this.codeNumber = ''
            this.sendSmsCode()
        }        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    .tips {
        font-size: 28rpx;
        font-weight: 400;
        line-height: 36rpx;
    
        .tips-phone {
            font-weight: bold;
            margin-left: 20rpx;
        }
    }
    
    // 验证码输入
    .code-input-wrap {
        margin: 40rpx 0;
        position: relative;
        height: 100rpx;
    
        .code-input {
            position: absolute;
            left: 0;
            top: 0;
            height: 100rpx;
            width: 100%;
            opacity: 0;
            z-index: 99;
            outline: none;
        }
        .code-list {
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100rpx;
            display: flex;
            justify-content: space-between;
            .code-list-item {
                // flex: 1;
                width: 90rpx;
                height: 100rpx;
                background: #ffffff;
                border-radius: 16rpx;
                font-size: 36rpx;
                font-weight: 700;
                color: #adb3ba;
                line-height: 100rpx;
                text-align: center;
                margin-right: 10rpx;
                z-index: 5;
                box-sizing: border-box;
            }
            .code-list-item:last-child {
                margin-right: 0;
            }
            .active-item {
                border: 2rpx solid #ff466d;
            }
        }
    }
    .resending {
        font-size: 28rpx;
        font-weight: 500;
        line-height: 36rpx;
        margin-bottom: 60rpx;
        color: #a6acb2;
    }
    .normal {
        font-size: 28rpx;
        font-weight: 500;
        line-height: 36rpx;
        margin-bottom: 60rpx;
        color: #333;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
  • 相关阅读:
    Node工程的依赖包管理方式
    可视化看板有那么多应用场景,该如何快速搭建?可视化工具该如何选择?
    完美解决回车事件使用window.open()打开新窗口行为被浏览器拦截的问题【亲测有效】
    【LeetCode】9. 回文数
    用python实现操作mongodb的插入和查找操作
    Hydra参数
    iOS开发UITableView的使用,区别Plain模式和Grouped模式
    第三章:Qt Creator 之 3.1 Qt Creator特色
    【数据结构——单链表】本篇文章通过图文结合的方式能让你轻松的掌握单链表
    宇泰(UTEK)5口全电口以太网交换机工业级导轨UT-LLDC-5TDS-24正品
  • 原文地址:https://blog.csdn.net/Komorebi_00/article/details/134293053