前端开发小技巧 - 【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>
  • 效果展示:
相关推荐
酉鬼女又兒10 小时前
零基础入门前端 第十三届蓝桥杯省赛 :水果拼盘 Flex一篇过(可用于备赛蓝桥杯Web应用开发)
前端·css·职场和发展·蓝桥杯·css3
wefly201710 小时前
m3u8live.cn:免安装 HLS 在线播放器,流媒体调试效率神器
开发语言·javascript·python·django·ecmascript·hls.js 原理·m3u8 解析
J_liaty10 小时前
JavaScript 基础知识全解析:从入门到精通
开发语言·javascript
weixin1997010801610 小时前
《苏宁商品详情页前端性能优化实战》
前端·性能优化
天若有情67310 小时前
前端HTML精讲02:表单高阶用法+原生校验,告别冗余JS,提升开发效率
前端·javascript·html
蜡台10 小时前
Vue 组件通信的 12 种解决方案
前端·javascript·vue.js·props
吴声子夜歌10 小时前
TypeScript——局部类型、联合类型、交叉类型
javascript·git·typescript
问道飞鱼10 小时前
【前端知识】React Flow : 一个基于 React 的可视化节点编辑器框架
前端·ai工作流·react flow
qq_4061761410 小时前
从零到一掌握 React 核心语法与规则:前端开发者必备指南
前端·react.js·前端框架