vue 密码输入组件(星号显示输入的内容)

组件代码

<template>
  <div class="text-input">
    <span class="starBox">
      <span class="starItem" v-for="(item,i) in '*'.repeat(text.length)" :key="i" unselectable="on">
        {{item}}
      </span>
    </span>
    <el-input
    class="valInput"
    onpaste="return false" 
    ondragenter="return false"
    type="text"
    ref="inputText"
    v-model="value"
    clearable
    @keyup.native="handelKeyup"
    @clear="clearVal"
    :placeholder="placeholder"
    :maxlength="maxlength" />
  </div>
</template>
<script>
export default {
  props: {
    placeholder: {
      type:String,
      default:'请输入'
    },
    maxlength: { // 最大长度
      type: Number,
      default: 255,
    }
  },
  data() {
    return{
      value:'',
      text: ''
    }
  },
  watch: {
    value(val) {
      if(val){
        if(/.*[\u4e00-\u9fa5]+.*$/.test(val)){
          this.value = val.replace(/[\u4e00-\u9fa5]/gm,'')
          return ;
        }
        this.text += val.replace(/\s*/g,"");
        if(this.text){
          this.value = ' ';
        }
      }
    }
  },
  methods: {
    setInputPaddingLeft(){
      let inputPaddingLeft = `${this.text.length * .5 + 1}rem`;
      // document.documentElement.style.setProperty('--inputPaddingLeft', inputPaddingLeft);
      this.$refs.inputText.$el.querySelector('input').style.paddingLeft = inputPaddingLeft;
      this.$emit("input", this.text);
    },
    clearVal(){
      this.text = '';
      this.setInputPaddingLeft();
    },
    handelKeyup(e){
      // let textVal = '';
      if(e.keyCode == 8){
        this.text = this.text.slice(0,this.text.length - 1);
      }
      if(this.text){
        this.value = ' ';
      }
      this.setInputPaddingLeft();
    }
  }
}
</script>
<style lang="scss" scoped>
  :root{
    --inputPaddingLeft: 1rem;
  }
  /deep/ .valInput{
    input{
      padding-left: var(--inputPaddingLeft,1rem);
    }
  }
  .text-input{
    display:flex;
    align-items:center;
    flex:1;
  }
  .text{
    flex: 1;
  }
  .starBox{
      padding-left: 20px;
      position: absolute;
      z-index: 100;
      .starItem{
        display: inline-block;
        width: .5rem;
        -moz-user-select: none; /*火狐*/
        -webkit-user-select: none; /*webkit浏览器*/
        -ms-user-select: none; /*IE10*/
        -khtml-user-select: none; /*早期浏览器*/
        user-select: none;
      }
  }
</style>

  使用:

可以结合form表单使用

1、引入组件并在components中注册

2、使用

<passWordInput 
                :placeholder="'请输入'" 
                :maxlength="16" 
                v-model="form.againUserPwd"/>

  

posted @ 2020-09-17 15:10  时间脱臼  阅读(2451)  评论(0编辑  收藏  举报