vue使用Element组件时v-for循环里的表单项验证方法


Posted in Javascript onJune 28, 2018

标题描述看起来有些复杂,有vue,Element,又有表单验证,还有v-for循环?是不是有点乱?不过我相信开发中遇到过此问题的同学,一看就明白我说的意思了。

首先Element组件有一套完善的表单验证方法,官方文档写的也很清楚:Element表单验证API,正常按照官方文档添加rules规则,需要验证的表单项设置prop,然后提交表单时通过form的validate方法验证表单项就可以了。

然鹅问题来了,如果表单项里有通过v-for动态生成的表单项,如何设置验证呢?这个官方文档并没有明确的说法,我们通过查找解决方案和实际验证,总结出来解决方法如下。

首先是循环表单项没有加验证之前的代码:

<template>
 <div class="content-body">
  <el-form ref="form" :model="form" :rules="rules" label-width="120px">
   <el-row :gutter="10">
    <el-col :span="12" :offset="0">
     <el-form-item label="套餐名称:" prop="activityName" id="activityName">
      <el-input v-model="form.activityName"></el-input>
     </el-form-item>
    </el-col>
   </el-row>
   <el-row :gutter="10">
    <el-col :span="12">
     <el-form-item label="状态:">
      <el-radio v-model="form.status" label="1">上线</el-radio>
      <el-radio v-model="form.status" label="0">下线</el-radio>
     </el-form-item>
    </el-col>
   </el-row>
   <el-row :gutter="10">
    <el-col :span="2" style="width:120px;">
     <div class="sub-title">梯度设置:</div>
    </el-col>
    <el-col :span="20">
      <el-row :gutter="10" v-for="(item,index) in form.productGroup" :key="index">
       <el-col :span="6">
        <el-form-item label="商品数量:">
         <el-input v-model="item.num" type="number" size="small" style="width:80px;"></el-input>
        </el-form-item>
       </el-col>
       <el-col :span="6">
        <el-form-item label="优惠价格:">
          <el-input v-model="item.price" type="number" size="small" style="width:80px;"></el-input>
        </el-form-item>
       </el-col>
       <el-col :span="4">
        <i class="el-icon-remove-outline" @click="deleteLadder(index)"></i>  
        <i class="el-icon-circle-plus-outline" @click="addLadder" v-if="index==0"></i>
       </el-col>
      </el-row>
    </el-col>
   </el-row>
   <el-form-item size="medium" class="div-submit">
    <el-button @click="resetForm('form')">取消</el-button>
    <el-button type="primary" @click="submitForm('form')">提交</el-button>
   </el-form-item>
  </el-form>
 </div>
</template>
<script>
/* eslint-disable */
export default {
 data() {
  return {
   form: {
    activityName: '',
    status: '1',
    productGroup: [{num:"",price:""}]
   },
   rules: {
    activityName: [
     { required: true, message: '请输入套餐名称', trigger: 'blur' }
    ]
   }
  }
 },
 methods: {
  deleteLadder(index)
  {
   if(this.form.productGroup.length>1){
    this.form.productGroup.splice(index,1);
   }
  },
  addLadder()
  {
   this.form.productGroup.push({num:"",price:""});
  },
  submitForm(formName)
  {
   console.log("activityName...",this.form.activityName);
   this.$refs[formName].validate((valid,obj) => {
    if (valid) {
     this.submitFormAction();
    } else {
     this.$message.error("验证不通过");
    }
   });
  },
  submitFormAction()
  {
   this.$message.success("提交成功");
  },
  resetForm(formName)
  {
   this.$refs[formName].resetFields();
   this.form.productGroup = [{num:"",price:""}];
  }
 }
}

</script>
<style>
.el-form-item {
 margin-bottom: 20px;
}
</style>

首先是添加rules规则,这个和正常添加规则一样:

productGroupRules: {
 productGroupNum: [{required: true, message: '请填写商品数量', trigger: 'blur'}],
 productGroupPrice: [{required: true, message: '请填写优惠价格', trigger: 'blur'}]
}

然后给表单项添加验证,以商品数量为例:

<el-form-item label="商品数量:" :prop="'productGroup.'+index+'.num'" :rules="productGroupRules.productGroupNum">
 <el-input v-model="item.num" type="number" size="small" style="width:80px;"></el-input>
</el-form-item>

注意这里:rules是每个表单项都要添加,有多个的话用productGroupRules.productGroupNum这样的形式区分,对应上面productGroupRules里的内容。

另外主要就是:prop了,注意正常验证表单项是prop,而这里是:prop
:prop="'productGroup.'+index+'.num'"是拼接的形式,前面是v-for绑定的数组,中间是数组索引index,最后是表单项绑定的v-model的名称,然后用点.把它们连接起来。这三项都必须保证正确,错一个都无法验证。

另外就是要注意,v-for绑定的数组也必须绑定在form对象里,注意上面的data里:

form: {
 activityName: '',
 status: '1',
 productGroup: [{num:"",price:""}]
}
如果是:

form: {
 activityName: '',
 status: '1'
},
productGroup: [{num:"",price:""}]

是无法验证的,这一点也要注意。

好了,以上就是解决vue使用Element组件时v-for循环里的表单项验证的解决方案了,希望能帮助到遇到此问题的同学。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
表单切换,用回车键替换Tab健(不支持IE)
Jul 20 Javascript
javascript:void(0)的作用示例介绍
Oct 28 Javascript
Jquery倒计时源码分享
May 16 Javascript
javascript函数特点实例分析
May 14 Javascript
JS组件系列之Bootstrap Icon图标选择组件
Jan 28 Javascript
jQuery validate 验证radio实例
Mar 01 Javascript
uploader秒传图片到服务器完整代码
Apr 22 Javascript
原生js实现trigger方法示例代码
May 22 Javascript
基于Vue SEO的四种方案(小结)
Jul 01 Javascript
浅谈vue项目,访问路径#号的问题
Aug 14 Javascript
OpenLayers3实现测量功能
Sep 25 Javascript
动态实现element ui的el-table某列数据不同样式的示例
Jan 22 Javascript
详解ES6中的三种异步解决方案
Jun 28 #Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
Jun 28 #Javascript
使用vue-router完成简单导航功能【推荐】
Jun 28 #Javascript
vue如何引入sass全局变量
Jun 28 #Javascript
小程序实现带年月选取效果的日历
Jun 27 #Javascript
浅谈Angular6的服务和依赖注入
Jun 27 #Javascript
JS实现获取进今年第几天是周几的方法分析
Jun 27 #Javascript
You might like
php 读取shell管道传输过来的内容
2010/03/01 PHP
php简单防盗链实现方法
2015/07/29 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
PHP 多任务秒级定时器的实现方法
2018/05/13 PHP
ThinkPHP实现的rsa非对称加密类示例
2018/05/29 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
SinaEditor使用方法详解
2013/12/28 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
2016/04/12 Javascript
VUE2.0中Jsonp的使用方法
2018/05/22 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
2019/08/26 Javascript
ES6字符串的扩展实例
2020/12/21 Javascript
python自动安装pip
2014/04/24 Python
python网络编程之数据传输UDP实例分析
2015/05/20 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
html5服务器推送_动力节点Java学院整理
2017/07/12 HTML / CSS
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2012/05/24 面试题
海量信息软件测试笔试题
2015/08/08 面试题
音乐专业应届生教师求职信
2013/11/04 职场文书
志愿者活动总结报告
2014/06/27 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
法院授权委托书格式
2014/09/28 职场文书
乒乓球比赛通知
2015/04/27 职场文书
2015年学校教务处工作总结
2015/05/11 职场文书
冰雪公主观后感
2015/06/16 职场文书
2019年英语版感谢信(8篇)
2019/09/29 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书
java objectUtils 使用可能会出现的问题
2022/02/28 Java/Android