vue 手写类似手动输入短信验证码的功能

总体思路:

动态添加 :ref=' ' 标识,通过this.$ref(' ') 操作 dom。
1、keyboardClick():点击数字键盘的时候,把对应的值通过vue操作dom的形式,赋值给第一个dom值为“-”的span标签。
2、keyboardDelete():点击删除的时候,通过vue操作dom的形式,将最后一个dom值不为“-”且原始数据对应的值不为“*”的span标签的值赋值为“-”。
3、keyboardSubmit():点击提交的时候,通过vue操作dom的形式,获取所有span标签的值,拼在一起传给后端即可。
效果图:
在这里插入图片描述

1、html

注意: 每个span标签都有一个ref标识 :ref="'numder' + index"

<div class="price_tip" v-if="priceTip">
  <div class="price_text">本次竞猜将消耗11个鸡蛋,请输入您的竞猜价格参与活动吧:</div>
  <div class="price_number">
    <span
      v-for="(item, index) in hxPrice.split('')"
      :key="item"
      :ref="'numder' + index"
    >{
   
   {item == '*' ? '_' : item}}</span>
  </div>
  <div class="price_keyboard">
    <div class="keyboard_left">
      <div class="warp">
        <div class="keyboard_numder" @click="keyboardClick(1)">1</div>
        <div class="keyboard_numder" @click="keyboardClick(2)">2</div>
        <div class="keyboard_numder" @click="keyboardClick(3)">3</div>
      </div>
      <div class="warp">
        <div class="keyboard_numder" @click="keyboardClick(4)">4</div>
        <div class="keyboard_numder" @click="keyboardClick(5)">5</div>
        <div class="keyboard_numder" @click="keyboardClick(6)">6</div>
      </div>
      <div class="warp">
        <div class="keyboard_numder" @click="keyboardClick(7)">7</div>
        <div class="keyboard_numder" @click="keyboardClick(8)">8</div>
        <div class="keyboard_numder" @click="keyboardClick(9)">9</div>
      </div>
      <div class="warp">
        <div class="keyboard_zero" @click="keyboardClick(0)">0</div>
        <div class="keyboard_point" @click="keyboardClick('.')">.</div>
      </div>
    </div>
    <div class="keyboard_right">
      <div class="keyboard_delete" @click="keyboardDelete">
        <img src="./img/delete.png" alt="">
      </div>
      <div class="keyboard_submit" @click="keyboardSubmit">提交</div>
    </div>
  </div>
  <div class="btn" @click="priceTip = false"></div>
  <div class="vertical"></div>
</div>

2、js

export default {
    
    
  data () {
    
    
    return {
    
    
      hxPrice: '**3**', // 后端返回的要竞猜的价格
      hxPriceValue: '', // 提交竞猜价格
      priceTip: true
    }
  },
  methods: {
    
    
    // 猜价格输入点击
    keyboardClick (number) {
    
    
      for (let index = 0; index < this.hxPrice.length; index++) {
    
    
        let value = this.$refs[`numder${
      
      index}`][0].innerHTML
        if (value == '_') {
    
    
          // 1、点击数字键盘的时候,把对应的值通过vue操作dom的形式,赋值给第一个dom值为“-”的span标签。
          this.$refs[`numder${
      
      index}`][0].innerHTML = number
          return
        }
      }
    },
    // 猜价格删除按键
    keyboardDelete () {
    
    
      let hxPriceArr = this.hxPrice.split('')
      for (let index = this.hxPrice.length - 1; index >= 0; index--) {
    
    
        let value = this.$refs[`numder${
      
      index}`][0].innerHTML
        // 2、点击删除的时候,通过vue操作dom的形式,将最后一个dom值不为“-”且原始数据对应的值不为“*”的span标签的值赋值为“-”。
        if (value != '_' && hxPriceArr[index] == '*') {
    
    
          this.$refs[`numder${
      
      index}`][0].innerHTML = '_'
          return
        }
      }
    },
    // 猜价格提交
    keyboardSubmit () {
    
    
      this.hxPriceValue = ''
      for (let index = 0; index < this.hxPrice.length; index++) {
    
    
        let value = this.$refs[`numder${
      
      index}`][0].innerHTML
        if (value == '_') {
    
    
          // this.Native.tip('您输入的数据格式不正确,请重新输入~')
          return
        }
        // 3、点击提交的时候,通过vue操作dom的形式,获取所有span标签的值,拼在一起传给后端
        this.hxPriceValue = `${
      
      this.hxPriceValue}${
      
      value}`
      }
      this.priceTip = false
      // 调接口即可
    },
  },
}

3、css

  // 猜价格弹窗
  .price_tip {
    
    
    width: 100%;
    background: #F8F8F8;
    position: absolute;
    bottom: 0;
    .price_text {
    
    
      margin: 48px 40px 0;
      font-family: PingFangSC-Regular;
      font-size: 32px;
      color: #666666;
      font-weight: 400;
      text-align: left;
    }
    .price_number {
    
    
      margin: 24px 40px;
      background: #FFFFFF;
      border-radius: 4px;
      text-align: center;
      height: 72px;
      line-height: 72px;
      font-family: YouSheBiaoTiHei;
      font-size: 52px;
      color: #576AFF;
      font-weight: 800;
      span {
    
    
        margin-right: 0.32rem;
      }
    }
    .price_keyboard {
    
    
      background: #FFFFFF;
      text-align: center;
      display: flex;
      .keyboard_left {
    
    
        font-family: Roboto-Regular;
        font-size: 60px;
        color: #333333;
        font-weight: 400;
        box-sizing: border-box;
        overflow: hidden;
        flex: 1;
        .warp {
    
    
          display: flex;
        }
        .keyboard_numder {
    
    
          flex: 1;
          height: 106px;
          line-height: 106px;
          border-bottom: 1px solid #F1F1F1;
          border-right: 1px solid #F1F1F1;
        }
        .keyboard_zero {
    
    
          flex: 2;
          border-right: 1px solid #F1F1F1;
        }
        .keyboard_point {
    
    
          flex: 1;
        }
      }
      .keyboard_right {
    
    
        width: 186px;
        float: right;
        .keyboard_delete {
    
    
          height: 106px;
          display: flex;
          align-items: center;
          justify-content: center;
          img {
    
    
            height: 72px;
            width: 72px;
          }
        }
        .keyboard_submit {
    
    
          height: 316px;
          line-height: 316px;
          background: #576AFF;
          font-family: PingFangSC-Semibold;
          font-size: 36px;
          color: #FFFFFF;
          letter-spacing: 0;
          font-weight: 600;
        }
      }
    }
    .btn {
    
    
      width: .8rem;
      height: .8rem;
      background: url('./img/price_close.png') center no-repeat;
      background-size: 100%;
      position: absolute;
      right: 0.32rem;
      top: -1.12rem;
    }
    .vertical {
    
    
      height: 56px;
      width: 10px;
      background-color: #fff;
      position: absolute;
      right: 50px;
      top: -28px;
    }
  }

猜你喜欢

转载自blog.csdn.net/weixin_46447120/article/details/125376197