ele表单验证的数字的坑

2,284 阅读2分钟

ele支持表单验证,对于数字的验证,是这样的

 <el-form  :rules="addRules" ref="addTemp" :model="addTemp"  >
    <el-form-item label="里程:" prop="mileageStart">
        <el-input v-model.number="addTemp.mileageStart" placeholder="请输入里程范围最小值">
        </el-input>
    </el-form-item>
</el-form>
addRules: {
    mileageStart: [
        {type: 'number', message: '必须为数字值', trigger: 'blur'}
    ]
}

坑一 要注意数字的验证需要写v-model.number,才会起作用
坑二 出现的问题是,可以输入数字开头的任意字符串(比如1dede), 于是我加了个 type="number",也就是

<el-input type="number" v-model.number="addTemp.mileageStart" placeholder="请输入里程范围最小值">
</el-input>

这就不能输入非数字,但是e可以,他会转化成3个0,这不用管了。
但是产品才不会让你这么轻松,比如需要保留小数点后2位。那就用自定义的表单验证吧。

 <el-form  :rules="addRules" ref="addTemp" :model="addTemp"  >
    <el-form-item label="里程:" prop="mileageStart">
        <el-input v-model.number="addTemp.mileageStart" placeholder="请输入里程范围最小值">
        </el-input>
    </el-form-item>
</el-form>
// 保留2位小数的验证
var checkNumber = (rule, value, callback) => {
    var num2 = /^([1-9][\d]{0,}|0)(\.\d{1,2})?$/
    value = '' + value
    if (isNaN(value) || !(num2.test(value))) {
        callback(new Error('请输入数字, 保留2位小数'));
    } else {
        callback();
    }
}
addRules: {
    mileageStart: [
        {validator: checkNumber, trigger: 'blur'}
    ]
}

这里的num2在console上可以测试,
坑三 需要num2.test(字符串)才会有效果,
num2.test(数字)的反应很奇怪,不能正常进行验证
因为一开始验证4.这个数字是通过的,于是我就加了value = '' + value,转化成了字符串,还是验证通过,
按照这个正则表达式不应该通过呀
坑四 我就打印这个value,发现输入的4.到这里会变成4,那就是v-model.number和type="number"干的好事了,因为都用正则验证了,这里的number自然是不需要了,就去掉,然后这才ok