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 相关文章推荐
客户端js性能优化小技巧整理
Nov 05 Javascript
百度判断手机终端并自动跳转js代码及使用实例
Jun 11 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
Oct 31 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
Sep 04 Javascript
javascript中异常处理案例(推荐)
Oct 03 Javascript
vue中v-model动态生成的实例详解
Oct 27 Javascript
结合mint-ui移动端下拉加载实践方法总结
Nov 08 Javascript
Thinkjs3新手入门之如何使用静态资源目录
Dec 06 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
Feb 28 Javascript
Node.js原生api搭建web服务器的方法步骤
Feb 15 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
Sep 19 Javascript
详解vue中多个有顺序要求的异步操作处理
Oct 29 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运行环境配置的详解
2013/06/04 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
php获取根域名方法汇总
2014/10/28 PHP
php跨站攻击实例分析
2014/10/28 PHP
微信支付扫码支付php版
2016/07/22 PHP
Zend Framework框架中实现Ajax的方法示例
2017/06/27 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
php实现JWT验证的实例教程
2020/11/26 PHP
JavaScript 中的事件教程
2007/04/05 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
2016/05/09 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
2016/08/15 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
jQuery实现根据生日计算年龄 星座 生肖
2016/11/23 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
jQuery中Datatables增加跳转到指定页功能
2017/02/08 Javascript
js 调用百度分享功能
2017/02/27 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
vue-froala-wysiwyg 富文本编辑器功能
2019/09/19 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
Python离线安装PIL 模块的方法
2019/01/08 Python
Python控制Firefox方法总结
2019/06/03 Python
学习Django知识点分享
2019/09/11 Python
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
集体婚礼证婚词
2014/01/13 职场文书
公司前台辞职报告
2014/01/19 职场文书
社区服务标语
2014/07/01 职场文书
作文评语怎么写
2014/12/25 职场文书
2015年国庆节广播稿
2015/08/19 职场文书