前端开发小技巧 - 【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>
  • 效果展示:
相关推荐
我有满天星辰8 分钟前
Vue 指令完全指南:从 Vue 2 到 Vue 3 的演进与实战
前端·javascript·vue.js
光影少年10 分钟前
RN 渲染原理:不依赖WebView,原生控件渲染
前端·react native·react.js·前端框架
小白学过的代码11 分钟前
# flv.js / mpegts.js 播不了国标摄像头(H.265 + G.711A)?纯前端 Jessibuca 无后端方案(附完整代码)
前端·javascript·h.265
console.log('npc')15 分钟前
AI Agent 前端流式渲染核心技术文档(SSE \+ WebSocket \+ 打字机渲染)
前端·人工智能·websocket
法外狂徒125 分钟前
将 Pi Agent 接入 HagiCode 的实践之路
服务器·前端·人工智能
IT_陈寒32 分钟前
React中useEffect的依赖项把我坑惨了
前端·人工智能·后端
广州华水科技1 小时前
单北斗GNSS在变形监测中的优势与应用分析
前端
程序员爱钓鱼2 小时前
Rust 变量与不可变性:为什么默认不能修改变量?
前端·后端·rust
随风一样自由2 小时前
【前端工程化】前端工程化解耦实践:从问题分析到架构重构
前端·重构·架构
vortex52 小时前
Web 渗透测试:未授权与越权漏洞全流程挖掘思路
前端