el-table树形表格表单验证(列表生成序号)


Posted in Javascript onMay 31, 2020

树形表格表单验证预览

el-table树形表格表单验证(列表生成序号)

树形列表生成序号

首先需要生成一个序号用来确定表单验证的目标row,通过广度优先遍历,以1,1.1,1.1.1的规则对树形列表生成确定唯一值的索引,因为列表自身可以做CURD,因此需要每次列表的item增加或减少时重新调用生成索引的方法。

setIndex = (data) => {
        let queue = [...data];
        let loop = 0;
        while (queue.length > 0) {
          loop++
          [...queue].forEach((child, i) => {
            queue.shift()
            if (loop == 1) {
              child.customIndex = i + 1 + "";
              child.currentIndex = i;
            }
            if (child.children && child.children.length > 0) {
              child.dataType = 1
              for (let ci = 0; ci < child.children.length; ci++) {
                child.children[ci].currentIndex = ci
                child.children[ci].customIndex = child.customIndex + "." + (ci + 1)
              }
              queue.push(...child.children)
            } else {
              child.dataType = 2
            }
          })
        }
      }
      const rows = [
        {
          id: "1",
          date: "2016-05-02",
          name: "王小虎1",
          address: "上海市普陀区金沙江路 1518 弄",
          children: [
            {
              name: "233",
              customIndex: "1.1",
              children: [{name: "9"}]
            },
            {
              name: "7771",
              customIndex: "1.2",
              children: [
                {
                  name: "9"
                }, 
                {
                  name: "9",
                }]
            }
          ]
        },
        {
          id: "2",
          date: "2016-05-04",
          name: "王小虎2",
          address: "上海市普陀区金沙江路 1517 弄",
          children: []
        },
       ]
 setIndex(rows)

表单校验

要想实现对表格的表单验证,需要用form-item将整个表格包裹,然后在以子集的方式将每一列用form-item包裹。

<el-form ref="form" :model="form" label-width="80px" :rules="rules">
      <el-form-item label-width="0" prop="rows">
        <el-table>
        </el-table>
      </el-form-item>
    </el-form>
<el-table-column
              prop="name"
              label="姓名"
              sortable
              width="180">
            <template v-slot="{$index, row}">
                           {{`rows${getPathByKey(row.customIndex,"customIndex",form.rows)}.name`}}
              <el-form-item label-width="0" :rules="rules.name"
                     :prop="`${row.customIndex!=='tempIndex'?`rows${getPathByKey(row.customIndex,'customIndex',form.rows)}.name`:''}`">
                <el-input v-model="row.name"></el-input>
              </el-form-item>
            </template>
          </el-table-column>

实现方式,表单校验本质是对于目标数据的路径查找,当el-form-item 上的prop匹配不到正确的目标是的时候就不能正常触发校验

el-table树形表格表单验证(列表生成序号)

因此,需要记录每一个row上面的属性路径,即实现记录每一行中属性(name,address)路径的方法。

getPathByKey = (value, key, arr) => {
        let temppath = [];
        let realPath = ""
        try {
          function getNodePath(node) {
            temppath.push(node.currentIndex);
            //找到符合条件的节点,通过throw终止掉递归
            if (node[key] === value) {
              temppath.forEach((v, i) => {
                if (i == 0) {
                  realPath += "." + v
                } else {
                  realPath += `.children.${v}`
                }
              })
              // temppath = temppath.join(",")
              throw ("GOT IT!");
              // return;
            }
            if (node.children && node.children.length > 0) {
              for (var i = 0; i < node.children.length; i++) {
                getNodePath(node.children[i]);
              }

              //当前节点的子节点遍历完依旧没找到,则删除路径中的该节点
              temppath.pop();
            } else {

              //找到叶子节点时,删除路径当中的该叶子节点
              temppath.pop();
            }
          }

          for (let i = 0; i < arr.length; i++) {
            getNodePath(arr[i]);
          }
        } catch (e) {
          return realPath;
        }
      },

将每一列需要验证的item,路径查找好之后,form就可以具体监控到所有的表格输入,并触发正确的验证了,如图:

el-table树形表格表单验证(列表生成序号)

demo参考

到此这篇关于el-table树形表格表单验证(列表生成序号)的文章就介绍到这了,更多相关el-table树形表格表单验证内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
40款非常棒的jQuery 插件和制作教程(系列二)
Nov 02 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
Sep 30 Javascript
6款新颖的jQuery和CSS3进度条插件推荐
Mar 05 Javascript
js工具方法弹出蒙版
May 08 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
Nov 08 Javascript
实现51Map地图接口(示例代码)
Nov 22 Javascript
对比分析json及XML
Nov 28 Javascript
js clearInterval()方法的定义和用法
Nov 11 Javascript
JavaScript惰性求值的一种实现方法示例
Jan 11 Javascript
Vue中通过Vue.extend动态创建实例的方法
Aug 13 Javascript
如何利用javascript接收json信息并进行处理
Aug 06 Javascript
一篇文章了解正则表达式的替换技巧
Feb 24 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
May 31 #Javascript
使用原生JS实现滚轮翻页效果的示例代码
May 31 #Javascript
24个ES6方法解决JS实际开发问题(小结)
May 31 #Javascript
公众号SVG动画交互实战代码
May 31 #Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
May 31 #Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
May 31 #Javascript
详解Typescript 内置的模块导入兼容方式
May 31 #Javascript
You might like
Body是什么,该怎么喝出咖啡里的口感
2021/03/03 咖啡文化
dedecms采集中可以过滤多行代码的正则表达式
2007/03/17 PHP
ecshop 批量上传(加入自定义属性)
2012/03/20 PHP
php检测文本的编码
2015/07/26 PHP
php分享朋友圈的实现代码
2019/02/18 PHP
php转换上传word文件为PDF的方法【基于COM组件】
2019/06/10 PHP
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
2016/10/21 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
layer ui插件显示tips时,修改字体颜色的实现方法
2019/09/11 Javascript
JavaScript代码简化技巧实例解析
2020/09/09 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
vue3.0中使用element的完整步骤
2021/03/04 Vue.js
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
深入理解Django的自定义过滤器
2017/10/17 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
俄罗斯游戏商店:Buka
2020/03/01 全球购物
党员思想汇报范文
2013/12/30 职场文书
中国好声音华少广告词
2014/03/17 职场文书
财产分割协议书范本
2014/11/03 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
课外活动实习计划
2015/01/19 职场文书
预备党员个人总结
2015/02/14 职场文书
法制工作总结2015
2015/07/23 职场文书
旷工检讨书大全
2015/08/15 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书
大学生社会服务心得体会
2016/01/22 职场文书
python异步的ASGI与Fast Api实现
2021/07/16 Python
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL