设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11626|回复: 0

Vue elementUI表单嵌套表格并对每行进行校验详解

[复制链接]

76

主题

0

回帖

240

积分

中级会员

Rank: 3Rank: 3

积分
240
发表于 2022-3-26 11:01:50 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!
目录


效果展示

先看看这是不是需要的效果^_^

如图,ElementUI 表单里嵌套了表格,表格内每行能进行【保存】【新增】【编辑】【删除】【重置】等操作,同时可以对每行的某些字段进行校验(而不是整个表单校验!),这种需求很常见,所以记录下来。

代码链接

gitee地址

关键代码


表格数据
  1. // 数据格式必须是【对象嵌套数组】,【form】绑定表单,【list】绑定表格
  2. form: {
  3.   // 表格数据
  4.   list: [
  5.       { id: 1, name: '小叶', age: '12', phone: '123456', show: true },
  6.       { id: 2, name: '小李', age: '23', phone: '123457', show: true },
  7.       { id: 3, name: '小林', age: '12', phone: '123458', show: true }
  8.   ]
  9. },
复制代码
组件嵌套


  • 添加字段校验的时候,格式必须写成这样的 :prop="'list.' + scope.$index + '.name'"
    这是 elementui 规定的格式,渲染后的结果为 list.1.name
  • 每个字段要动态绑定表单的 rules 属性
  • 如果不是以上的格式,会出错!!!
  1. // 表单必须嵌套在表格的外面,表单必须绑定【rules】【ref】属性
  2. <el-form :model="form" :rules="rules" ref="form">
  3.    <el-table :data="form.list">
  4.        <el-table-column prop="name" label="姓名">
  5.            <template scope="scope">
  6.               // 每个字段动态的绑定表单的【prop】【rules】属性
  7.               <el-form-item :prop="'list.' + scope.$index + '.name'"                                              :rules="rules.name">
  8.                     <el-input size="mini" v-model="scope.row.name" placeholder="请输入"                             clearable></el-input>
  9.                </el-form-item>
  10.            </template>
  11.        </el-table-column>
  12.   </el-table>
  13. </el-form>
复制代码
校验方法


  • 表单的字段对象存在于 this.$refs[&#39;form&#39;].fields 中,并且字段对象具有 prop【datas.1.name】 属性和 validateField 方法【验证 datas.1.name 能否通过校验】
  • 但是 validateField 方法需要手动创建来验证能否通过校验
  • 必须创建,否则会出错!!!
  1. // 表单校验方法
  2. // 【form】是需要校验的表单,就是表单中【ref】绑定的字段
  3. // 【index】是需要传入的行数,字段【scope.$index】
  4. validateField(form, index) {
  5.      let result = true;
  6.      for (let item of this.$refs[form].fields) {
  7.          if(item.prop.split(".")[1] == index){
  8.              this.$refs[form].validateField(item.prop, err => {
  9.                  if(err !="") {
  10.                      result = false;
  11.                  }
  12.              });
  13.          }
  14.          if(!result) break;
  15.      }
  16.      return result;
  17. }
复制代码
重置方法
  1. // 对【需要校验】的表单字段进行重置
  2. // 参数同校验方法,如果是全部重置
  3. reset(form, index) {
  4.     this.$refs[form].fields.forEach(item => {
  5.         if(item.prop.split(".")[1] == index){
  6.             item.resetField();
  7.         }
  8.     })
  9. }
  10. // 如果需要全部重置可以直接质控表单中字段
  11. // 【row】是每行传入的数据
  12. resetRow(row) {
  13.     row.name = "";
  14.     row.age = "";
  15.     row.phone = "";
  16. }
复制代码
完整代码

因为用的是在线链接,网络不稳定时页面不一定能加载出来,使用时可以更换成本地的!
  1. <!DOCTYPE html>
  2. <html lang="zh">

  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>vue表单嵌套表格逐行验证</title>
  8.     <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  9.     <!-- 引入样式 -->
  10.     <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" rel="external nofollow" >
  11.     <!-- 引入组件库 -->
  12.     <script src="https://unpkg.com/element-ui/lib/index.js"></script>
  13. </head>

  14. <body>
  15.     <div id="app">
  16.         <!-- 页面组件 -->
  17.         <h2 style="text-align: center; line-height: 23px;color: #909399;">vue表单嵌套表格逐行验证</h2>
  18.         <el-form :model="form" :rules="rules" ref="form" :inline="true"
  19.             style="margin: 23px auto 0px; width: 96%; overflow: hidden;">
  20.             <el-table border :data="form.list">
  21.                 <el-table-column align="center" prop="id" label="序号" width="55">
  22.                 </el-table-column>
  23.                 <el-table-column align="center" prop="name" label="姓名">
  24.                     <template scope="scope">
  25.                         <el-form-item :prop="'list.' + scope.$index + '.name'" :rules="rules.name"
  26.                             v-if="scope.row.show">
  27.                             <el-input size="mini" v-model="scope.row.name" placeholder="请输入" clearable>
  28.                             </el-input>
  29.                         </el-form-item>
  30.                         <div v-if="!scope.row.show">{{scope.row.name}}</div>
  31.                     </template>
  32.                 </el-table-column>
  33.                 <el-table-column align="center" prop="age" label="年龄">
  34.                     <template scope="scope">
  35.                         <el-form-item :prop="'list.' + scope.$index + '.age'" :rules="rules.age" v-if="scope.row.show">
  36.                             <el-input size="mini" v-model="scope.row.age" placeholder="请输入" clearable>
  37.                             </el-input>
  38.                         </el-form-item>
  39.                         <div v-if="!scope.row.show">{{scope.row.age}}</div>
  40.                     </template>
  41.                 </el-table-column>
  42.                 <el-table-column align="center" prop="phone" label="联系方式">
  43.                     <template scope="scope">
  44.                         <el-form-item :prop="'list.' + scope.$index + '.phone'" :rules="rules.phone"
  45.                             v-if="scope.row.show">
  46.                             <!-- <el-form-item v-if="scope.row.show"> -->
  47.                             <el-input size="mini" v-model="scope.row.phone" placeholder="请输入" clearable>
  48.                             </el-input>
  49.                         </el-form-item>
  50.                         <div v-if="!scope.row.show">{{scope.row.phone}}</div>
  51.                     </template>
  52.                 </el-table-column>
  53.                 <el-table-column label="操作" align="center" width="290" fixed="right">
  54.                     <template slot-scope="scope">
  55.                         <el-button type="text" style="color: #E6A23C;" @click="save(scope.$index, scope.row)"
  56.                             v-if="scope.row.show" icon="el-icon-check">保存
  57.                         </el-button>
  58.                         <el-button type="text" style="color: #409EFF;" @click="edit(scope.row)" v-if="!scope.row.show"
  59.                             icon="el-icon-edit">编辑
  60.                         </el-button>
  61.                         <el-button type="text" style="color: #67C23A;" v-if="scope.$index+1 == listLength"
  62.                             @click="addRow(scope.$index, scope.row)" icon="el-icon-plus">新增
  63.                         </el-button>
  64.                         <el-button type="text" style="color: #F56C6C;" @click="delRow(scope.$index, scope.row)"
  65.                             icon="el-icon-delete">删除
  66.                         </el-button>
  67.                         <el-button type="text" style="color: #909399;" @click="reset('form', scope.$index)"
  68.                             v-if="scope.row.show" icon="el-icon-refresh">重置
  69.                         </el-button>
  70.                         <!-- <el-button type="text" style="color: #909399;" @click="resetRow(scope.row)"
  71.                             v-if="scope.row.show" icon="el-icon-refresh">重置
  72.                         </el-button> -->
  73.                     </template>
  74.                 </el-table-column>
  75.             </el-table>
  76.         </el-form>
  77.     </div>
  78. </body>

  79. </html>
  80. <script>
  81.     var app = new Vue({
  82.         el: '#app',
  83.         data() {
  84.             return {
  85.                 // 表单数据
  86.                 form: {
  87.                     // 表格数据
  88.                     list: [{ id: 1, name: '', age: '', phone: '', show: true }]
  89.                 },
  90.                 // 表单验证规则
  91.                 rules: {
  92.                     name: [{ required: true, message: '请输入姓名!', trigger: 'blur' }],
  93.                     age: [{ required: true, message: '请输入年龄!', trigger: 'blur' }],
  94.                     phone: [{ required: true, message: '请输入联系方式!', trigger: 'blur' }],
  95.                 },
  96.                 // 表格长度默认为 1
  97.                 listLength: 1,
  98.             }
  99.         },

  100.         methods: {
  101.             // 校验
  102.             validateField(form, index) {
  103.                 let result = true;
  104.                 for (let item of this.$refs[form].fields) {
  105.                     if (item.prop.split(".")[1] == index) {
  106.                         this.$refs[form].validateField(item.prop, err => {
  107.                             if (err != "") {
  108.                                 result = false;
  109.                             }
  110.                         });
  111.                     }
  112.                     if (!result) break;
  113.                 }
  114.                 return result;
  115.             },

  116.             // 重置【只针对校验字段】
  117.             reset(form, index) {
  118.                 this.$refs[form].fields.forEach(item => {
  119.                     if (item.prop.split(".")[1] == index) {
  120.                         item.resetField();
  121.                     }
  122.                 })
  123.             },

  124.             // 重置【全部】
  125.             resetRow(row) {
  126.                 row.name = "";
  127.                 row.age = "";
  128.                 row.phone = "";
  129.             },

  130.             // 保存
  131.             save(index, row) {
  132.                 if (!this.validateField('form', index)) return;
  133.                 row.show = false;
  134.             },

  135.             // 新增
  136.             addRow(index, row) {
  137.                 if (!this.validateField('form', index)) return;
  138.                 this.form.list.push({
  139.                     id: index + 2,
  140.                     name: '',
  141.                     age: '',
  142.                     phone: '',
  143.                     show: true
  144.                 });
  145.                 this.listLength = this.form.list.length;
  146.             },

  147.             // 编辑
  148.             edit(row) {
  149.                 row.show = true;
  150.             },

  151.             // 删除
  152.             delRow(index, row) {
  153.                 if (this.form.list.length > 1) {
  154.                     this.form.list.splice(index, 1);
  155.                     this.listLength = this.form.list.length;
  156.                 } else {
  157.                     this.form.list = [{
  158.                         id: 1,
  159.                         name: '',
  160.                         age: '',
  161.                         phone: '',
  162.                         show: true
  163.                     }];
  164.                 }
  165.             },
  166.         }
  167.     })
  168. </script>
复制代码
总结

到此这篇关于Vue elementUI表单嵌套表格并对每行进行校验的文章就介绍到这了,更多相关elementUI表单嵌套表格内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
                                                        
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表