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 相关文章推荐
vue 获取到数据但却渲染不到页面上的解决方法
Nov 19 Vue.js
在Vue中使用CSS3实现内容无缝滚动的示例代码
Nov 27 Vue.js
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
vuex的使用步骤
Jan 06 Vue.js
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
Vue 实现可视化拖拽页面编辑器
Feb 01 Vue.js
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
Feb 20 Vue.js
vue-router懒加载的3种方式汇总
Feb 28 Vue.js
vue3.0中使用element的完整步骤
Mar 04 Vue.js
Vue中插槽slot的使用方法与应用场景详析
Jun 08 Vue.js
Vue过滤器(filter)实现及应用场景详解
Jun 15 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
正则表达式语法
2006/10/09 Javascript
如何将数据从文本导入到mysql
2006/10/09 PHP
PHP 中文处理技巧
2010/04/25 PHP
PHP 第一节 php简介
2012/04/28 PHP
一组PHP可逆加密解密算法实例代码
2014/01/21 PHP
php数组分页实现方法
2016/04/30 PHP
php类的自动加载操作实例详解
2016/09/28 PHP
js中的escape及unescape函数的php实现代码
2007/09/04 Javascript
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
谈谈JavaScript自定义回调函数
2015/10/18 Javascript
js自定义回调函数
2015/12/13 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
2019/01/27 Javascript
如何进行微信公众号开发的本地调试的方法
2019/06/16 Javascript
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
[03:22]DOTA2超级联赛专访单车:找到属于自己的英雄
2013/06/08 DOTA
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
python开启多个子进程并行运行的方法
2015/04/18 Python
快速入手Python字符编码
2016/08/03 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
如何编写python的daemon程序
2021/01/07 Python
python 实现IP子网计算
2021/02/18 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
浅谈HTML5 FileReader分布读取文件以及其方法简介
2017/11/09 HTML / CSS
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
Ruby如何定义一个类
2012/10/08 面试题
酒店员工培训方案
2014/06/02 职场文书
基层工作经验证明样本
2014/11/16 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
HTML中的表格元素介绍
2022/02/28 HTML / CSS