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使用echarts图表自适应的几种解决方案
Dec 04 Vue.js
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
Dec 19 Vue.js
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
Vue实现小购物车功能
Dec 21 Vue.js
vue 实现图片懒加载功能
Dec 31 Vue.js
Vue 3自定义指令开发的相关总结
Jan 29 Vue.js
Vue中使用wangeditor富文本编辑的问题
Feb 07 Vue.js
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
Vue详细的入门笔记
May 10 Vue.js
vue 给数组添加新对象并赋值
Apr 20 Vue.js
vue css 相对路径导入问题级踩坑记录
Jun 05 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
php运行时动态创建函数的方法
2015/03/16 PHP
JavaScript 参考教程
2006/12/29 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
2013/03/11 Javascript
15条JavaScript最佳实践小结
2013/08/09 Javascript
jquery实现checkbox 全选/全不选的通用写法
2014/02/22 Javascript
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
基于JavaScript实现弹幕特效
2020/08/27 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
python访问纯真IP数据库的代码
2011/05/19 Python
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
python中字符串前面加r的作用
2015/06/04 Python
windows系统下Python环境的搭建(Aptana Studio)
2017/03/06 Python
Python解析json代码实例解析
2019/11/25 Python
python绘制彩虹图
2019/12/16 Python
详解Python多线程下的list
2020/07/03 Python
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
化学教师教学反思
2014/01/17 职场文书
寻找最美家庭活动方案
2014/08/20 职场文书
2015年八一建军节慰问信
2015/03/23 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
python 镜像环境搭建总结
2022/09/23 Python