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 相关文章推荐
JavaScript 仿关机效果的图片层
Dec 26 Javascript
超简单的jquery的AJAX用法
May 10 Javascript
input按钮的事件处理大全
Dec 10 Javascript
21个JavaScript事件(Events)属性汇总
Dec 02 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
Jun 16 Javascript
js获取iframe中的window对象的实现方法
May 20 Javascript
jquery 多个radio的click事件实例
Dec 03 Javascript
vue组件横向树实现代码
Aug 02 Javascript
JavaScript代码调试方法实例小结
Jan 05 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
Jan 05 Vue.js
关于Js中new操作符的作用详解
Feb 21 Javascript
JavaScript组合继承详解
Nov 07 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
DOTA2 探索永无止境 玩家自创强悍插眼攻略
2020/04/20 DOTA
用PHP为SHOPEX增加日志功能代码
2010/07/02 PHP
基于PHP CURL获取邮箱地址的详解
2013/06/03 PHP
php时区转换转换函数
2014/01/07 PHP
php遍历文件夹和文件列表示例分享
2014/03/11 PHP
Thinkphp中的curd应用实用要点
2015/01/04 PHP
php计算数组相同值出现次数的代码(array_count_values)
2015/01/20 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
2016/09/22 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
在html页面中包含共享页面的方法
2008/10/24 Javascript
通过pjax实现无刷新翻页(兼容新版jquery)
2014/01/31 Javascript
node.js 开发指南 ? Node.js 连接 MySQL 并进行数据库操作
2014/07/29 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
微信小程序日历组件使用方法详解
2018/12/29 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
python中字典(Dictionary)用法实例详解
2015/05/30 Python
Python subprocess模块详细解读
2018/01/29 Python
Django打印出在数据库中执行的语句问题
2019/07/25 Python
python读文件的步骤
2019/10/08 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
店长助理岗位职责
2013/12/13 职场文书
车辆委托书范本
2014/10/05 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
通讯稿格式及范文
2015/07/22 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript