前端开发小技巧 - 【Vue + JavaScript】 - 获取验证码按钮倒计时 + 按钮禁用 功能

前言

  • 本篇文章所使用的技术【Vue3 + Vite + Vant4】;
  • 本文主要针对的业务场景:
    • 需要使用验证码功能的地方;
    • 更多趋向于 登录 或者 修改密码 这块;
  • 以下页面结构只是针对于演示,实际的页面结构还是要大家根据的业务进行搭建;

一、构建基本页面结构

html 复制代码
<template>
    <div class="test-content">
        <van-cell-group inset>
            <van-field v-model="sms" center clearable label="短信验证码" placeholder="请输入短信验证码">
                <template #button>
                    <van-button size="small" type="primary" >
                        获取验证码
                    </van-button>
                </template>
            </van-field>
        </van-cell-group>
    </div>
</template>

<style scoped lang="scss">
    .test-content {
        width: 400px;
        height: 500px;
        margin: 20px auto;
        border: 2px solid red;
    }
</style>
  • 页面结构展示:

二、封装逻辑函数

  • 新建文件 src/utils/countDown.js
js 复制代码
import { ref } from 'vue';

export const countDown = () => {
    // 倒计时的时间
    const countDownTime = ref(120);
    // 倒计时的定时器
    const countDownTimerId = ref(null);
    // 倒计时按钮显示的文本
    const countDownText = ref('获取验证码');
    // 倒计时按钮的禁用状态
    const isCountDownDisabled = ref(false);

    // 倒计时函数
    const getCode = (time) => {
        countDownText.value = `${time}s后重新获取`;
        isCountDownDisabled.value = true;
        countDownTimerId.value = setInterval(() => {
            time--;
            countDownText.value = `${time}s后重新获取`;
            if (time <= 0) {
                clearInterval(countDownTimerId.value);
                countDownText.value = '获取验证码';
                isCountDownDisabled.value = false;
                countDownTime.value = 120;
            }
        }, 1000);
    };

    return { getCode, countDownTime, countDownText, isCountDownDisabled }
};

三、使用逻辑函数

html 复制代码
<script setup>
import { ref } from 'vue';
// 导入 countDown 函数
import { countDown } from '@/utils/countDown.js';
// 执行 countDown 函数,解构返回的数据和函数进行使用
const { getCode, countDownTime, isCountDownDisabled, countDownText } = countDown();
const sms = ref('');
</script>

<template>
  <div class="test-content">
    <van-cell-group inset>
      <van-field v-model="sms" center clearable label="短信验证码" placeholder="请输入短信验证码">
        <template #button>
          <van-button @click="getCode(countDownTime)" size="small" type="primary" :disabled="isCountDownDisabled">{{
            countDownText
          }}</van-button>
        </template>
      </van-field>
    </van-cell-group>
  </div>
</template>
  • 效果展示:
相关推荐
李长渊哦1 小时前
深入理解 JavaScript 中的全局对象与 JSON 序列化
开发语言·javascript·json
Senar3 小时前
如何判断浏览器是否开启硬件加速
前端·javascript·数据可视化
HtwHUAT3 小时前
实验四 Java图形界面与事件处理
开发语言·前端·python
利刃之灵3 小时前
01-初识前端
前端
codingandsleeping4 小时前
一个简易版无缝轮播图的实现思路
前端·javascript·css
天天扭码4 小时前
一分钟解决 | 高频面试算法题——最大子数组之和
前端·算法·面试
全宝4 小时前
🌏【cesium系列】01.vue3+vite集成Cesium
前端·gis·cesium
拉不动的猪5 小时前
简单回顾下插槽透传
前端·javascript·面试
烛阴5 小时前
Fragment Shader--一行代码让屏幕瞬间变黄
前端·webgl
爱吃鱼的锅包肉5 小时前
Flutter路由模块化管理方案
前端·javascript·flutter