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 Ajax 实现加载数据前动画效果的示例代码
Feb 07 Javascript
jquery SweetAlert插件实现响应式提示框
Aug 18 Javascript
引用jquery框架后出错的解决方法
Aug 09 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
Oct 19 Javascript
HTML5 js实现拖拉上传文件功能
Nov 20 Javascript
JavaScript实现二分查找实例代码
Feb 22 Javascript
js实现添加删除表格(两种方法)
Apr 27 Javascript
详解VUE 定义全局变量的几种实现方式
Jun 01 Javascript
使用Vue动态生成form表单的实例代码
Apr 26 Javascript
vue+express 构建后台管理系统的示例代码
Jul 19 Javascript
详解Vscode中使用Eslint终极配置大全
Nov 08 Javascript
JavaScript实现简单的弹窗效果
May 19 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 UBB 解析实现代码
2011/11/27 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
2013/06/01 PHP
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
php Session无效分析资料整理
2016/11/29 PHP
在Laravel中使用DataTables插件的方法
2018/05/29 PHP
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
nodejs中实现阻塞实例
2015/03/24 NodeJs
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
2017/04/13 jQuery
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
webpack打包react项目的实现方法
2018/06/21 Javascript
Postman参数化实现过程及原理解析
2020/08/13 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
全面理解Python中self的用法
2016/06/04 Python
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
python去除字符串中的换行符
2017/10/11 Python
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
详解Python并发编程之创建多线程的几种方法
2019/08/23 Python
python新式类和经典类的区别实例分析
2020/03/23 Python
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
运动会800米加油稿
2014/02/22 职场文书
婚礼主持词开场白
2014/03/13 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
2014年财政局工作总结
2014/12/09 职场文书
民事撤诉申请书范本
2015/05/18 职场文书
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL