获取验证码在倒计时未完成前清除验证码

场景:

在点击获取验证码后,验证码开始倒计时,在点击登录后,出现弹窗不跳转页面。因此在出现弹窗后,即使倒计时没有结束,也要将倒计时的文字变为重新获取验证码。

template代码
javascript 复制代码
    <div class="form-box">
      <el-form ref="form" :model="form">
        <el-form-item prop="phoneNo">
          <el-input
            v-model="form.phoneNo"
            type="number"
            placeholder="请输入手机号"
          >
          </el-input>
        </el-form-item>
        <el-form-item prop="validateCode" class="code">
          <el-input
            v-model="form.validateCode"
            placeholder="请输入验证码"
            maxlength="6"
          >
          </el-input>
          <el-button
            :disabled="btnStatus"
            @click="getMyCode"
            class="code-btn"
            >{{ codeMessage }}</el-button
          >
        </el-form-item>
        <el-form-item>
          <el-button class="form-subimt" @click="toLoginH5">登录</el-button>
        </el-form-item>
      </el-form>
    </div>
css代码
javascript 复制代码
  .form-box {
    padding: 0px 20px 0px 20px;
    margin-bottom: 24px;
    ::v-deep .el-form-item {
      margin-bottom: 12px;
    }
    ::v-deep .el-input__inner {
      border: none;
      border-radius: 30px;
    }
    ::v-deep .el-form-item__content {
      margin-left: 0px;
      display: flex;
    }
    .code {
      background: #fff;
      border-radius: 30px;
      /deep/.el-input {
        width: 60%;
      }
      //   ::v-deep .el-form-item__content {
      //     margin-left: 0px;
      //   }

      /deep/.el-button {
        border-radius: 20px;
        // width: 43%;
        padding: 12px;
        // margin-left: 2%;
        background: #fff;
        color: #1448ff;
        border: none;
        flex: 1;
        text-align: right;
      }
    }
    .form-subimt {
      border-radius: 30px;
      background: radial-gradient(
          85.8% 72.34% at 49.85% 92.55%,
          #349eff 0%,
          rgba(53, 72, 255, 0) 100%
        ),
        linear-gradient(180deg, rgba(53, 71, 255, 0) 15.92%, #3385ff 102.36%),
        linear-gradient(89deg, #1463ff -5.8%, #7214ff 119.36%);
      box-shadow: 0px 4px 10px 0px rgba(20, 72, 255, 0.2);
      width: 100%;
      color: #fff;
      text-align: center;
      font-family: PingFang SC;
      font-size: 16px;
      font-style: normal;
      font-weight: 600;
      line-height: 24px; /* 150% */
      margin-top: 8px;
      height: 48px;
    }
  }
js代码
javascript 复制代码
data(){
 timePromise: null,
 codeMessage: "获取验证码",
 btnStatus: false,
}

 //登陆
    toLoginH5() {
      if (this.form.phoneNo === "") {
        this.$message.error("请输入手机号");
        return false;
      }
      if (
        !/^(13[0-9]|14[01456879]|15[0-3,5-9]|16[2567]|17[0-8]|18[0-9]|19[0-3,5-9])\d{8}$/.test(
          this.form.phoneNo
        )
      ) {
        this.$message.error("手机号格式错误");
        return false;
      }
      if (!this.form.validateCode.length) {
        this.$message.error("请输入验证码");
        return false;
      }
      loginH5({
        telephone: this.form.phoneNo,
        validateCode: this.form.validateCode,
      }).then((res) => {
        if (res.data.data.type == 1) {
          this.showModalAlready = true;  弹窗开关
          clearInterval(this.timePromise);  在获取到结果后就清除倒计时
          this.codeMessage = "重发验证码";
          this.btnStatus = false;
          this.form = {
            phoneNo: "",
            validateCode: "",
          };
      });
    },
    //获取验证码
    getMyCode() {
      this.btnStatus = true;
      if (this.form.phoneNo == "") {
        this.btnStatus = false;
        return false;
      }
      if (
        !/^(13[0-9]|14[01456879]|15[0-3,5-9]|16[2567]|17[0-8]|18[0-9]|19[0-9])\d{8}$/.test(
          this.form.phoneNo
        )
      ) {
        this.btnStatus = false;
        return false;
      }
      var second = null;
      this.timePromise = undefined;
      if (second === null) {
        second = 60;
        getCode({ phoneNo: this.form.phoneNo })
          .then((res) => {
            if (res.data.code == "0") {
              this.$message.success("验证码发送成功");
              this.loading = false;
              const _this = this;
              this.timePromise = setInterval(function () {
                if (second <= 0) {
                  clearInterval(this.timePromise);
                  this.timePromise = undefined;
                  second = null;
                  _this.codeMessage = "重发验证码";
                  _this.btnStatus = false;
                } else {
                  _this.codeMessage = second + "s";
                  second--;
                }
              }, 1000);
            } else {
              this.loading = false;
              this.$message.error(res.data.msg);
            }
          })
          .catch((err) => {
            this.btnStatus = false;
            this.loading = false;
            second = null;
          });
      } else {
        return false;
      }
    },
相关推荐
神之王楠1 分钟前
如何通过js加载css和html
javascript·css·html
余生H6 分钟前
前端的全栈混合之路Meteor篇:关于前后端分离及与各框架的对比
前端·javascript·node.js·全栈
花花鱼6 分钟前
@antv/x6 导出图片下载,或者导出图片为base64由后端去处理。
vue.js
程序员-珍9 分钟前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
axihaihai13 分钟前
网站开发的发展(后端路由/前后端分离/前端路由)
前端
流烟默25 分钟前
Vue中watch监听属性的一些应用总结
前端·javascript·vue.js·watch
2401_8572979135 分钟前
招联金融2025校招内推
java·前端·算法·金融·求职招聘
茶卡盐佑星_1 小时前
meta标签作用/SEO优化
前端·javascript·html
与衫1 小时前
掌握嵌套子查询:复杂 SQL 中 * 列的准确表列关系
android·javascript·sql
Ink1 小时前
从底层看 path.resolve 实现
前端·node.js