美文网首页
vue 改变value 触发 v-model问题

vue 改变value 触发 v-model问题

作者: IceCover | 来源:发表于2021-01-20 15:41 被阅读0次

    原生input 输入框

      <input type="text" v-moneynative="{num:4,couldNegative:true}" v-model="test">
    

    新建一个vue.directive
    该指令限制输入框只能有指定位数的数字

    input + blur

    实时输入实时验证改变值

    // 这个也有缺陷
    const moneynative =  Vue.directive("moneynative",{
      bind(el, binding) {
        var defaultVal = {
          num:2,   //Number小数点位数
          couldNegative:false, //负数?
        }
        let num = Object.assign(defaultVal,binding.value).num
        let couldNegative = Object.assign(defaultVal,binding.value).couldNegative
        el.handler = (e) => {
          if(!e.target.value)return
          let miusFont = (couldNegative && e.target.value.slice(0,1)== '-')?'-':''
          let valueMiddle = e.target.value
          valueMiddle = valueMiddle.toString().replace(/[^\d\.]/g, '');  //如果输入非数字,则替换为''
          //必须保证第一个为数字而不是.
          valueMiddle = valueMiddle.toString().replace(/^\./g,'');
          //前两位不能是0加数字
          valueMiddle = valueMiddle.toString().replace(/^0\d[0-9]*/g,'');
          //保证只有出现一个.而没有多个.
          valueMiddle = valueMiddle.toString().replace(/\.{2,}/g,'.');
          //保证.只出现一次,而不能出现两次以上
          valueMiddle = valueMiddle.toString().replace('.','$#$').replace(/\./g,'').replace('$#$','.');
          //只能输入两位小数 或者多位
          let str = Array.from({length:num}).reduce((total,item)=>{
            return total+='\\d'
          },'')
          let part = `/^(\\-)*(\\d+)\\.(${str}).*$/`
          valueMiddle = valueMiddle.toString().replace(eval(part),'$1$2.$3');
          e.target.value = miusFont+valueMiddle
        }
        el.addEventListener("input", el.handler)
        el.addEventListener("blur", el.handler)
    
      },
      unbind(el) {
        el.removeEventListener('input', el.handler);
        el.removeEventListener("blur", el.handler)
      },
    })
    

    在输入超出位数的时候


    image.png

    value虽然被改变了,但是 相应的 v-model 老是多一位。及时加了blur多触发一次也不行

    修改 change + blur + 额外触发input

    不能实施触发了
    el.dispatchEvent(new Event('input'));

          e.target.value = miusFont+valueMiddle
          el.dispatchEvent(new Event('input'));
        }
        el.addEventListener("change", el.handler)
        el.addEventListener("blur", el.handler)
    
      },
      unbind(el) {
        el.removeEventListener('change', el.handler);
        el.removeEventListener("blur", el.handler)
      },
    

    可以实现需求

    原理是根据v-model也是@input 完成和value的双向绑定

     <input v-model="name" type="text"/>
    
    <input :value="name" @input="name = $event.target.value" type="text"/>
    

    但是在el-element el-input 也有效

    相关文章

      网友评论

          本文标题:vue 改变value 触发 v-model问题

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