Vue学习笔记之ElementUI的区间设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | <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. 关联交验时需要验证其关联项,且不能重复校验
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2019-03-06 K8S学习笔记之Flannel解读