<template> <div class="app-container home"> <el-form ref="form" :inline="true" :model="form" :rules="rules"> <el-form-item prop="min"> <el-input v-model="form.min" clearable=""/> </el-form-item> ~ <el-form-item prop="max"> <el-input v-model="form.max" clearable=""/> </el-form-item> <el-form-item> <el-button type="primary" @click="resetForm">重置</el-button> </el-form-item> </el-form> </div> </template> <script> export default { name: "Index", data() { return { // 表单 form: { min: "", max: "", }, // 校验规则 rules: { min: [ { required: true, message: "必填项,请维护", trigger: "blur" }, { validator: this.validateCom, trigger: "blur" }, { validator: this.validateMin, trigger: "blur" }, ], max: [ { required: true, message: "必填项,请维护", trigger: "blur" }, { validator: this.validateCom, trigger: "blur" }, { validator: this.validateMax, trigger: "blur" }, ], }, minNum: 0, //最小值 maxNum: 100, //最大值 }; }, methods: { // 提交时校验 getFormData() { const ret = {}; this.$refs.form.validate((valid) => { ret.valid = valid; ret.form = this.form; }); return ret; }, // 重置表单 resetForm() { this.$refs.form.resetFields(); }, // 基础判断:1、输入值符合 0<num<100,且为正整数的规则 validateCom(rule, value, callback) { const num = Number(value); if (Number.isInteger(num)) { if (num < this.minNum) { return callback(new Error("输入值必须大于0")); } else if (num > this.maxNum) { return callback(new Error("输入值必须小于100")); } return callback(); } return callback(new Error("输入值必须为正整数")); }, // 最小值判断:不得大于最大值 validateMin(rule, value, callback) { const num = Number(value); const max = Number(this.form.max); if (!max || num < max) { return callback(); } return callback(new Error("输入值不得大于最大值")); }, // 最小值判断:不得小于最小值 validateMax(rule, value, callback) { const num = Number(value); const min = Number(this.form.min); if (!min || num > min) { return callback(); } return callback(new Error("输入值不得小于最小值")); }, }, }; </script> <style scoped lang="scss"></style>
根据上面的写法,组件的基本功能实现了,但是有一个坑!如下:
很显然,左侧值是小于右侧值的,但是校验提示仍然报错。究其原因,还是关联校验的问题。既然是关联交验,改变其中一个时应该会重新校验两个。
很简单,在input改变时,重新校验表单不就OK了吗。
handleChange() { this.$refs.form.validate(); }
真实表现正如我们所料,但是当我们打开console的时候,会看到Uncaught (in promise) false
,这又是什么鬼,身为优秀的前端工程师,你定不会允许自己的代码里报错,即使不影响正常流程。
经查证:Promise报错,Uncaught的意思是代表有reject状态没有被catch。究其原因,改变一个值时,校验整个表单时,改变的那个input会执行两次校验,导致异常。
最后做如下修改:
handleMinChange() { this.$refs.form.validateField('max'); }, handleMaxChange() { this.$refs.form.validateField('min'); }, // 并对外暴露操作方法 getFormData() { const ret = {}; this.$refs.form.validate((valid) => { ret.valid = valid; ret.form = this.form; }); return ret; }, resetForm() { this.$refs.form.resetFields(); },
总结:
1. input表单输出值为String类型,即使设置了type=number
2. 关联交验时需要验证其关联项,且不能重复校验
标签:Vue,return,form,ElementUI,refs,校验,笔记,callback,ret From: https://www.cnblogs.com/JetpropelledSnake/p/17184340.html