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库的最佳方法详细说明及实现代码
Dec 28 Javascript
javascript动态向网页中添加表格实现代码
Feb 19 Javascript
jQuery实现DIV层收缩展开的方法
Feb 27 Javascript
Bootstrap每天必学之轮播(Carousel)插件
Apr 25 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
May 24 Javascript
jQuery无刷新上传之uploadify3.1简单使用
Jun 18 Javascript
jQuery列表检索功能实现代码
Jul 17 jQuery
JavaScript多线程运行库Nexus.js详解
Dec 22 Javascript
JavaScript实现星级评价效果
May 17 Javascript
发布订阅模式在vue中的实际运用实例详解
Jun 09 Javascript
Vue发布项目实例讲解
Jul 17 Javascript
js实现全选和全不选
Jul 28 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中将字符串转为HTML的实体引用的一个类
2013/02/03 PHP
php使用sql数据库 获取字段问题介绍
2013/08/12 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
javascript编程起步(第六课)
2007/01/10 Javascript
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
2013/01/24 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
Vue 2.0入门基础知识之内部指令详解
2017/10/15 Javascript
node.js遍历目录的方法示例
2018/08/01 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
python模拟登陆阿里妈妈生成商品推广链接
2014/04/03 Python
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
python实现将文本转换成语音的方法
2015/05/28 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
基于Python实现扑克牌面试题
2019/12/11 Python
Python图像处理库PIL的ImageGrab模块介绍详解
2020/02/26 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
基于python实现操作git过程代码解析
2020/07/27 Python
一文带你掌握Pyecharts地理数据可视化的方法
2021/02/06 Python
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
致百米运动员广播稿
2014/01/29 职场文书
空乘英文求职信
2014/04/13 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书
Ajax实现三级联动效果
2021/10/05 Javascript