首页 > 其他分享 >Vue学习笔记之ElementUI的区间设置

Vue学习笔记之ElementUI的区间设置

时间:2023-03-06 16:37:38浏览次数:42  
标签:Vue return form ElementUI refs 校验 笔记 callback ret

<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

相关文章

  • Vue路由传递参数
    路由配置{path:'/manage/detailgovproject',key:'detailgovproject',name:'DetailGovProject',component:DetailGovProject},fromPage.vu......
  • 性能笔记---测试指标
    性能指标响应时间(t):自动化性能测试工具中的响应时间指的是客户端向服务器发起请求到客户端接收到响应所花费的时间吞吐量(快):强调对于某个事务的处理有多快容量(多):则强调......
  • 波特率计算笔记
    一、波特率为9600表示的是串口每秒钟可以传输9600bit,每传输1bit所需时间:1s/9600bit=1000000(us)/9600(bit)=1000/9.6=104.1667us 那么8bit就是104.1667∗8......
  • Java开发笔记之项目启动报错expected at least 1 bean which qualifies as autowire c
    看下spring容器启动时报错,看报错图: 需要检查如下:/**1.application.yml内的mybatis->mapper-location和type-aliases-package路径是否覆盖该对象;2.mapper目录......
  • vue中使用动态组件
    在模板文件中引入<component:is="handleComponent"/>在js中使用consthandleView=(viewUrl)=>import('../'+viewUrl)//引入文件路径exportdefault{da......
  • vue 前端导出
    1.安装依赖npminstall-Sxlsxnpminstall-Sxlsx-style2、导出export插件封装utils/exportExcel.js/** *@file导出export插件封装 */ import*asstyle......
  • Vue父子组件渲染顺序
    创建基本组件结构父组件//father.vue<template><divclass="father">父组件<span>父组件数值:{{val}}</span><button@click="add">父......
  • Vue实例挂载的过程中发生了什么?
    Vue实例挂载的过程中发生了什么?      根元素是不可以放在body或者html上的可以在对象中定义template/render或者直接使用template,el表示元素选择器......
  • 算法笔记之前缀和与差分
    什么是前缀和定义前缀和(PrefixSum):对于一个给定的数列\(a\),它的前缀和数列\(sum\)是通过递推能求出来得\(sum_i=\sum_{j=1}^{i}a_j\)部分和。也就是指某一序列......
  • vue中element table 单选,添加单选框
        参考:https://blog.csdn.net/qq_45780380/article/details/126272154......