element-ui校验表单只能输入数字

1,236 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

接到需求,让表单中只能输入数字,使用v-model的.number可以实现,但是不能以0为开头;又试了rule加type=number校验,输入数组一直报输入的不是数字,原因:el-input的v-model没有:number的修饰,所以rules收到的是字符串,所以判断错误。。最后使用了onkeyup方法

<el-input onkeyup="this.value = this.value.replace(/[^\d]/g,'');" v-model="ruleForm.book" placeholder="书写量" ></el-input>

2.遇到坑:然后遇到了一个问题,当输入其他字符再输入数字的时候,输入框中显示有值,但实际去打印 v-model绑定的变量的时候就获取不到新输入值。即使用了一个函数限制输入框只能输入数字,输入其他将会被置空,在输入1时是正确的,之后我们输入一个非数字,这个非数字并被置空之后,再输入新的数字。v-model的值和value的值出现了不同,v-model无法获取到新输入的数值。

详细原理解析:(参考大佬的)

blog.csdn.net/qq_41635167….

3.解决:在输入框失去焦点的时候,把value值赋值给v-model绑定变量,使两者保持一致

<el-input   
    v-model="ruleForm.book" 
    placeholder="请输入"   
    oninput="value=value.replace(/[^\d.]/g,'')"
    @blur="inputChange">
</el-input>
 
 
 
 
js:
//月薪改变
function inputChange(e){
     this.ruleForm.book = e.target.value
}

还可以直接使用校验方法,这样写法更加简洁 rules: [{ validator: validateNumber, trigger: ‘blur’ }]

   var validateNumber = (rule, value, callback) => {
      console.log('value:' + value)
      if (!(/^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d+)$/).test(value)) {
        callback(new Error('请输入数字值'))
      } else {
        callback()
      }
    }

需要注意的是validateNumber 要写的data里面,但不能写在return里面 使用正则表达式,验证输入的字符是不是数字,且只允许输入一个小数点

网上有许多人建议加在里的onput事件检查,但这样需要再每个input都要加入,一旦要修改,工作量巨大,还容易出错。如果为了这个小功能再封装一个标签,则得不偿失了

由于经验不足,解决以上问题花了一些功夫,特此写出来给新手们参考,高手可以忽略