文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

vue如何用element实现区间选择组件

2023-07-04 15:45

关注

这篇文章主要介绍“vue如何用element实现区间选择组件”,在日常操作中,相信很多人在vue如何用element实现区间选择组件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue如何用element实现区间选择组件”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

主要思路

  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('输入值不得小于最小阈值'));},

填坑(重点)

根据上面的写法,组件的基本功能实现了,但是有一个坑!如下:

vue如何用element实现区间选择组件

很显然,左侧值是小于右侧值的,但是校验提示仍然报错。究其原因,还是关联校验的问题。既然是关联交验,改变其中一个时应该会重新校验两个。很简单,在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关联交验时需要验证其关联项,且不能重复校验

全部代码:

<template> <el-form ref="form" :model="form" :rules="rules">  <el-form-item prop="min">   <el-input v-model="form.min" @change="handleMinChange" />  </el-form-item>  ~  <el-form-item prop="max">   <el-input v-model="form.max" @change="handleMaxChange" />  </el-form-item> </el-form></template> <script>const MIN_NUMBER = 1;const MAX_NUMBER = 100000; export default { data() {  return {   form: { min: '20', max: '100000' },   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' },    ],   },  }; }, methods: {  getFormData() {   const ret = {};   this.$refs.form.validate((valid) => {    ret.valid = valid;    ret.form = this.form;   });   return ret;  },  resetForm() {   this.$refs.form.resetFields();  },  handleMinChange() {   this.$refs.form.validateField('max');  },  handleMaxChange() {   this.$refs.form.validateField('min');  },  validateCom(rule, value, callback) {   const one = Number(value);   if (Number.isInteger(one)) {    if (one < MIN_NUMBER) {     return callback(new Error('输入值必须大于0'));    } else if (one > MAX_NUMBER) {     return callback(new Error('输入值必须小于100000'));    }    return callback();   }   return callback(new Error('输入值必须为正整数'));  },  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('输入值不得小于最小阈值'));  }, },};</script>

vue是什么

Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与其它大型框架的区别是,使用Vue可以自底向上逐层应用,其核心库只关注视图层,方便与第三方库和项目整合,且使用Vue可以采用单文件组件和Vue生态系统支持的库开发复杂的单页应用。

到此,关于“vue如何用element实现区间选择组件”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯