欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

vue2之简易的pc端短信验证码的问题及处理方法

程序员文章站 2022-03-20 14:58:33
<提示语部分不要在意(非重点部分)> 简单说下布局(采用的是 vue的element ui的ui框架 )进行布局操作的 子组件模板部分如下(code部分...

vue2之简易的pc端短信验证码的问题及处理方法

<提示语部分不要在意(非重点部分)>

简单说下布局(采用的是 vue的element ui的ui框架 )进行布局操作的

子组件模板部分如下(code部分是很基础的)

<template>
 <div class="forget">
  <el-dialog title="修改新密码" :visible.sync="dialog.visible"
  :close-on-click-modal="false"
     :close-on-press-escape="false"
  >
   <el-form :model="dialog.ruleform" status-icon :rules="rules" :ref="dialog.ruleforms"

      label-width="100px" class="demo-ruleform">
    <el-form-item label="手机号码" prop="phone" required>
     <el-input type="text" v-model.number="dialog.ruleform.phone" autocomplete="off"
        :clearable="true"
     ></el-input>
    </el-form-item>
    <el-form-item label="手机验证码"prop="code" required>
     <div class="send-code">
      <el-input type="text" v-model="dialog.ruleform.code" autocomplete="off"
         maxlength="6"
         show-word-limit
         :clearable="true"
      ></el-input>
      <el-link

        :style="{color:dialog.ruleform.phone.tostring().length===11?'#222':'#999'}"
        type="info" :underline="false"
        :disabled="getdisabled"
        @click="sendcode({
        phone:dialog.ruleform.phone,sendcode:dialog.ruleform.sendcode
        })"
      >{{dialog.ruleform.sendcode}}</el-link>
     </div>
    </el-form-item>
    <el-form-item label="新密码" prop="newpwd" required>
     <el-input :clearable="true" type="password" v-model="dialog.ruleform.newpwd"></el-input>
    </el-form-item>
   </el-form>
   <div slot="footer" class="dialog-footer">
    <el-button @click="cancel">取 消</el-button>
    <el-button type="primary" @click="determine(dialog.ruleforms)"
       :loading="dialog.ruleform.loading"
    >{{dialog.ruleform.loadingtext}}</el-button>
   </div>
  </el-dialog>
 </div>
</template>

子组件逻辑部分如下(code部分是很基础的)

在@/utils/validate.js中的使用正则代码

// 验证手机号码
export const validatphone = /^(^(([0\+]\d{2,3}-)?(0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$)|(13[0-9]|14[5-9]|15[012356789]|166|17[0-8]|18[0-9]|19[8-9])[0-9]{8}$/
//验证密码
export const validatepassword = /^(?=.*\d)(?=.*[a-za-z]).{5,20}$/

<script>
 import {validatphone,validatepassword} from '@/utils/validate'
 export default {
  props:{
   dialog:{
    type:object,
    default: {}
   },
  },
  name: "forget",
  data(){
  // 使用正则进行验证手机号码
   const validatephone = (rule, value, callback) => {
    if (!value) {
     return callback(new error('请输入手机号码'));
    }
    else {
     if (!validatphone.test(value)) {
      callback(new error('请输入手机号码'));
      return
     }
     callback();
    }
   };
   // 使用进行验证手机验证码
   const validatecode = (rule, value, callback) => {
    if (value === '') {
     return callback(new error('请输入验证码'));
    } else {
    //真正环境请修改成自己的逻辑即可
     if (this.dialog.ruleform.code !== '123456') {
      callback(new error('验证码失误,请重新输入'))
      // this.dialog.ruleform.code = ''
      return
     }
     callback();
    }
   };
   // 使用正则进行验证密码
   const validatenewpwd = (rule, value, callback) => {
    if (value === '') {
     callback(new error('请输入密码'));
     return
    } else if (!validatepassword.test(value)) {
     return callback(new error('新密码不合法'));
    } else {
     callback();
    }
   };
   return {
    rules:{ //验证表单元素中的规则
     phone:[
      { validator: validatephone, trigger: ['blur','change'] }
     ],
     code:[
      { validator: validatecode, trigger: ['blur','change'] }
     ],
     newpwd:[
      { validator: validatenewpwd, trigger: ['blur','change'] }
     ],
    },
    timer: null//操作定时器

   }
  },
  computed:{
   //getdisabled() 当手机号码的长度等于11位和点击验证码状态为false时,则可以进行倒计时操作 
   getdisabled(){
    let phone= this.dialog.ruleform.phone
    const ischick = this.dialog.ruleform.ischick
    if(phone.tostring().length === 11 && ischick ===false){
     return false
    }
    else {
     // this.dialog.ruleform.disabled = true
     return true
    }

   }
  },
  methods:{
   // 发送验证码
   sendcode(opt){
    this.$emit('sendcode',opt)
   },
   // 点击取消按钮时触发
   cancel(){
    this.$emit('cancel')
   },
   // 点击确定按钮时触发
   determine(resf){

    this.$refs[resf].validate((valid) => {
     if (valid) {
      this.$emit('determine',resf)
     } else {
      console.log('error submit!!');
      return false;
     }
    });

   },
  }
 }
</script>

子组件逻辑部分如下(code部分是很基础的)

<style scoped lang="scss">
 .forget{
  /deep/ .el-dialog__wrapper{
   .el-dialog{
    max-width: 500px;
    .el-dialog__header{
     text-align: center;
    }
   }
   .demo-ruleform{
    .el-form-item__content{
     max-width:100%
    }
   }
   .el-dialog__body{
    .el-form-item{
     text-align: center;
    }
   }
  }
  .send-code{
   display: flex;flex: 1;justify-content: space-evenly;
   /deep/ .el-input{
    margin-right: 12px
   }
   /deep/ .el-link{
    white-space: nowrap;
    display: inline-block;
    line-height: 1;
    cursor: pointer;
    background: #fff;
    border: 1px solid #dcdfe6;
    color: #606266;
    -webkit-appearance: none;
    text-align: center;
    box-sizing: border-box;
    outline: none;
    margin: 0;
    transition: .1s;
    font-weight: 500;
    -moz-user-select: none;
    -webkit-user-select: none;
    -ms-user-select: none;
    padding: 12px 10px;
    font-size: 14px;
    border-radius: 4px;
   }
  }
  .dialog-footer{
   display: flex;
   flex: 1;
   justify-content: center;
   /deep/ .el-button{
    flex: 0 0 40%;
   }
  }
 }
</style>

父组件中的模板部分

<template>  <forget :dialog="dialog"@cancel="dialog.visible= false" @determine="determine" @sendcode="sendcode"></forget>
</template>

为什么需要使用set这个api方法呢

如下截图

vue2之简易的pc端短信验证码的问题及处理方法

可以学习下这个链接的使用set的例子

全局变量globals.js文件

[vue-set]的文档( cn.vuejs.org/v2/api/#vue… )

说明(*****向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。)

export default {
 //判断是否点击了
 ischick(data,key='disabled',count=0){
  data[key] =true
  if(count<=0){
   data[key] =false
  }
 },
 //此处是重点 使用的vue官网给的api方法
 [vue-set](https://cn.vuejs.org/v2/api/#vue-set)
 sendcode(self,name,k,v){
  self.$set(name,k,v)
 }
}

父组件中的逻辑部分

<script>
 export default {
  data() {
   return {
   // 显示子组件修改密码的对象变量
      dialog: {
     visible: false, //是否显示 
     ruleforms: 'ruleforms', //点击按钮后,需要操作的refs(也就是dom元素)
     ruleform: { //所需要进行在表单中操作的部分
      phone: '',
      newpwd: '',
      code: '',
      sendcode: '发送验证码',
      disabled: false,
      ischick:false,
      loading: false,
      loadingtext: '确 定'
     },
     
    }, 
    //倒计时60秒
     timecount:60
   }
   
  },
  methods:{
   //重点部分
   sendcode60s(self,opt){
    let count=self.timecount;
    const ruleform = self[opt.dialog][opt.ruleform]
    self.timer = setinterval(()=>{
     //这个按钮是
     self.$globals.ischick(ruleform,'disabled',count)
     let code = count<10?`0${count}s后重新发送`: `${count}s后重新发送`
     self.$globals.sendcode(self,ruleform,opt.sendcode,code)
     self.$globals.ischick(ruleform,'ischick',count)
     if(count<=0){
      ruleform.disabled = false
      self.$globals.ischick(ruleform,'disabled')
      code = '发送验证码'
      clearinterval(self.timer)
      count =self.timecount
      self.$globals.sendcode(self,ruleform,opt.sendcode,code)
      self.$globals.ischick(ruleform,'ischick')
     }
     count --
    },1000)

   },
   //发送验证码sendcode
   sendcode(opt){
    const phone = opt.phone
    //判断手机号码第1位是否是数字1开头
    if(phone.slice(0,1)!=='1'){
     this.$message({
      showclose: true,
      message: '请输入正确的手机号码',
      type: 'error'
     });
     return
    }
    this.$confirm(`向${phone}发送短信验证码?`, '提示', {
     confirmbuttontext: '确定',
     cancelbuttontext: '取消',
     type: 'warning'
    }).then(() => {
     this.$message({
      type: 'success',
      message: '发送短信验证码成功!'
     });
     const opt ={
      dialog: 'dialog',
      ruleform: 'ruleform',
      sendcode:'sendcode'
     }
     this.sendcode60s(this,opt)
    }).catch(() => {
     this.$message({
      type: 'info',
      message: '发送短信验证码失败'
     });
    });
   },
   //新的密码
   determine(formname){
    console.log(formname)
    // this.$refs[formname].validate((valid) => {
    //  if (valid) {
    //   this.dialog.ruleform.loading = true
    //   this.dialog.ruleform.loadingtext ='发送中...'
    //  } else {
    //   return false;
    //  }
    // });
   },
   
  }
 }
</script>

总结

以上所述是小编给大家介绍的vue2之简易的pc端短信验证码的问题及处理方法,希望对大家有所帮助