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的监控数据是否发生改变
Apr 11 Javascript
判断文件是否正在被使用的JS代码
Dec 21 Javascript
通过$(this)使用jQuery包装后的方法或属性
May 18 Javascript
基于javascript实现单选及多选的向右和向左移动实例
Jul 25 Javascript
jQuery与JS加载事件用法分析
Sep 04 Javascript
canvas实现图像放大镜
Feb 06 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
Feb 14 Javascript
Vue.extend构造器的详解
Jul 17 Javascript
深入了解响应式React Native Echarts组件
May 29 Javascript
JavaScript 中判断变量是否为数字的示例代码
Oct 22 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
Nov 06 Javascript
js 执行上下文和作用域的相关总结
Feb 08 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访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
PHP高级对象构建 工厂模式的使用
2012/02/05 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
JS定义回车事件(实现代码)
2013/07/08 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
什么是Node.js?Node.js详细介绍
2014/06/01 Javascript
5款JavaScript代码压缩工具推荐
2014/07/07 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
Python实现的ini文件操作类分享
2014/11/20 Python
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
详解Python文件修改的两种方式
2019/08/22 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
2019/10/04 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
python给list排序的简单方法
2020/12/10 Python
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
英国领先的奢侈品零售商之一:CRUISE
2016/12/02 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
介绍一下SOA和SOA的基本特征
2016/02/24 面试题
国际经济贸易专业推荐信
2013/11/06 职场文书
亲子运动会的活动方案
2014/08/17 职场文书
2014年祖国生日寄语
2014/09/19 职场文书