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 相关文章推荐
JavaScript学习笔记(十)
Jan 17 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
Sep 14 Javascript
用javascript添加控件自定义属性解析
Nov 25 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
Aug 19 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
Nov 23 Javascript
jquery+css实现的红色线条横向二级菜单效果
Aug 22 Javascript
jquery实现的点击翻书效果代码
Nov 04 Javascript
基于Jquery和html5的7款个性化地图插件
Nov 17 Javascript
详解JavaScript中Hash Map映射结构的实现
May 21 Javascript
Vue表单验证插件的制作过程
Apr 01 Javascript
jQuery中库的引用方法
Jan 06 jQuery
微信小程序引入Vant组件库过程解析
Aug 06 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
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
一个比较不错的PHP日历类分享
2014/11/18 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
PHP让数组中有相同值的组成新的数组实例
2017/12/31 PHP
通过JAVAScript实现页面自适应
2007/01/19 Javascript
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
Javascript基于jQuery UI实现选中区域拖拽效果
2016/11/25 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
Javascript实现购物车功能的详细代码
2018/05/08 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
vue.js 解决v-model让select默认选中不生效的问题
2020/07/28 Javascript
Python 第一步 hello world
2009/09/25 Python
python模拟enum枚举类型的方法小结
2015/04/30 Python
Python类的定义、继承及类对象使用方法简明教程
2015/05/08 Python
python字符串连接方法分析
2016/04/12 Python
flask框架使用orm连接数据库的方法示例
2018/07/16 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
Python----数据预处理代码实例
2019/03/20 Python
Python3.7 新特性之dataclass装饰器
2019/05/27 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
2019/09/10 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
加拿大高尔夫超市:Golf Town
2018/01/12 全球购物
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
单位更名证明
2015/06/18 职场文书
2015年度优秀员工获奖感言
2015/07/31 职场文书
初中生活随笔
2015/08/15 职场文书