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 相关文章推荐
jquery和雅虎的yql服务实现天气预报服务示例
Feb 08 Javascript
JS实现动态给图片添加边框的方法
Apr 01 Javascript
详解参数传递四种形式
Jul 21 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
Jun 28 Javascript
完美解决js传递参数中加号和&amp;号自动改变的方法
Oct 11 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
Oct 13 Javascript
EasyUI 结合JS导出Excel文件的实现方法
Nov 10 Javascript
JS弹性运动实现方法分析
Dec 15 Javascript
Reactjs实现通用分页组件的实例代码
Jan 19 Javascript
angular.fromJson与toJson方法用法示例
May 17 Javascript
浅析Visual Studio Code断点调试Vue
Feb 27 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
May 30 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
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
PHP实现即时输出、实时输出内容方法
2015/05/27 PHP
PHP进行批量任务处理不超时的解决方法
2016/07/11 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
比较新旧两个数组值得增加和删除的JS代码
2013/10/30 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
Bootstrap carousel轮转图的使用实例详解
2016/05/17 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
js 动态给元素添加、移除事件的实现方法
2016/07/19 Javascript
js表单登陆验证示例
2016/10/19 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
Python自动生产表情包
2017/03/17 Python
Flask框架配置与调试操作示例
2018/07/23 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
python 魔法函数实例及解析
2019/09/25 Python
Python基于yield遍历多个可迭代对象
2020/03/12 Python
在python中使用nohup命令说明
2020/04/16 Python
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
毕业生医学检验求职信
2013/10/16 职场文书
后勤人员岗位职责
2013/12/17 职场文书
企业安全标语
2014/06/07 职场文书
2014年干部作风建设总结
2014/10/23 职场文书
服务明星事迹材料
2014/12/29 职场文书
4S店销售内勤岗位职责
2015/04/13 职场文书
储备店长岗位职责
2015/04/14 职场文书
活动简报范文
2015/07/22 职场文书
高中物理教学反思
2016/02/19 职场文书
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL