美文网首页
vue仿支付密码输入框

vue仿支付密码输入框

作者: 二营长家的张大炮 | 来源:发表于2019-05-09 10:33 被阅读0次

    项目中用到的组件为ant-design-vue

    <template>
      <div class="selfpwddiv">
        <p>请输入支付密码</p>
        <div class="am_payPwd" :id="`ids_${id}`">
          <a-input
            type="password"
            maxlength="1"
            @input="changeInput"
            @click="changePwd"
            v-model="pwdList[i]"
            @keyup="keyUp($event)"
            @keydown="oldPwdList = pwdList.length"
            class="shortInput"
            v-for="(v, i) in 6"
            :key="i"
          ></a-input>
        </div>
      </div>
    </template>
    <script>
    export default {
      data() {
        return {
          pwdList: [],
          oldPwdList: [],
          isDelete: false,
          ipt: ""
        };
      },
      props: {
        id: String, // 当一个页面有多个密码输入框时,用id来区分
        default: "1"
      },
      mounted() {
        this.init();
        this.ipt = document.querySelectorAll(`#ids_${this.id} .shortInput`);
      },
      methods: {
        init() {
          this.pwdList = [];
          this.oldPwdList = [];
          this.isDelete = false;
          this.ipt = "";
        },
        keyUp(ev) {
          let index = this.pwdList.length;
          if (!index) return;
          if (ev.keyCode === 8) {
            this.isDelete = true;
            if (this.oldPwdList === this.pwdList.length) {
              if (index === this.pwdList.length) {
                this.pwdList.pop();
              }
              index--;
            } else {
              index > 0 && index--;
            }
            this.ipt[index].focus();
          } else if (
            this.isDelete &&
            index === this.pwdList.length &&
            /^\d$/.test(ev.key)
          ) {
            this.isDelete = false;
            this.pwdList.pop();
            this.pwdList.push(ev.key);
            this.ipt[this.pwdList.length] && this.ipt[this.pwdList.length].focus();
          }
          this.$emit("getPwd", this.pwdList.join(""));
        },
        changePwd() {
          let index = this.pwdList.length;
          index === 6 && index--;
          this.ipt[index].focus();
        },
        changeInput() {
          let index = this.pwdList.length;
          let val = this.pwdList[index - 1];
          if (!/[0-9]/.test(val)) {
            this.pwdList.pop();
            return;
          }
          if (!val) {
            this.pwdList.pop();
            index--;
            if (index > 0) this.ipt[index - 1].focus();
          } else {
            if (index < 6) this.ipt[index].focus();
          }
        }
      }
    };
    </script>
    <style lang="less">
    .selfpwddiv {
      text-align: center;
      p {
        font-size: 16px;
        color: black;
        margin-bottom: 20px;
      }
      .am_payPwd {
        display: inline-block;
        border-radius: 5px;
        padding: 10px 0;
        position: relative;
        overflow: hidden;
        margin-left: 1px;
        .shortInput {
          text-align: center;
          font-size: 20px;
          float: left;
          width: 40px;
          height: 30px;
          color: #333;
          outline: #ff0067;
          &:not(:last-child) {
            border-right: 1px solid #999;
          }
        }
      }
    }
    </style>
    
    image.png

    相关文章

      网友评论

          本文标题:vue仿支付密码输入框

          本文链接:https://www.haomeiwen.com/subject/amyooqtx.html