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 获取元素位置的快速方法 getBoundingClientRect()
Nov 26 Javascript
jQuery的实现原理的模拟代码 -3 事件处理
Aug 03 Javascript
js 获取(接收)地址栏参数值的方法
Apr 01 Javascript
js图片自动切换效果处理代码
May 07 Javascript
JavaScript截取字符串的2个函数介绍
Aug 27 Javascript
AngularJS入门教程之AngularJS表达式
Apr 18 Javascript
基于Vue.js的表格分页组件
May 22 Javascript
微信小程序 Image API实例详解
Sep 30 Javascript
JS创建Tag标签的方法详解
Jun 09 Javascript
Node.js的进程管理的深入理解
Jan 09 Javascript
使用Vant完成Dialog弹框案例
Nov 11 Javascript
jquery实现穿梭框功能
Jan 19 jQuery
详解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
日本因肺炎疫情影响,这几部动漫推延播放!
2020/03/03 日漫
PHP实现抓取迅雷VIP账号的方法
2015/07/30 PHP
Java中final关键字详解
2015/08/10 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
一款JavaScript压缩工具:X2JSCompactor
2007/06/13 Javascript
Javascript 学习笔记 错误处理
2009/07/30 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
2013/06/21 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
javascript 封装Date日期类实例详解
2017/05/28 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
2017/07/20 Javascript
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
2017/12/20 Javascript
vue-cli扩展多模块打包的示例代码
2018/04/09 Javascript
python在多玩图片上下载妹子图的实现代码
2013/08/13 Python
python实现apahce网站日志分析示例
2014/04/02 Python
python中随机函数random用法实例
2015/04/30 Python
Python连接mysql数据库的正确姿势
2016/02/03 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
Python+树莓派+YOLO打造一款人工智能照相机
2018/01/02 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
2018/09/02 Python
Python中list的交、并、差集获取方法示例
2019/08/01 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
python3 常见解密加密算法实例分析【base64、MD5等】
2019/12/19 Python
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
保护环境倡议书500字
2014/05/19 职场文书
师德模范事迹材料
2014/06/03 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
岁月神偷观后感
2015/06/11 职场文书
感谢信
2019/04/11 职场文书
mysql 带多个条件的查询方式
2021/06/05 MySQL
Nginx速查手册及常见问题
2022/04/07 Servers