发布网友
共3个回答
懂视网
本篇文章给大家带来的内容是关于基于element造一个区间选择组件方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
公司的系统中,产品经理在设计时经常要求对某个字段进行区间阈值设置或者作为筛选条件。但是苦于element中没有非常契合的组件(slider组件并不支持两端均能设定),于是自己动手造了一个。
最终的展示效果如下:
这里以项目的需求为例,基本的需求如下:
分为左右值,包含左右值,正整数
左侧必须大于等于1,右侧不得大于100000,右侧值必须不小于左侧
默认:左侧20,右侧100000,均必填
失焦校验
页面和表单校验结构一样:
<el-form ref="form" :model="form" :rules="rules"> <el-form-item prop="min"> <el-input v-model="form.min" /> </el-form-item> ~ <el-form-item prop="max"> <el-input v-model="form.max" /> </el-form-item> </el-form>
单个表单校验:必填项校验、正整数校验、区间校验
关联校验:右侧阈值不得小于左侧阈值
根据上面的思路,单个表单的校验属于公共校验方法,关联校验需要分别校验(因为对比对象不同,且提示语不同),由此在自定义校验中有了如下定义:
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' }, ], },
公共校验方法:正整数校验、区间校验
validateCom(rule, value, callback) { const one = Number(value); if (Number.isInteger(one)) { if (one < MIN_NUMBER) { return callback(new Error(`输入值必须大于${MIN_NUMBER}`)); } else if (one > MAX_NUMBER) { return callback(new Error(`输入值必须小于${MAX_NUMBER}`)); } return callback(); } return callback(new Error('输入值必须为正整数')); },
注意:input输出的始终是字符串类型,需要转换成数字后进行比对
关联校验:
validateMin(rule, value, callback) { const one = Number(value); const max = Number(this.form.max); if (!max || one < max) { return callback(); } return callback(new Error('输入值不得大于最大阈值')); }, validateMax(rule, value, callback) { const one = Number(value); const min = Number(this.form.min); if (!min || one > min) { return callback(); } return callback(new Error('输入值不得小于最小阈值')); },
大概,你会想,这不就完了吗!so easy!现在真正的坑才开始
根据上面的写法,组件的基本功能实现了,但是有一个坑!如下:
很显然,左侧值是小于右侧值的,但是校验提示仍然报错。究其原因,还是关联校验的问题。既然是关联交验,改变其中一个时应该会重新校验两个。很简单,在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(); },
input表单输出值为String类型,即使设置了type=number
关联交验时需要验证其关联项,且不能重复校验
热心网友
<el-table-column type="selection" width="55">,</el-table-column>。
select是一个计算机函数,位于头文件#include <sys/select.h> 。该函数用于监视的文件描述符的变化情况——读写或是异常。
原型:int select (int maxfd + 1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const,struct timeval * timeout)。
热心网友
<el-col :span='7' >
<el-select v-model="item.image" filterable placeholder="请选择" style="width:270px">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value" >
</el-option>
</el-select>
</el-col>
1、数据选择器(data selector) 根据给定的输入地址代码,从一组输入信号中选出指定的一个送至输出端的组合逻辑电路。有时也把它叫做多路选择器或多路调制器(multiplexer)。在多路数据传送过程中,能够根据需要将其中任意一路选出来的电路,叫做数据选择器,也称多路选择器或多路开关。
2、图中的D0、D1、D2、D3是四个数据输入端,Y为输出端,A1、A0是地址输入端。从表中可见,利用指定A1A0的代码,能够从D0、D1、D2、D3这四个输入数据中选出任何一个并送到输出端。因此,用数据选择器可以实现数据的多路分时传送。