vue3 中实现 验证码发送 刷新不变倒计时

   今天实现一个倒计时的功能

   在平常开发前端的功能的时候 不管是 移动端还是web端 我们都会有注册 登录 中的发送验证码功能 实现绑定以及注册功能。今天我主要分享一下当前的验证码实现原理。

有两种做法(我目前认为以及看到的)

① 做一个简单的倒计时 

② 实时监测倒计时 刷新还是 当前的时间

倒计时 好做 

无非是一个 setTimeInterval  无非一个倒计时的函数

我只说这个 实时监测倒计时 刷新还是 当前的时间(基础版)

直接上代码

 <nut-buttonv-if="!yzData.countDownIng":disabled="!formatPhoneInput()"size="mini"color="linear-gradient(to right, #5232B7,#7237BC)"@click="getCodeYZM"style="font-size: 8px"type="danger">验证码</nut-button><nut-buttonstyle="color: #5232b7; display: block; width: auto; width: 50px"v-if="yzData.countDownIng">{{ yzData.countDownTime }}s</nut-button>>

这个是按钮

const yzData = reactive({countDownTime: 60,timer: null,countDownIng: false,
});//获取验证码倒计时
const countDown = () => {let startTime = localStorage.getItem("startTimeLogin-dp");let nowTime = new Date().getTime();if (startTime) {let surplus = 60 - parseInt((nowTime - startTime) / 1000, 10);yzData.countDownTime = surplus <= 0 ? 0 : surplus;} else {yzData.countDownTime = 60;localStorage.setItem("startTimeLogin-dp", nowTime);}yzData.timer = setInterval(() => {yzData.countDownTime--;yzData.getCodeDisabled = true;yzData.countDownIng = true;if (yzData.countDownTime <= 0) {localStorage.removeItem("startTimeLogin-dp");clearInterval(yzData.timer);yzData.countDownTime = 60;yzData.countDownIng = false;}}, 1000);
};
const initCount=()=>{let sendEndTime = localStorage.getItem("startTimeLogin-dp");if (sendEndTime) {yzData.countDownIng = true;countDown();}}onMounted(() => {initCount()
});

以上就是将倒计时时间存储在了当前的内存中每一次刷新 都是原来的倒计时时间 除非用户把内存删了 当然 用户一般也不懂这个 也不会去删的

initCount()函数 无非就是当用户刷新的时候 可以每次获取内存中的时间戳 其实逻辑也很简单 代码复制 直接就能使用

下面我说一下 当前的进阶版的倒计时

倒计时 不一定会非在注册验证码 的时候使用 如果在真正的业务逻辑中使用 假如 有十条数据 都需要用到不同的倒计时 我们该怎么办 我上面说的 只是 全局的一个倒计时  因为每个用户打开的注册 登录页面只有一个 如果十条数据都要用到不同的倒计时咋办?

 我还是直接上代码 我说一下我这里的业务逻辑 

这里有一个按钮 哈 我 这里会有不同的机器人 这个按钮点击的时候 会调用接口 后端异步更新商品 但是此时我不想让用户 频繁点击 因为要考虑到性能问题 所以我在这里做了一个倒计时 ,我一开始直接将这个上面的倒计时 用在这里了 发现可以使用 但是切换机器人 还是那个倒计时 不符合我的业务逻辑 所以我需要给每一个机器人一个倒计时对象

希望你能看懂我的业务逻辑再去看下面的代码


const yzData = reactive({countDownTime: 60,timer: null,countDownIng: false,
})
const STORAGE_KEY_PREFIX = 'SynchronizeProductTime-'
const resultYzData = ref({})
const yzDataList = ref([])
//获取验证码倒计时
const countDown = (robotId: any) => {let item: any = getCurrentItem(robotId)let startTime = localStorage.getItem(STORAGE_KEY_PREFIX + robotId)let nowTime = new Date().getTime()if (startTime) {let surplus = 60 - parseInt((nowTime - parseInt(startTime)) / 1000, 10)item.countDownTime = surplus <= 0 ? 0 : surplus} else {item.countDownTime = 60localStorage.setItem(STORAGE_KEY_PREFIX + robotId, nowTime.toString())}item.timer = setInterval(() => {item.countDownTime--item.countDownIng = trueif (item.countDownTime <= 0) {localStorage.removeItem(STORAGE_KEY_PREFIX + robotId)clearInterval(item.timer)item.countDownTime = 60item.countDownIng = false}}, 1000)
}// 清除与指定robotId关联的定时器
const clearTimerForRobotId = (robotId: string) => {const item = yzDataList.value.find(item => item.id === robotId)if (item && item.timer) {clearInterval(item.timer)item.timer = null}
}
const initCountDown = (robotId: any) => {clearTimerForRobotId(robotId)let startTime = localStorage.getItem(STORAGE_KEY_PREFIX + robotId)let item: any = getCurrentItem(robotId)if (startTime) {item.countDownIng = truecountDown(robotId)} else {resetItemCountDown(item)}
}
//获取默认的倒计时item
const getCurrentItem = (robotId: any) => {let item: any = yzDataList.value.find(item => item.id === robotId)if (!item) {item = reactive({ ...yzData, id: robotId }) // 使用新的ID创建一个新的倒计时对象yzDataList.value.push(item) // 添加到列表中,如果需要的话}resultYzData.value = item // 更新当前选中的倒计时对象return item
}
//重置倒计时的使劲按 清楚倒计时
const resetItemCountDown = (item: any) => {item.countDownTime = 60item.countDownIng = falseif (item.timer) {clearInterval(item.timer)item.timer = null}
}

按钮

<a-buttontype="primary"@click="syncRobotProduct":disabled="resultYzData.countDownIng">{{resultYzData.countDownIng? `同步当前机器人商品 ${resultYzData.countDownTime}`: '同步当前机器人商品'}}</a-button>

yzDataList : 当前你需要 给你的每一个数据整理出来 拿到Id 像我这样

data.list.forEach((item: any) => {yzDataList.value.push({id: item.id,countDownTime: 60,timer: null,countDownIng: false,})})

这个id 是区分当前倒计时重要的一点

clearTimerForRobotId: 方法  清楚当前机器人的时间timer 这个很重要 防止你切换机器人 性能 问题 因为你切换了其他的机器人 之前的那个timer 就要被停止

其他的代码都差不多了  主体部分就是 countDown  处理时间的 基本就和基础版的差不多了 就是存了一个id 代表不同的数据

大家可以看看 不懂的call 我就行

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

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

相关文章

今日AI资讯-20240615

1. Follow Your Emoji 一键让照片变表情包 腾讯混元联合港科大、清华大学联合推出肖像动画生成框架Follow Your Emoji&#xff0c;可以通过人脸骨架信息生成任意风格的脸部动画&#xff0c;一键创建表情包。基于算法革新和数据积累&#xff0c;Follow Your Emoji可以支持对脸部…

中电金信:银行业数据中心何去何从

20多年前&#xff0c;计算机走进国内大众视野&#xff0c;计算机行业迎来在国内的高速发展时代。银行业是最早使用计算机的行业之一&#xff0c;也是计算机技术应用最广泛、最深入的行业之一。近年来&#xff0c;随着银行竞争加剧&#xff0c;科技如何引领业务、金融科技如何发…

聊聊DoIP吧(三)-端口号port

DoIP在UDP和TCP建立连接和发送诊断报文的过程中使用的端口定义如下&#xff1a;

【会议】一张图片讲清楚:项目启动会议

另附上启动会前需要准备的内容&#xff1a;

Windows10笔记本如何系统重装?64位电脑重装系统需小心!一键安装超详细步骤!

在日常生活和工作中&#xff0c;我们有时会遇到Windows 10笔记本系统运行缓慢、频繁出现错误或受到病毒攻击等问题。这时&#xff0c;重装系统就成了解决这些问题的最佳选择。然而&#xff0c;对于许多用户来说&#xff0c;尤其是64位电脑用户&#xff0c;重装系统可能是一项既…

18、24年--信息系统工程——系统集成

1、集成基础 系统集成的工作再信息系统项目建设中非常重要,它通过硬件平台、网络通信平台、数据库平台、工具平台、应用软件平台将各类资源有机、高效地集成到一起,形成一个完整的工作台面。系统集成工作的好坏对系统开发、维护有极大的影响。因此,在技术上需要遵循的基本原…

树结构与算法-杨辉三角形的两种实现

什么是杨辉三角形 本文旨在讨论普通杨辉三角形的两种实现方式&#xff1a;迭代法和递归法。我们不详细讲解杨辉三角形的数学问题&#xff0c;只研究其代码实现。 杨辉三角形大致如下图&#xff1a; 杨辉三角形的规律 通过对杨辉三角形的图形分析&#xff0c;我们可以看到这几点…

[JavaScript]何为变量提升?

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/139742129 出自【进步*于辰的博客】 关于编译与解释&#xff0c;详述可查阅博文《[Java]知识点》…

泛微开发修炼之旅--17基于Ecology短信平台,实现后端自定义二开短信发送方案及代码示例

文章链接&#xff1a;17基于Ecology短信平台&#xff0c;实现后端自定义二开短信发送方案及代码示例

《山西教育》教学版是什么级别的刊物?

《山西教育》教学版是什么级别的刊物&#xff1f; 《山西教育(教学版)》创刊于1956年&#xff0c;是由山西教育报刊社主办的教学刊物。山西省一级期刊&#xff0c;是“宣传教育政策&#xff0c;关注教育热点&#xff0c;传播先进经验&#xff0c;提供教改资讯”的权威性期刊&a…

[深度学习]--分类问题的排查错误的流程

原因复现&#xff1a; 原生的.pt 好使&#xff0c; 转化后的 CoreML不好使&#xff0c; 分类有问题。 yolov8 格式的支持情况 Format Argument Suffix CPU GPU 0 PyTorch - .pt True True 1 Tor…

HQChart实战教程73-仿tradingview指标MACD

HQChart实战教程73-仿tradingview指标MACD MACD![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/84d180b5620940f6b9fe08c6f10eb0f3.png)麦语法脚本实心MACD指标脚本效果 空心MACD指标脚本效果图 自定义指标添加到系统指标里HQChart插件源码地址 MACD tradingview中…

在Windows环境下设置定时任务(任务计划程序)(Python)

文章目录 前言一、准备执行的test.py文件二、准备test.bat批处理文件&#xff08;系统环境变量&#xff09;三、设置定时任务&#xff08;任务计划程序&#xff09; 前言 计划任务是系统的常见功能&#xff0c;利用任务计划功能&#xff0c;可以将任何脚本、程序或文档安排在某…

自研一套带双向认证的Android通用网络库

当前&#xff0c;许多网络库基于Retrofit或OkHttp开发&#xff0c;但实际项目中常需要定制化&#xff0c;并且需要添加类似双向认证等安全功能。这意味着每个项目都可能需要二次开发。那么&#xff0c;有没有一种通用的封装方式&#xff0c;可以满足大多数项目需求&#xff1f;…

怎么制作酒店订房功能

在这个快节奏的时代&#xff0c;每一次旅行都如同一次心灵的远航。而酒店&#xff0c;作为旅途中的“避风港”&#xff0c;它的选择显得尤为重要。你是否曾在忙碌的行程中&#xff0c;为了寻找一家心仪的酒店而焦头烂额&#xff1f;是否曾在深夜的街头&#xff0c;为了找到一个…

美式动漫效果PS图层样式

对于追求独特艺术风格和创意的摄影师和设计师来说&#xff0c;一款能够轻松将照片转化为卡通效果的Photoshop模板无疑是一个强大的工具。这款由专业团队精心打造的模板&#xff0c;特别注重于美式动漫风格的呈现&#xff0c;让您的照片瞬间拥有生动且充满魅力的动漫色彩。 模板…

Plonky3和Binius中的Brakedown多项式承诺协议解析及优化(3)

3.2 Expander Graph and Linear-Time Encodable Linear Code 线性时间编码是线性纠错码的一种&#xff0c;核心是扩展图&#xff08;Expander Graph&#xff09;&#xff0c;如下图所示&#xff1a; Figure 3 Expander Graph Expander Graph是一种具有强连通性的稀疏图&#…

Python 引入中文py文件

目录 背景 思路 importlib介绍 使用方法 1.导入内置库 importlib.util 2.创建模块规格对象 spec importlib.util.spec_from_file_location("example_module", "example.py") 3.创建模块对象 module importlib.util.module_from_spec(spec) …

MyBatis基础教程

文章目录 一、MyBatis基本使用1.1简介1.2搭建MyBatis环境1.2.1安装MyBatis1.2.2创建MyBatis核心配置文件1.2.3创建mapper接口1.2.4创建MyBatis映射文件1.2.5实现增加功能 1.3整合log4j1.4修改与删除功能1.5查询功能1.5.1查询单个实体类对象1.5.2查询所有用户信息 二、核心配置文…

“Redis中的持久化:深入理解RDB与AOF机制“

目录 # 概念 1. RDB持久化 1.1 备份是如何执行的&#xff08;RDB过程&#xff09; 1.2 配置文件信息 1.3 RDB持久化操作 1.4 RDB优势 1.5 RDB劣势 1.6 RDB做备份 2. AOF持久化 2.1 AOF开启及使用 2.2 异常恢复 2.3 配置文件操作 2.4 AOF持久化流程 2.5 优点 2.6…