vue3发送验证码倒计时

文章提供了一个Vue函数组件,用于实现发送手机验证码的功能。该组件包含了手机号验证、发送请求、倒计时重发及禁用按钮的状态管理。当手机号格式错误时,会触发配置的失败回调;成功发送后,启动倒计时并禁用发送按钮。
摘要由CSDN通过智能技术生成

import { ref, computed, onUnmounted } from "vue";
import { isValidPhoneNumber } from "@/utils";

interface SendCodeConfig {
  fail?: (msg: string) => void; // 手机号验证失败
  request: (mobile: string) => Promise<void>; // 请求回调
  countDownCount?: number; // 倒计时 默认60秒
}
const useSendCode = (config: SendCodeConfig) => {
  // 是否已经触发过
  const isTriggered = ref(false);
  // 合计时数
  const countDown = ref(0);
  // 定时器
  let timer: NodeJS.Timeout;
  // 是否禁用
  const disabled = computed(() => countDown.value > 0);
  // 发送按钮的文案
  const sendBtnText = computed(() => {
    if (disabled.value) return `${countDown.value}s`;
    if (isTriggered.value) return "再次发送";
    return "发送验证码";
  });
  const send = async (mobile: string): Promise<void> => {
    if (disabled.value) return;
    if (!isValidPhoneNumber(mobile)) {
      console.error("手机号格式错误");
      config.fail && config.fail("手机号格式错误");
      return;
    }
    await config.request(mobile);
    isTriggered.value = true;
    countDown.value = config.countDownCount || 60;
    if (timer) clearInterval(timer);
    timer = setInterval(() => {
      countDown.value--;
      if (countDown.value === 0) clearInterval(timer);
    }, 1000);
  };
  onUnmounted(() => {
    clearInterval(timer);
  });
  return { countDown, send, disabled, sendBtnText };
};

export default useSendCode;

isValidPhoneNumber.js


export function isValidPhoneNumber(str: string): boolean {
  // 检查字符串长度是否为 11 位
  if (str.length !== 11) {
    return false;
  }
  // 检查字符串是否以 "1" 开头
  if (str.charAt(0) !== "1") {
    return false;
  }
  // 使用正则表达式检查字符串是否仅包含数字
  const numericRegex = /^\d+$/;
  if (!numericRegex.test(str)) {
    return false;
  }
  return true;
}

发送验证码按钮的使用


<a-button
  type="primary"
  style="width: 100px; padding: 0"
  @click="handleClickSend"
  :disabled="disabled"
>
  {{ sendBtnText }}
</a-button>

script中使用


/**
 * 发送验证码
 */
const { send, disabled, sendBtnText } = useSendCode({
  countDownCount: 10,
  fail: (msg) => {
    // 手机号验证失败
    message.error(msg, 0);
  },
  request: async (mobile) => {
    // 请求回调
    console.log("请求中", mobile);
    const res = await sendRandomCode({ phoneNumber: mobile });
    console.log("res", res);
    if (!res.success) {
      message.error(res.msg);
    }
  },
});
const handleClickSend = () => send(formState.tel);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中实现验证码倒计时功能的关键是使用定时器来更新倒计时的时间,并根据时间的变化来控制按钮的状态和显示文本。以下是一个实现验证码倒计时功能的Vue代码示例: ```html <template> <button :disabled="isSend" @click="countDown">{{ codeName }}</button> </template> <script> export default { data() { return { isSend: false, codeName: "发送验证码", totalTime: 10, timer: null }; }, methods: { countDown() { if (this.isSend) return; this.isSend = true; this.codeName = this.totalTime + 's后重新发送'; this.timer = setInterval(() => { this.totalTime--; this.codeName = this.totalTime + 's后重新发送'; if (this.totalTime < 0) { clearInterval(this.timer); this.codeName = '重新发送验证码'; this.totalTime = 10; this.isSend = false; } }, 1000); } } }; </script> ``` 在上述代码中,我们使用了一个`isSend`变量来控制按钮的禁用状态,`codeName`变量来控制按钮的显示文本,`totalTime`变量来表示倒计时的总时间,`timer`变量来保存定时器的引用。 在`countDown`方法中,我们首先判断如果已经发送验证码,则直接返回。然后将`isSend`设置为`true`,将`codeName`设置为倒计时的初始文本。接着使用`setInterval`函数创建一个定时器,每隔1秒更新一次倒计时的时间和按钮的显示文本。当倒计时结束时,清除定时器,将`codeName`恢复为重新发送的文本,将`totalTime`重置为初始值,将`isSend`设置为`false`。 这样,当用户点击按钮时,就会触发倒计时功能,按钮会进入禁用状态,并显示倒计时的时间。当倒计时结束后,按钮恢复为可点击状态,并显示重新发送的文本。 #### 引用[.reference_title] - *1* [vue实现验证码倒计时](https://blog.csdn.net/qq_41793354/article/details/121910500)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [vue实现验证码倒计时功能](https://blog.csdn.net/weixin_48168510/article/details/119873604)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值