Vue3 实现验证码倒计时

news2024/11/26 19:56:10

前言

倒计时的运用场景:获取手机验证码倒计时、获取邮箱验证码倒计时等场景,废话不多说,开始吧。

实现效果

在这里插入图片描述
在这里插入图片描述

实现代码

html(重要部分)

<template>
  <el-button v-if="!sms.disabled" color="#f38301" type="default" @click="send"><span style="color:#eed2b0;">发送验证码</span></el-button>
  <el-button v-else type="default" color="#f38301" disabled><span style="color:#eed2b0;">{{ sms.count }} 秒后重新发送</span></el-button>
</template>

js(重要部分)

<script lang="ts" setup>
  // 验证码计时器
  const sms = reactive({
	disabled: false,
	total: 60,
	count: 0
  })
  // 计时器处理器
  const timerHandler = () => {
	sms.count = sms.total
	sms.disabled = true

	let timer = setInterval(() => {
		if (sms.count > 1 && sms.count <= sms.total) {
			sms.count--
		} else {
			sms.disabled = false
			clearInterval(timer)
		}
	}, 1000)
    }
    // 推送
    const send = () => {  
      if (formLabelAlign.username === '') {
        ElMessage.error("电子邮件为空")
      } else {
        // 计时器处理器
        timerHandler()
        // 加载ui
        const loadingInstance1 =  ElLoading.service({fullscreen: true})
        // api 请求
        return emailRegisterApi(formLabelAlign.username).then(res => {
        // 关闭加载
        loadingInstance1.close()
	  }).catch(() => {
        // 关闭加载
        loadingInstance1.close()
     })
  }
</script>

完整代码

<template>
  <div class="email-main">
    <div class="email-content">
      <div class="email-title">
        <h3>注册报名</h3>
      </div>
      <div class="email-step">
        <el-steps :active="active" finish-status="success" align-center="true">
        <el-step title="邮箱注册" />
        <el-step title="填写报名信息" />
        <el-step title="完成" />
        </el-steps>
      </div>
      <div class="email-table">
        <el-form
        ref="formRef"
        label-position="right"
        :model="formLabelAlign"
        style="width: 460px"
        label-width="100px"
        size="default"
        >
        <el-form-item prop="username" label="邮箱账号">
          <el-input v-model="formLabelAlign.username" />
        </el-form-item>
        <el-form-item prop="region"  label="设置密码">
          <el-input v-model="formLabelAlign.password" />
        </el-form-item>
        <el-form-item prop="code"  label="验证码">
          <el-input v-model="formLabelAlign.code" />
        </el-form-item>
        <el-form-item style="margin-left:50px;">
          <el-button color="#f38301" @click="submitForm">
            <span style="color:#eed2b0;">下一步</span>
          </el-button>
          <el-button color="#f38301" @click="resetForm(formRef)"> <span style="color: #eed2b0;">重置</span></el-button>
		      <el-button v-if="!sms.disabled" color="#f38301" type="default" @click="send"><span style="color:#eed2b0;">发送验证码</span></el-button>
			    <el-button v-else type="default" color="#f38301" disabled><span style="color:#eed2b0;">{{ sms.count }} 秒后重新发送</span></el-button>
        </el-form-item>
        </el-form>
      </div>
    </div>
  </div>
</template>
<script lang="ts" setup>
import { ref,reactive } from 'vue'
import { FormInstance, ElLoading, ElMessage  } from 'element-plus'
import { emailRegisterApi } from '@/api/facade/facade'
import { useRouter } from 'vue-router'
// 路由
const router = useRouter()
// 步骤标识
const active = ref(0)
// 重置
const formRef = ref<FormInstance>()
// 注册参数
const formLabelAlign = reactive({
  username: '',
  password: '',
  code: '',
})
// 验证码计时器
const sms = reactive({
	disabled: false,
	total: 60,
	count: 0
})

// 计时器处理器
const timerHandler = () => {
	sms.count = sms.total
	sms.disabled = true

	let timer = setInterval(() => {
		if (sms.count > 1 && sms.count <= sms.total) {
			sms.count--
		} else {
			sms.disabled = false
			clearInterval(timer)
		}
	}, 1000)
}

const resetForm = (formEl: FormInstance | undefined) => {
  if (!formEl) return
  formEl.resetFields()
}
// 下一步
const submitForm = () => {
  const loadingInstance1 =  ElLoading.service({fullscreen: true})
  if (formLabelAlign.username != '' && formLabelAlign.password != '' && formLabelAlign.code != '') {
    // 跳转到报名页面
    router.push({ path: '/sign_up_info', query: {username: formLabelAlign.username,
    password: formLabelAlign.password, code: formLabelAlign.code} })
  } else {
     ElMessage.warning("请完善全部信息")
  }
  loadingInstance1.close()
}
const send = () => {
  console.log('codeDisabled:',formLabelAlign.username)
  
  if (formLabelAlign.username === '') {
    ElMessage.error("电子邮件为空")
  } else {
    timerHandler()
    const loadingInstance1 =  ElLoading.service({fullscreen: true})
    return emailRegisterApi(formLabelAlign.username).then(res => {
    loadingInstance1.close()
	  }).catch(() => {
      ElMessage.error("Email数据异常")
      loadingInstance1.close()
  })
  }
}
</script>

<style scoped>
.email-main {
  height: 100%;
  width: 100%;
  position: relative;
}
.email-content {
  width: 1200px;
  height: 800px;
  border: 1px;
  position: relative;
  left: 400px;
  background: #f1f3f5;
}
.email-title {
  top: 30px;
  position: relative;
  left: 570px;
  margin-top: 100px;
}
.email-step {
  left: 100px;
  top: 0px;
  position: absolute;
  margin-top: 100px;
  width: 1000px;
}
.email-table {
  left: 350px;
  top: 200px;
  position: absolute;
}
:deep(.el-step__icon.is-text){ 
  border-radius: 50%;
  border: 2px solid #f38301;
  background: #f38301;
  color: #f1f3f5;
 }
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/143412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通达信l2接口如何用?

在股票量化投资领域中&#xff0c;通达信l2接口如何用的知识也是要知道和了解的&#xff0c;像现在特别多的团队已经开发有多种不一样的数据接口系统&#xff0c;主要是方便大家去查询行情的时候&#xff0c;能够很快的从这些l2数据接口中产生数据&#xff0c;直观的显示数据的…

酷早报:2023年1月6日全球Web3加密行业重大资讯大汇总

2023年1月6日 星期五 【数据指标】 加密货币总市值&#xff1a;$0.82万亿 BTC市值占比&#xff1a;39.42% 恐慌贪婪指数&#xff1a;26 恐慌【今日快讯】 1、【政讯】 1.1.1、国际货币基金组织IMF&#xff1a;美国通胀尚未“转危为安” 美联储需加息到底 1.1.2、美联储布拉德&a…

Servlet是什么?有哪些优点?

Servlet是使用Java语言编写的运行在服务器端的程序。狭义的Servlet是指Java语言实现的一个接口&#xff0c;广义的Servlet是指任何实现了这个Servlet接口的类&#xff0c;一般情况下&#xff0c;人们将Servlet理解为后者。Servlet主要用于处理客户端传来的HTTP请求&#xff0c;…

【数组经典题目】总结篇

【数组经典题目】总结篇1 二分法2 双指针法3 滑动窗口4 模拟行为5 总结1 二分法 【数组】leetcode704.二分查找(C/C/Java/Js) 使用暴力解法&#xff0c;通过这道题目&#xff0c;如果追求更优的算法&#xff0c;建议试一试用二分法&#xff0c;来解决这道题目 暴力解法时间复…

机器学习实战教程(十):提升分类器性能利器-AdaBoost

一、前言前面的文章已经介绍了五种不同的分类器&#xff0c;它们各有优缺点。我们可以很自然地将不同的分类器组合起来&#xff0c;而这种组合结果则被成为集成方法(ensemble method)或者元算法(meta-algorithm)。使用集成方法时会有多种形式&#xff1a;可以是不同算法的集成&…

CCF BDCI|算能赛题决赛选手说明论文-02

周伟伟 智能边缘事业部&算法工程师 天翼云科技有限公司 中国-广州 zhouweiweichinatelecom.cn黄宇生智能边缘事业部&算法工程师 天翼云科技有限公司 中国-广州 huangyushchinatelecom.cn林瑞玉智能边缘事业部&算法工程师 天翼云科技有限公司 中国-广州 lin…

适合编程初学者的开源项目:小游戏2048(Flutter版)

目标 为编程初学者打造入门学习项目&#xff0c;使用各种主流编程语言来实现。 2048游戏规则 一共16个单元格&#xff0c;初始时由2或者4构成。 1、手指向一个方向滑动&#xff0c;所有格子会向那个方向运动。 2、相同数字的两个格子&#xff0c;相遇时数字会相加。 3、每次…

【库函数】-了解回调函数,并且手把手带你学习qsort函数!!还不知道的赶快进来看看

&#x1f387;作者&#xff1a;小树苗渴望变成参天大树 &#x1f389;作者宣言&#xff1a;认真写好每一篇博客 &#x1f38a;作者gitee:link 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; qsort&#x1f9e8; 前言✨一、什么是回调函数…

报表生成器FastReport.Net常见问题解答来了 | 联合厂商作答

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。FastReport.NET官方版下…

智云通CRM:如何应对来自竞争对手的阻力?

当销售表明来意后&#xff0c;竞争性客户最常见的回答往往是&#xff1a;“我们和现在的供应商合作得很好。”销售应当牢记&#xff0c;此时我们的目标不是将竞争对手取而代之&#xff0c;而是要努力成为其配角&#xff0c;找机会发现竞争对手能力不足的方面。鉴于此&#xff0…

2023年春节跨年烟花网页特效

粉丝朋友们大家好&#xff0c;我是你们的 csdn的博主&#xff1a;lqj_本人 哔哩哔哩&#xff1a;小淼前端 另外&#xff0c;大家也可以关注我的哔哩哔哩账号&#xff0c;我会不定时的发布一些有关于全栈云开发以及前端开发的详解视频源码 1.微信小程序腾讯云开发之学生端收集数…

搭建VMware ESXi6.7(带图解)

目录 VMware ESXi介绍 准备文件 安装过程 VMware ESXi介绍 VMware ESXi是什么系统&#xff1f; VMware ESXi是可直接安装在物理服务器上的强大的裸机管理系统&#xff0c;不需安装其他操作系统&#xff0c;是VMware服务器虚拟化的基础。通过直接访问并控制底层资源&#x…

操作系统从入门到入土(一)之计算机系统概述

文章目录操作系统的基本概念1.概念2.功能和目标3.特征操作系统的发展操作系统运行环境1.处理器运行环境2.中断和异常3.系统调用系统结构操作系统的基本概念 1.概念 操作系统&#xff08;Operating System&#xff0c; OS&#xff09;是指控制和管理整个计算机系统的硬件和软件…

【C语言】字符串练习,压缩字符串,提取奇偶位(每日小细节015)

前言&#xff1a; 欢迎打开这篇博客&#xff0c;从今天开始&#xff0c;每天和大家分享一个C语言小细节&#xff0c;不久之后还会追加C 一些常常被忽视的小细节和思想统一的编程题目是这个专栏的核心哦 虽然简单但千万别在细节处失分&#xff01;&#xff01;&#xff01;&…

《高效能人士的七个习惯》

专注做有意义的事情。《高效能人士的七个习惯》作者史蒂芬科维&#xff0c;这是一本难得的好书&#xff0c;如果你没有的读过&#xff0c;我推荐你一定要读一下。最近在豆瓣看到一句话说&#xff1a;一定要读经典书籍&#xff0c;因为我们在生活中很难遇到伟大的人物&#xff0…

V2V网络灵敏度分析(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 灵敏度分析是研究与分析一个系统&#xff08;或模型&#xff09;的状态或输出变化对系统参数或周围条件变化的敏感程度的方法。…

Axure绘制登录功能

上一篇文章为大家介绍了一下登录功能的设计思路和相关的流程图&#xff0c;本篇主要带大家从0到1绘制一下B端产品的登录功能如何实现 一、功能解析 本篇主要是针对内部员工使用的B端产品&#xff0c;主要功能如下&#xff1a; ①手机号密码登录 ②忘记密码 ③记住密码 第…

从0到1完成一个Vue后台管理项目(二、使用element-ui)

从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 1.全局引入 下载element-ui cnpm i element-ui -S main.js里引入 这里需要注意的是&#xff0c;我们引入的顺序不能错&#xff0c;一定要按照我这个箭头的顺序来 使用 然后我们按照文档正常使用即可 elem…

Go第 8 章:排序和查找

Go第 8 章&#xff1a;排序和查找 8.1 排序的基本介绍 8.2 冒泡排序的思路分析 8.3 冒泡排序实现 8.4 课后练习 要求同学们能够&#xff0c;不看老师的代码&#xff0c;可以默写冒泡排序法(笔试题) 8.5 查找 2) 请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} &am…

C语言之复合类型下卷(十九)(自然法则)(2023)

上一篇: C语言之复合类型上卷&#xff08;十八&#xff09;&#xff08;阴阳两极&#xff09; 逐梦编程&#xff0c;让中华屹立世界之巅。 简单的事情重复做,重复的事情用心做,用心的事情坚持做&#xff1b; 文章目录前言一、结构体指针二、结构体嵌套指针三、const修饰的结构…