vue+element UI实现树形表格


Posted in Vue.js onDecember 29, 2020

本文实例为大家分享了vue+element UI实现树形表格的具体代码,供大家参考,具体内容如下

一、在component文件夹下新建如下treeTable文件夹,里面有2个文件:

vue+element UI实现树形表格

eval.js:将数据转换成树形数据

/**
* @Author: jianglei
* @Date:  2017-10-12 12:06:49
*/
'use strict'
import Vue from 'vue'
export default function treeToArray(data, expandAll, parent = null, level = null) {
 let tmp = []
 Array.from(data).forEach(function(record) {
  if (record._expanded === undefined) {
   Vue.set(record, '_expanded', expandAll)
  }
  let _level = 1
  if (level !== undefined && level !== null) {
   _level = level + 1
  }
  Vue.set(record, '_level', _level)
  // 如果有父元素
  if (parent) {
   Vue.set(record, 'parent', parent)
  }
  tmp.push(record)
  if (record.children && record.children.length > 0) {
   const children = treeToArray(record.children, expandAll, record, _level)
   tmp = tmp.concat(children)
  }
 })
 return tmp
}

index.vue:树形表格组件

<template>
 <el-table :data="formatData" :row-style="showRow" v-bind="$attrs">
  <el-table-column v-if="columns.length===0" width="150">
   <template slot-scope="scope">
    <span v-for="space in scope.row._level" :key="space" class="ms-tree-space"/>
    <span v-if="iconShow(0,scope.row)" class="tree-ctrl" @click="toggleExpanded(scope.$index)">
     <i v-if="!scope.row._expanded" class="el-icon-plus"/>
     <i v-else class="el-icon-minus"/>
    </span>
    {{ scope.$index }}
   </template>
  </el-table-column>
  <el-table-column v-for="(column, index) in columns" v-else :key="column.value" :label="column.text" :width="column.width">
   <template slot-scope="scope">
    <!-- Todo -->
    <!-- eslint-disable-next-line vue/no-confusing-v-for-v-if -->
    <span v-for="space in scope.row._level" v-if="index === 0" :key="space" class="ms-tree-space"/>
    <span v-if="iconShow(index,scope.row)" class="tree-ctrl" @click="toggleExpanded(scope.$index)">
     <i v-if="!scope.row._expanded" class="el-icon-plus"/>
     <i v-else class="el-icon-minus"/>
    </span>
    {{ scope.row[column.value] }}
   </template>
  </el-table-column>
  <slot/>
 </el-table>
</template>
 
<script>
/**
 Auth: Lei.j1ang
 Created: 2018/1/19-13:59
*/
import treeToArray from "./eval";
export default {
 name: "TreeTable",
 props: {
  /* eslint-disable */
  data: {
   type: [Array, Object],
   required: true
  },
  columns: {
   type: Array,
   default: () => []
  },
  evalFunc: Function,
  evalArgs: Array,
  expandAll: {
   type: Boolean,
   default: false
  }
 },
 computed: {
  // 格式化数据源
  formatData: function() {
   let tmp;
   if (!Array.isArray(this.data)) {
    tmp = [this.data];
   } else {
    tmp = this.data;
   }
   const func = this.evalFunc || treeToArray;
   const args = this.evalArgs
    ? Array.concat([tmp, this.expandAll], this.evalArgs)
    : [tmp, this.expandAll];
   return func.apply(null, args);
  }
 },
 methods: {
  showRow: function(row) {
   const show = row.row.parent
    ? row.row.parent._expanded && row.row.parent._show
    : true;
   row.row._show = show;
   return show
    ? "animation:treeTableShow 1s;-webkit-animation:treeTableShow 1s;"
    : "display:none;";
  },
  // 切换下级是否展开
  toggleExpanded: function(trIndex) {
   const record = this.formatData[trIndex];
   record._expanded = !record._expanded;
  },
  // 图标显示
  iconShow(index, record) {
   return index === 0 && record.children && record.children.length > 0;
  }
 }
};
</script>
<style rel="stylesheet/css">
@keyframes treeTableShow {
 from {
  opacity: 0;
 }
 to {
  opacity: 1;
 }
}
@-webkit-keyframes treeTableShow {
 from {
  opacity: 0;
 }
 to {
  opacity: 1;
 }
}
</style>
 
<style scoped>
.ms-tree-space {
 position: relative;
 top: 1px;
 display: inline-block;
 font-style: normal;
 font-weight: 400;
 line-height: 1;
 width: 18px;
 height: 14px;
}
.ms-tree-space::before {
 content: "";
}
.processContainer {
 width: 100%;
 height: 100%;
}
table td {
 line-height: 26px;
}
.tree-ctrl {
 position: relative;
 cursor: pointer;
 color: #2196f3;
 margin-left: -18px;
}
</style>

二、在需要的地方引入该组件

例如:在component文件夹下新建a.vue:

<tree-table :data="data" :columns="columns" border/>

import treeTable from "./TreeTable";

components: { treeTable },
data() {
  return {
   columns: [
    {
     text: "事件",
     value: "event",
     width: 200
    },
    {
     text: "ID",
     value: "id"
    },
    {
     text: "时间线",
     value: "timeLine"
    },
    {
     text: "备注",
     value: "comment"
    }
   ],
   data: [
    {
     id: 0,
     event: "事件1",
     timeLine: 50,
     comment: "无"
    },
    {
     id: 1,
     event: "事件1",
     timeLine: 100,
     comment: "无",
     children: [
      {
       id: 2,
       event: "事件2",
       timeLine: 10,
       comment: "无"
      },
      {
       id: 3,
       event: "事件3",
       timeLine: 90,
       comment: "无",
       children: [
        {
         id: 4,
         event: "事件4",
         timeLine: 5,
         comment: "无"
        },
        {
         id: 5,
         event: "事件5",
         timeLine: 10,
         comment: "无"
        },
        {
         id: 6,
         event: "事件6",
         timeLine: 75,
         comment: "无",
         children: [
          {
           id: 7,
           event: "事件7",
           timeLine: 50,
           comment: "无",
           children: [
            {
             id: 71,
             event: "事件71",
             timeLine: 25,
             comment: "xx"
            },
            {
             id: 72,
             event: "事件72",
             timeLine: 5,
             comment: "xx"
            },
            {
             id: 73,
             event: "事件73",
             timeLine: 20,
             comment: "xx"
            }
           ]
          },
          {
           id: 8,
           event: "事件8",
           timeLine: 25,
           comment: "无"
          }
         ]
        }
       ]
      }
     ]
    }
   ]
  };
 },

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
Dec 02 Vue.js
Vue——前端生成二维码的示例
Dec 19 Vue.js
vue实现图书管理系统
Dec 29 Vue.js
vue项目如何监听localStorage或sessionStorage的变化
Jan 04 Vue.js
Vue实现图书管理案例
Jan 20 Vue.js
Vue看了就会的8个小技巧
Jan 21 Vue.js
vue使用transition组件动画效果的实例代码
Jan 28 Vue.js
如何封装Vue Element的table表格组件
Feb 06 Vue.js
vue backtop组件的实现完整代码
Apr 07 Vue.js
浅谈vue2的$refs在vue3组合式API中的替代方法
Apr 18 Vue.js
关于Vue Router的10条高级技巧总结
May 06 Vue.js
vue 把二维或多维数组转一维数组
Apr 24 Vue.js
vue实现树状表格效果
Dec 29 #Vue.js
vue实现图书管理系统
Dec 29 #Vue.js
Vue实现随机验证码功能
Dec 29 #Vue.js
vue3+typeScript穿梭框的实现示例
Dec 29 #Vue.js
Vue.extend 登录注册模态框的实现
Dec 29 #Vue.js
vue实现简易的双向数据绑定
Dec 29 #Vue.js
vue中配置scss全局变量的步骤
Dec 28 #Vue.js
You might like
让你同时上传 1000 个文件 (一)
2006/10/09 PHP
php 常用算法和时间复杂度
2013/07/01 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
JavaScript使用技巧精萃[代码非常实用]
2008/11/21 Javascript
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
2011/04/12 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
Javascript Web Slider 焦点图示例源码
2013/10/10 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
由浅入深剖析Angular表单验证
2016/07/14 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
Javascript文本框脚本实现方法解析
2020/10/30 Javascript
python操作MongoDB基础知识
2013/11/01 Python
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
python生成随机mac地址的方法
2015/03/16 Python
用Python实现协同过滤的教程
2015/04/08 Python
python取代netcat过程分析
2018/02/10 Python
对python添加模块路径的三种方法总结
2018/10/16 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
Python面向对象之类和对象属性的增删改查操作示例
2018/12/14 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
2019/08/08 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
财务会计专业毕业生自荐信
2013/10/19 职场文书
领导失职检讨书
2014/02/24 职场文书
小学一年级评语大全
2014/04/22 职场文书
《庐山的云雾》教学反思
2014/04/22 职场文书
产品售后服务承诺书
2014/05/21 职场文书
工作失职检讨书
2015/01/26 职场文书
外出听课学习心得体会
2016/01/15 职场文书
Python 文字识别
2022/05/11 Python
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL