element ui数字类型校验的问题

在Vue中使用Element UI时,遇到数字类型校验的问题。输入'1test'能通过校验并保存为1,但关闭并重新打开对话框时,输入框仍显示'1test'。原因是el-form可能有缓存。解决方案是在重置函数中将变量设为空字符串,以确保输入框要求输入数字。

代码

<el-dialog v-dialogDrag width="800px" :visible.sync="dialogVisible" @close="reset" >
	<el-form :model="deviceBox" :rules="rules" ref="deviceBox" label-width="100px">
		<el-form-item label="数量" prop="quantity">
			<el-input v-model.number="deviceBox.quantity"></el-input>
			<!-- <el-input v-model="deviceBox.quantity"></el-input> -->
		</el-form-item>
	</el-form>
	<div slot="footer">
		<el-button @click="dialogVisible = false">取 消</el-button>
		<el-button type="primary" @click="submitForm">确 定</el-button>
	</div>
</el-dialog>
rules: {
	quantity: [
	  {type: 'number', message: '数量必须为数字值'}
	]
}
reset () {
  this.deviceBox = {
	'quantity': 1
  }
}

注意

数字类型的验证需要在 v-model 处加上 .number 的修饰符,这是 Vue 自身提供的用于将绑定值转化为 number 类型的修饰符。

现象

当输入’1test’时,校验通过,提交保存强制转化为1,
当输入’test1’时,校验不通过,提示数量必须为数字值。

问题

当输入’1test’时,校验通过,提交保存强制转化为1。
但是关闭对话框,再打开时,输入框默认显示的不是1而是’1test’,猜测是el-form有缓存导致。
因为虽然每次关闭对话框执行了reset(),但是给deviceBox.quantity设置的值还是1,和’1test’强制转换成的1一致,估计el-form就没有刷新当前的输入框。

结论

在重置函数reset()中设置deviceBox.quantity为任意数值N,输入’Ntest’时都会出现如上所述问题。
只有改reset()强制重置deviceBox.quantity变量为空即可,因为输入框无法输入’‘会提示’数量必须为数字值’:

reset () {
  this.deviceBox = {
	'quantity': ''
  }
}
Element UI表单中进行数字校验,可采用自定义校验规则的方式,以下为你详细介绍几种常见的数字校验方法: ### 整数校验 使用正则表达式判断输入是否为整数。示例代码如下: ```vue <template> <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> <el-form-item label="整数输入" prop="integerValue"> <el-input v-model="ruleForm.integerValue"></el-input> </el-form-item> <el-form-item> <el-button @click="submitForm('ruleForm')">提交</el-button> </el-form-item> </el-form> </template> <script> export default { data() { const validateInteger = (rule, value, callback) => { if (!/^\d+$/.test(value)) { callback(new Error('请输入整数')); } else { callback(); } }; return { ruleForm: { integerValue: '' }, rules: { integerValue: [ { validator: validateInteger, trigger: 'blur' } ] } }; }, methods: { submitForm(formName) { this.$refs[formName].validate((valid) => { if (valid) { alert('表单验证通过'); } else { console.log('表单验证失败'); return false; } }); } } }; </script> ``` 在上述代码中,定义了一个自定义校验函数`validateInteger`,使用正则表达式`/^\d+$/`来判断输入值是否为整数。若不是整数,则通过`callback`返回错误信息;若是整数,则调用`callback()`表示校验通过。 ### 小数校验 通过正则表达式判断输入是否为合法的小数。示例代码如下: ```vue <template> <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> <el-form-item label="小数输入" prop="decimalValue"> <el-input v-model="ruleForm.decimalValue"></el-input> </el-form-item> <el-form-item> <el-button @click="submitForm('ruleForm')">提交</el-button> </el-form-item> </el-form> </template> <script> export default { data() { const validateDecimal = (rule, value, callback) => { if (!/^\d+(\.\d+)?$/.test(value)) { callback(new Error('请输入合法的小数')); } else { callback(); } }; return { ruleForm: { decimalValue: '' }, rules: { decimalValue: [ { validator: validateDecimal, trigger: 'blur' } ] } }; }, methods: { submitForm(formName) { this.$refs[formName].validate((valid) => { if (valid) { alert('表单验证通过'); } else { console.log('表单验证失败'); return false; } }); } } }; </script> ``` 在上述代码中,定义了一个自定义校验函数`validateDecimal`,使用正则表达式`/^\d+(\.\d+)?$/`来判断输入值是否为合法的小数。若不是合法小数,则通过`callback`返回错误信息;若是合法小数,则调用`callback()`表示校验通过。 ### 数字范围校验 可以通过比较输入值是否在指定范围内进行校验。示例代码如下: ```vue <template> <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> <el-form-item label="数字范围输入" prop="rangeValue"> <el-input v-model="ruleForm.rangeValue"></el-input> </el-form-item> <el-form-item> <el-button @click="submitForm('ruleForm')">提交</el-button> </el-form-item> </el-form> </template> <script> export default { data() { const validateRange = (rule, value, callback) => { const num = parseFloat(value); if (isNaN(num) || num < 1 || num > 100) { callback(new Error('请输入1到100之间的数字')); } else { callback(); } }; return { ruleForm: { rangeValue: '' }, rules: { rangeValue: [ { validator: validateRange, trigger: 'blur' } ] } }; }, methods: { submitForm(formName) { this.$refs[formName].validate((valid) => { if (valid) { alert('表单验证通过'); } else { console.log('表单验证失败'); return false; } }); } } }; </script> ``` 在上述代码中,定义了一个自定义校验函数`validateRange`,先将输入值转换为浮点数,然后判断该值是否在1到100的范围内。若不在范围内,则通过`callback`返回错误信息;若在范围内,则调用`callback()`表示校验通过。 ### 同时校验整数和小数 可以结合整数和小数的正则表达式进行校验。示例代码如下: ```vue <template> <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> <el-form-item label="数字输入" prop="numberValue"> <el-input v-model="ruleForm.numberValue"></el-input> </el-form-item> <el-form-item> <el-button @click="submitForm('ruleForm')">提交</el-button> </el-form-item> </el-form> </template> <script> export default { data() { const validateNumber = (rule, value, callback) => { if (!/^\d+(\.\d+)?$/.test(value)) { callback(new Error('请输入合法的数字')); } else { callback(); } }; return { ruleForm: { numberValue: '' }, rules: { numberValue: [ { validator: validateNumber, trigger: 'blur' } ] } }; }, methods: { submitForm(formName) { this.$refs[formName].validate((valid) => { if (valid) { alert('表单验证通过'); } else { console.log('表单验证失败'); return false; } }); } } }; </script> ``` 在上述代码中,定义了一个自定义校验函数`validateNumber`,使用正则表达式`/^\d+(\.\d+)?$/`来判断输入值是否为合法的数字(包括整数和小数)。若不是合法数字,则通过`callback`返回错误信息;若是合法数字,则调用`callback()`表示校验通过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值