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

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

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

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

① 做一个简单的倒计时 

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

倒计时 好做 

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

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

直接上代码

 <nut-button
                v-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-button
                style="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 = 60
    localStorage.setItem(STORAGE_KEY_PREFIX + robotId, nowTime.toString())
  }

  item.timer = setInterval(() => {
    item.countDownTime--
    item.countDownIng = true
    if (item.countDownTime <= 0) {
      localStorage.removeItem(STORAGE_KEY_PREFIX + robotId)
      clearInterval(item.timer)
      item.countDownTime = 60
      item.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 = true
    countDown(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 = 60
  item.countDownIng = false
  if (item.timer) {
    clearInterval(item.timer)
    item.timer = null
  }
}

按钮

<a-button
              type="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.mfbz.cn/a/730105.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

食品行业BC一体化运营方案

一、引言 在当前的市场环境下&#xff0c;食品行业面临着日益激烈的竞争和不断变化的消费者需求。传统的经营模式已无法满足现代消费者对高效、便捷和个性化服务的要求。因此&#xff0c;实施BC&#xff08;Business to Consumer&#xff09;一体化运营方案成为必然选择。通过…

顶顶通呼叫中心中间件-替换授权文件使授权文件生效指南

一、登录my.ddrj.com下载授权文件 登录地址&#xff1a;用户-顶顶通授权管理系统 登录之后正式授权然后点击查看把license.json下载下来&#xff0c;然后替换到fs的授权文件路径&#xff0c;默认路径是&#xff1a;/ddt/fs/conf 如果安装路径不一样就需要自己去看看授权文件存…

分流电阻器的原理、特性、参数要点及其与分压电阻的区别详解

分流电阻器是一种低阻值电阻器&#xff0c;设计用于在电路中并联连接&#xff0c;以提供一个低阻抗的旁路或分流路径&#xff0c;从而使得一部分电流可以通过这个路径流动。它的主要功能是测量或限制电流&#xff0c;尤其适用于大电流检测的应用场景。分流电阻通过在其两端产生…

windows下cmd命令行模式中cd变换路径命令无效的解决办法

一&#xff0c;出现的情况 二&#xff0c;解决方法 当出现转换盘的时候打开 cmd 之后可能是无法生效的 &#xff0c;因为在cmd 中转换盘首先需要用到换盘符 。 Solve1 : 先进行换盘 C: c: // 转换到 C盘 D: d: // 转化到 D盘 Solve2 : 直接进行强转 cd /dE:\ACM算法资源\XCP…

如何使用mvnd,随着mvnd的1.0.0发布,Maven构建速度提升了3倍不止。

maven-mvnd-1.0.0-m8-m40-windows-amd64 1、什么是 Mvnd呢 Mvnd 是 Apache Maven Daemon 的简称&#xff0c;是一个通过 GraalVM 构建的本地可执行文件&#xff0c;用于加速 Maven 构建。Mvnd 的设计理念是通过在后台运行一个守护进程来避免每次构建时启动新的 JVM&#xff0c…

【人机交互 复习】第7章 可视化设计

一、窗口界面类型 1.多文档界面 &#xff08;1&#xff09;优点 a.节省系统资源 b.最小的可视集 c.协同工作区 d.多文档同时可视化 &#xff08;2&#xff09;缺点 a.菜单随活动文档窗口状态变化&#xff0c;导致不一致性 b.文档窗口必须在主窗口内部&#xff0c;减弱多文档显…

易支付宝塔一键部署项目 懒人专用包 制作

宝塔一键部署说明 https://www.bt.cn/bbs/thread-33063-1-1.html 1. auto_install.json {"php_ext":"fileinfo","chmod":[],"success_url":"install/?step3&jump1","php_versions":"80","db…

mybatis查询PostgreSQL报错:无法确定参数 $1 的数据类型

错误信息 ### Cause: org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型 ; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型] with root cause org.postgresql.util.PSQLException: 错误: …

Python3,10行代码,从数据库获取各个维度的数据统计,并把结果输出在Excel中。

10行代码自动统计数据 1、引言2、代码实例3、总结 1、引言 小屌丝&#xff1a;鱼哥帮个忙 小鱼&#xff1a;稍等会哦&#xff0c; 小屌丝&#xff1a;好嘞。 小屌丝&#xff1a; 鱼哥&#xff0c; 还没忙完嘛&#xff1f; 小鱼&#xff1a;快了快了&#xff0c; 再耐心等一等…

缓存雪崩(主从复制、哨兵模式(脑裂)、分片集群)

缓存雪崩&#xff1a; 在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 方法一&#xff1a; 给不同key的TTL添加随机值&#xff0c;以此避免同一时间大量key失效。&#xff08;用于解决同一时间大量key过期&…

重学java 81.类的加载时机

不破不立&#xff0c;人类最宝贝的品质就是勇敢和过去告别 —— 24.6.21 一、类的加载时机 1.new对象 2.new子类对象(new子类对象先初始化父类) 3.执行main方法 4.调用静态成员 5.反射,创建Class对象 这五种情况就可以让类加载到内存 类加载过程 1.问题:谁将class文件加载到了…

智能血压计,让健康“听”得见- WT588F02B血压计语音方案

一、语音血压计开发背景&#xff1a; 在快节奏的现代生活中&#xff0c;健康成为了我们最宝贵的财富。而血压&#xff0c;作为反映人体健康状态的重要指标之一&#xff0c;更是需要我们时刻关注。传统的血压计虽然能够为我们提供准确的血压数据&#xff0c;但往往因为操作复杂…

nodejs从基础到实战学习笔记-模块化、包

二、模块化 2.1 什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 2.1.1 把代码进行模块化拆分的好处 提高了代码的复用性提高了代码的可维护性可以实现按需…

云计算【第一阶段(18)】磁盘管理与文件系统

一、磁盘基础 磁盘&#xff08;disk&#xff09;是指利用磁记录技术存储数据的存储器。 磁盘是计算机主要的存储介质&#xff0c;可以存储大量的二进制数据&#xff0c;并且断电后也能保持数据不丢失。 早期计算机使用的磁盘是软磁盘&#xff08;Floppy Disk&#xff0c;简称…

人工智能在气象预报领域的崛起:GraphCast引领新纪元

最近&#xff0c;谷歌推出的天气预测大模型GraphCast在全球范围内引起了广泛关注&#xff0c;其卓越的表现不仅刷新了人们对AI能力的认知&#xff0c;更预示着传统天气预报工作模式的深刻变革。 GraphCast是一款基于机器学习技术的天气预测工具&#xff0c;它通过深度学习和大数…

Spring事务介绍、Spring集成MyBatis

目录 1.Spring的事务1.1 什么是事务&#xff1f;1.2 事务的特性&#xff08;ACID&#xff09;1.3 Spring 事务实现方式有哪些&#xff1f;1.4 Spring事务管理接口介绍1.4.1 PlatformTransactionManager:事务管理接口1.4.2 TransactionDefinition:事务属性事务管理器接口1.4.3 T…

开发产品要遵循这些「关键规则」

目录 简介 关键规则 第一点&#xff1a;了解产品的操作使用环境 第二点&#xff1a;尽可能计划将来的功能 第三点&#xff1a;静电 ESD 保护 第四点&#xff1a;尽早考虑 BOM 成本 第五点&#xff1a;开发文件管理&#xff08;原理图、BOM、代码等&#xff09; 产品资源…

七个备受欢迎的IntelliJ IDEA实用插件

有了Lombok插件&#xff0c;IntelliJ就能完全理解Lombok注解&#xff0c;使它们能如预期般工作&#xff0c;防止出现错误&#xff0c;并改善IDE的自动完成功能。 作为IntelliJ IDEA的常用用户&#xff0c;会非常喜欢使用它&#xff0c;但我们必须承认&#xff0c;有时这个IDE&…

价值驱动型PMO如何实现项目战略目标?

近期&#xff0c;看到一个帖子&#xff0c;一位PMO&#xff08;小刘&#xff09;吐槽自己就是一个无情的项目推动机器&#xff0c;但还总被领导diss&#xff0c;他不知道问题出在哪了。评论区也有很多项目管理人吐槽自己也踩过类似的坑&#xff0c;那么本期就围绕这个案例展开相…

[火灾警报系统]yolov5_7.0-pyside6火焰烟雾识别源码

国内每年都会发生大大小小的火灾&#xff0c;造成生命、财产的损失。但是很多火灾如果能够早期发现&#xff0c;并及时提供灭火措施&#xff0c;将会大大较小损失。本套源码采用yolov5-7.0目标检测算法结合pyside6可视化界面源码&#xff0c;当检测到火灾时&#xff0c;能否发出…