使用element-ui +Vue 解决 table 里包含表单验证的问题

应用场景:

在实际使用中经常会遇到需要在Form表单中使用table表格进行表单提交,同时又需要对table的字段进行校验,效果如图所示:

这个校验中,最关键的问题在于如何给el-form-item 动态绑定prop。

:prop="'tableData.' + scope.$index + '.字段名'"

方法一:

<template>
 <div class="app-container">
   <el-form :model="fromData" ref="from">
    <el-table :data="fromData.domains">
     <el-table-column label="姓名">
      <template slot-scope="scope">
       <el-form-item :prop="'domains.'+scope.$index+'.name'" :rules="fromaDataRules.name">
        <el-input v-model="scope.row.name"></el-input>
       </el-form-item>
      </template>
     </el-table-column>
     <el-table-column label="地址">
      <template slot-scope="scope">
       <el-form-item :prop="'domains.'+scope.$index+'.desc'" :rules="fromaDataRules.desc">
        <el-input v-model="scope.row.desc"></el-input>
       </el-form-item>
      </template>
     </el-table-column>
    </el-table>
   </el-form>
   <el-button type="warning" @click="submit('from')">submit</el-button>

 </div>
</template>
<script>
 export default {
  data() {
   return {
    fromData:{
     domains:undefined
    },
    fromaDataRules:{
     name:[{ required: true, message: '请输入', trigger: 'blur' }],
     desc:[ { required: true, message: '请填写', trigger: 'blur' }]
    },
    domains:[],
   }
  },
  mounted(){
   this.initDomains()
  },
  methods:{
   initDomains(){
    this.domains=[
     {
      name: "小红",
      desc: "11123"
     },
     {
       name: "小红",
      desc: "11123"
     }
    ]
   },
   init(){
    this.$set(this.fromData,'domains',this.domains)
   },
   submit(formName){
    this.$refs[formName].validate((valid) => {
     if (valid) {
      alert('submit!');
     } else {
      console.log('error submit!!');
      return false;
     }
    });
   }
  }
 }
</script>

上述代码中比较关键的部分有一下两点:

1、:prop="‘domains.'+scope.$index+'.name'" ,用于动态绑定prop到el-form-item;

2、this.$set(this.fromData,‘domains',this.domains) ,用于为fromData设置domains这个节点。

方法二:

<template>
 <div class="app-container">

   <el-form :model="fromData" ref="from">
    <el-table :data="fromData.domains">
     <el-table-column label="姓名">
      <template slot-scope="scope">
       <el-form-item :prop="'domains.'+scope.$index+'.name'" :rules="fromData.fromaDataRules.name">
        <el-input v-model="scope.row.name"></el-input>
       </el-form-item>
      </template>
     </el-table-column>
     <el-table-column label="地址">
      <template slot-scope="scope">
       <el-form-item :prop="'domains.'+scope.$index+'.desc'" :rules="fromData.fromaDataRules.desc">
        <el-input v-model="scope.row.desc"></el-input>
       </el-form-item>
      </template>
     </el-table-column>
    </el-table>
   </el-form>
   <el-button type="warning" @click="submit('from')">submit</el-button>
 </div>
</template>
<script>
 export default {
  data() {
   return {

    fromData:{
	     fromaDataRules:{
	     name:[{ required: true, message: '请输入', trigger: 'blur' }],
	     desc:[ { required: true, message: '请填写', trigger: 'blur' }]
	    },
     domains:[],
    },
   }
  },
  mounted(){
   this.initDomains()
  },
  methods:{
   initDomains(){
    this.fromData.domains=[
     {
      name: "小红",
      desc: "11123"
     },
     {
      name: "小红",
      desc: "11123"
     }
    ]
   },
   init(){
   },
   submit(formName){
    this.$refs[formName].validate((valid) => {
     if (valid) {
      alert('submit!');
     } else {
      console.log('error submit!!');
      return false;
     }
    });
   }
  }
 }
</script>

补充知识:Vue+ElementUI 完整增删查改验证功能的表格

我就废话不多说了,大家还是直接看代码吧~

<template>
 <div class="block">
  <el-col>
   <el-row>
    <el-form>
     <el-form-item>
      <el-input style="width: 250px;float: left" placeholder="请输入名称" v-model="query"></el-input>
      <el-button @click="handleSelect" style="float: left;margin-left: 10px">查询</el-button>
      <el-button @click="handleAdd" style="float: left;margin-left: 10px">新增</el-button>
     </el-form-item>
    </el-form>
   </el-row>
   <el-row>
  <el-table
   :data="tableData"
   style="width: 100%"
   border>
   <el-table-column
    prop="date"
    label="日期"
    width="250">
   </el-table-column>
   <el-table-column
    prop="name"
    label="姓名"
    width="250">
   </el-table-column>
   <el-table-column
    prop="address"
    label="地址"
    width="350">
   </el-table-column>
   <el-table-column>
    <template slot-scope="scope">
    <el-button size="mini" @click="handleEdit(scope.$index,scope.row)">编辑</el-button>
    <el-button size="mini" type="danger" @click="handleDelete(scope.$index,scope.row)">删除</el-button>
    </template>
   </el-table-column>
  </el-table>
   </el-row>
   <el-row>
    <el-dialog class="dialog" :title="operation===true ?'新增':'编辑'" :visible.sync="dialogVisible" width="350px" >
     <el-form label-width="80px" :model="lineData" :rules="addRule" ref="lineData" >
      <el-form-item label="日期" prop="date">
       <el-input v-model="lineData.date"></el-input>
      </el-form-item>
      <el-form-item label="姓名" prop="name">
       <el-input v-model="lineData.name"></el-input>
      </el-form-item>
      <el-form-item label="地址">
       <el-input v-model="lineData.address"></el-input>
      </el-form-item>
      <el-form-item>
       <el-button @click="handleSave" type="primary">确定</el-button>
       <el-button @click="handleCancel">取消</el-button>
      </el-form-item>
     </el-form>
    </el-dialog>
   </el-row>
  </el-col>
 </div>
</template>

<script>export default {
 data () {
  return {
   operation: true,
   dialogVisible: false,
   lineData: {},
   editData: {},
   query: '',
   addRule: {
    date: [{required: true, message: '请输入日期', trigger: 'blur'}],
    name: [{required: true, message: '请输入名称', trigger: 'blur'}]
   },
   tableData: [{
    id: 1,
    date: '2016-05-02',
    name: '王一虎',
    address: '上海市普陀区金沙江路 1518 弄'
   }, {
    id: 2,
    date: '2016-05-04',
    name: '王二虎',
    address: '上海市普陀区金沙江路 1517 弄'
   }, {
    id: 3,
    date: '2016-05-01',
    name: '王一虎',
    address: '上海市普陀区金沙江路 1519 弄'
   }, {
    id: 4,
    date: '2016-05-03',
    name: '王四虎',
    address: '上海市普陀区金沙江路 1516 弄'
   }]
  }
 },
 methods: {
  handleEdit (index, row) {
   this.editData = JSON.stringify(row)
   this.lineData = JSON.parse(this.editData)
   this.dialogVisible = true
   this.operation = false
  },
  handleDelete (index, row) {
   this.tableData.splice(index, 1)
  },
  handleAdd () {
   this.dialogVisible = true
   this.operation = true
   this.lineData = {}
   this.lineData.id = Math.random()
  },
  handleSelect () {
   if (this.query !== '') {
    const tmpData = []
    for (let item of this.tableData) {
     if (item.name === this.query) {
      tmpData.push(item)
     }
    }
    this.tableData = tmpData
   }
  },
  handleSave () {
   this.$refs.lineData.validate((valid) => {
    if (valid) {
     this.addLine(this.lineData)
     this.dialogVisible = false
    } else {
     alert('保存失败')
     return false
    }
   })
  },
  handleCancel () {
   this.dialogVisible = false
  },
  addLine (item) {
   let existed = false
   for (let i = 0; i < this.tableData.length; i++) {
    if (this.tableData[i].id === item.id) {
     this.tableData[i].id = item.id
     this.tableData[i].name = item.name
     this.tableData[i].address = item.address
     this.tableData[i].date = item.date
     existed = true
     break
    }
   }
   if (!existed) {
    this.tableData.push(this.lineData)
   }
  }
 }
}
</script>

<style scoped>
 .block{
  width: 75%;
  margin-left: 400px;
  margin-top: 200px;
 }
</style>

以上这篇使用element-ui +Vue 解决 table 里包含表单验证的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解element-ui中表单验证的三种方式

    最近项目中一直使用的element-ui作为前端框架,对于最常使用的表单验证,做出以下总结: 第一种常用方式:表单上加rules{object} <el-form class="apply-form first-form" :model="formData" :rules="rule" ref="form"> <el-form-item label="姓名" prop="visi

  • 基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)

    前言 开发过程中遇到了一个需求,根据用户选择的联系方式,动态改变输入框的检验条件,并且整个表单是可以增加的 在线访问:动态表单校验 github(欢迎star): https://github.com/Mrblackant. .. 思考几个问题 1.整个表单是可新增的,所以要遍历生成: 2.联系方式(手机/座机)的切换,是要切换后边不同类型输入框还是只改变校验规则(本篇是动态改变校验规则) 实现 1.elementui的form表单实现校验的时候要给当前el-form-item加上prop属性,

  • vue+element实现表单校验功能

    要实现这个功能其实并不难,element组件直接用就可以, 但是我在使用过程中碰到了几个坑,就记录下来,分享给大家,避免落坑,话不多说,直接上过程...... 表单校验功能: 实现这个功能,总共分为以下4布: 1.在el-form标签中定义:rules="rules";ref="reference" 2.在el-form-item定义prop="name"; 3.在选项data中定义rules校验规则; 4.在提交方法中检查用户行为 templa

  • 解决vue+ element ui 表单验证有值但验证失败问题

    一.如图:有值但是验证失败 二. <el-form :model="form" :rules="rules"> <el-form-item label="数据模板" prop="template" > <el-col :span="20"> <el-input type="textarea" v-model="form.template

  • 使用element-ui +Vue 解决 table 里包含表单验证的问题

    应用场景: 在实际使用中经常会遇到需要在Form表单中使用table表格进行表单提交,同时又需要对table的字段进行校验,效果如图所示: 这个校验中,最关键的问题在于如何给el-form-item 动态绑定prop. :prop="'tableData.' + scope.$index + '.字段名'" 方法一: <template> <div class="app-container"> <el-form :model="

  • vue使用Element组件时v-for循环里的表单项验证方法

    标题描述看起来有些复杂,有vue,Element,又有表单验证,还有v-for循环?是不是有点乱?不过我相信开发中遇到过此问题的同学,一看就明白我说的意思了. 首先Element组件有一套完善的表单验证方法,官方文档写的也很清楚:Element表单验证API,正常按照官方文档添加rules规则,需要验证的表单项设置prop,然后提交表单时通过form的validate方法验证表单项就可以了. 然鹅问题来了,如果表单项里有通过v-for动态生成的表单项,如何设置验证呢?这个官方文档并没有明确的说法

  • spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)

    创建项目 使用IDEA创建一个spring-boot项目,依赖选上 web, validation, freemarker 即可 先看看效果 创建实体类 创建并加上注解,代码如下 public class Person implements Serializable { @NotNull @Length(min = 3, max = 10) // username长度在3-10之间 private String username; @NotNull @Min(18) // 年龄最小要18岁 pr

  • vue中使用element-ui进行表单验证的实例代码

    element-ui 中验证 一.简单逻辑验证(直接使用rules) 实现思路 •html中给el-form增加 :rules="rules" •html中在el-form-item 中增加属性 prop="名称" •js中直接在data中定义rules:{} •html部分 <el-form ref="form" :rules="rules" :model="form" label-width=&q

  • Vue快速实现通用表单验证的示例代码

    本文开篇第一句话,想引用鲁迅先生<祝福>里的一句话,那便是:"我真傻,真的,我单单知道后端整天都是CRUD,我没想到前端整天都是Form表单".这句话要从哪里说起呢?大概要从最近半个月的"全栈工程师"说起.项目上需要做一个城市配载的功能,顾名思义,就是通过框选和拖拽的方式在地图上完成配载.博主选择了前后端分离的方式,在这个过程中发现:首先,只要有依赖jQuery的组件,譬如Kendoui,即使使用了Vue,依然需要通过jQuery去操作DOM.其次,只有

  • Vue快速实现通用表单验证功能

    本文开篇第一句话,想引用鲁迅先生<祝福>里的一句话,那便是:"我真傻,真的,我单单知道后端整天都是CRUD,我没想到前端整天都是Form表单".这句话要从哪里说起呢?大概要从最近半个月的"全栈工程师"说起.项目上需要做一个城市配载的功能,顾名思义,就是通过框选和拖拽的方式在地图上完成配载.博主选择了前后端分离的方式,在这个过程中发现:首先,只要有依赖jQuery的组件,譬如Kendoui,即使使用了Vue,依然需要通过jQuery去操作DOM.其次,只有

  • Vue快速实现通用表单验证的方法

    本文开篇第一句话,想引用鲁迅先生<祝福>里的一句话,那便是:"我真傻,真的,我单单知道后端整天都是CRUD,我没想到前端整天都是Form表单".这句话要从哪里说起呢?大概要从最近半个月的"全栈工程师"说起.项目上需要做一个城市配载的功能,顾名思义,就是通过框选和拖拽的方式在地图上完成配载.博主选择了前后端分离的方式,在这个过程中发现:首先,只要有依赖jQuery的组件,譬如Kendoui,即使使用了Vue,依然需要通过jQuery去操作DOM.其次,只有

  • 详解vue2.0的Element UI的表格table列时间戳格式化

    这两天学习了vue2.0的Element UI的表格table列时间戳格式化,所以,今天添加一点小笔记. 表格属性 <el-table :data="tableData" v-loading.body="loading" border @selection-change="selectionChange" style="width: 100%"> <el-table-column prop="cre

  • element 结合vue 在表单验证时有值却提示错误的解决办法

    绑定的值与规则指定的值一定要相同------- 第一步: <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> 加上rules ref 第二部: <el-form-item label="活动名称" prop="na

随机推荐