注册发送手机短信

**### 整体流程总结

用户点击"获取验证码"按钮触发 `sendSms` 函数
2. 2.
验证手机号格式和非空状态
3. 3.
禁用按钮并调用发送验证码API
4. 4.
启动倒计时(立即更新一次状态消除延迟)
5. 5.
倒计时结束后恢复按钮状态
6. 6.
异常情况下捕获错误并恢复按钮状态**

java 复制代码
      <el-form-item prop="phonenumber">
        <el-row :gutter="10">
          <el-col :span="16">
            <el-input
                v-model="registerForm.phonenumber"
                type="text"
                size="large"
                auto-complete="off"
                placeholder="手机号"
                style="width: 205px;"
            >
              <template #prefix><svg-icon icon-class="phone" class="el-input__icon input-icon" /></template>
            </el-input>
          </el-col>
          <el-col :span="8">
            <el-button type="primary" size="large" @click="sendSms" :disabled="sendCodeDisabled" style="width: 120px;">{{ sendCodeText }}</el-button>
          </el-col>
        </el-row>
      </el-form-item>
java 复制代码
const sendSms = async () => {
  // 验证手机号
  if (!registerForm.value.phonenumber) {
    ElMessage.error('请输入手机号')
    return
  }
  if (!/^1[3-9]\d{9}$/.test(registerForm.value.phonenumber)) {
    ElMessage.error('请输入正确的手机号格式')
    return
  }
  try {
    // 禁用按钮
    sendCodeDisabled.value = true
    // 调用发送验证码API
    /* const response = await sendCode(registerForm.value.phonenumber) */
    ElMessage.success('验证码发送成功')

    // 开始倒计时
    // 立即更新一次状态,消除首次延迟
    countdown.value--;
    sendCodeText.value = `${countdown.value}秒后重新获取`;
    
    const timer = setInterval(() => {
     if (countdown.value <= 1) {
        clearInterval(timer)
        sendCodeText.value = '获取验证码'
        countdown.value = 60
        sendCodeDisabled.value = false
      } else {
        countdown.value--
        sendCodeText.value = `${countdown.value}秒后重新获取`
      }
    }, 1000)
  } catch (error) {
    ElMessage.error(error.msg || '验证码发送失败,请稍后重试')
    sendCodeDisabled.value = false
  }

2.2 发送验证码流程

禁用按钮防止重复点击 : sendCodeDisabled.value = true

调用发送验证码API :(当前代码注释掉,实际项目中需取消注释)

显示成功提示 : ElMessage.success('验证码发送成功') 2.3 倒计时实现(解决首次延迟问题)

java 复制代码
// 立即更新状态,消除首次延迟
countdown.value--;
sendCodeText.value = `${countdown.value}秒后重新获取`;

// 启动定时器
const timer = setInterval(() => {
  if (countdown.value <= 1) {
    // 倒计时结束,重置状态
    clearInterval(timer)
    sendCodeText.value = '获取验证码'
    countdown.value = 60
    sendCodeDisabled.value = false
  } else {
    // 更新倒计时
    countdown.value--
    sendCodeText.value = `${countdown.value}秒后重新获取`
  }
}, 1000)
java 复制代码
const sendCodeDisabled = ref(false) // 控制按钮禁用状态
const countdown = ref(60) // 倒计时秒数
const sendCodeText = ref('获取验证码') // 按钮显示文本
相关推荐
killerbasd8 小时前
牧苏苏传 我不装了 4/7
前端·javascript·vue.js
橘子编程9 小时前
JavaScript与TypeScript终极指南
javascript·ubuntu·typescript
叫我一声阿雷吧10 小时前
JS 入门通关手册(45):浏览器渲染原理与重绘重排(性能优化核心,面试必考
javascript·前端面试·前端性能优化·浏览器渲染·浏览器渲染原理,重排重绘·reflow·repaint
大家的林语冰10 小时前
《前端周刊》尤大开源 Vite+ 全家桶,前端工业革命启动;尤大爆料 Void 云服务新产品,Vite 进军全栈开发;ECMA 源码映射规范......
前端·javascript·vue.js
jiayong2311 小时前
第 8 课:开始引入组合式函数
前端·javascript·学习
天若有情67311 小时前
【C++原创开源】formort.h:一行头文件,实现比JS模板字符串更爽的链式拼接+响应式变量
开发语言·javascript·c++·git·github·开源项目·模版字符串
M ? A12 小时前
Vue 迁移 React 实战:VuReact 一键自动化转换方案
前端·vue.js·经验分享·react.js·开源·自动化·vureact
yuki_uix12 小时前
重排、重绘与合成——浏览器渲染性能的底层逻辑
前端·javascript·面试
Burt12 小时前
我的 2026 全栈选型:Vue3 + Elysia + Bun + AlovaJS
vue.js·全栈·bun
止观止12 小时前
拥抱 ESNext:从 TC39 提案到生产环境中的现代 JS
开发语言·javascript·ecmascript·esnext