最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

基于element造一个区间选择组件方法介绍

来源:动视网 责编:小采 时间:2020-11-27 19:31:37
文档

基于element造一个区间选择组件方法介绍

基于element造一个区间选择组件方法介绍:本篇文章给大家带来的内容是关于基于element造一个区间选择组件方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。公司的系统中,产品经理在设计时经常要求对某个字段进行区间阈值设置或者作为筛选条件。但是苦于element中没有非常
推荐度:
导读基于element造一个区间选择组件方法介绍:本篇文章给大家带来的内容是关于基于element造一个区间选择组件方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。公司的系统中,产品经理在设计时经常要求对某个字段进行区间阈值设置或者作为筛选条件。但是苦于element中没有非常
 本篇文章给大家带来的内容是关于基于element造一个区间选择组件方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

公司的系统中,产品经理在设计时经常要求对某个字段进行区间阈值设置或者作为筛选条件。但是苦于element中没有非常契合的组件(slider组件并不支持两端均能设定),于是自己动手造了一个。

成果

最终的展示效果如下:

需求

这里以项目的需求为例,基本的需求如下:

  1. 分为左右值,包含左右值,正整数

  2. 左侧必须大于等于1,右侧不得大于100000,右侧值必须不小于左侧

  3. 默认:左侧20,右侧100000,均必填

  4. 失焦校验

页面和表单校验结构一样:

<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>

主要思路

  1. 单个表单校验:必填项校验、正整数校验、区间校验

  2. 关联校验:右侧阈值不得小于左侧阈值

根据上面的思路,单个表单的校验属于公共校验方法,关联校验需要分别校验(因为对比对象不同,且提示语不同),由此在自定义校验中有了如下定义:

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();
},

总结

  1. input表单输出值为String类型,即使设置了type=number

  2. 关联交验时需要验证其关联项,且不能重复校验

文档

基于element造一个区间选择组件方法介绍

基于element造一个区间选择组件方法介绍:本篇文章给大家带来的内容是关于基于element造一个区间选择组件方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。公司的系统中,产品经理在设计时经常要求对某个字段进行区间阈值设置或者作为筛选条件。但是苦于element中没有非常
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top