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 +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
Nov 18 Vue.js
vue 插槽简介及使用示例
Nov 19 Vue.js
Vue实现图书管理小案例
Dec 03 Vue.js
Vue 组件注册全解析
Dec 17 Vue.js
vue 在服务器端直接修改请求的接口地址
Dec 19 Vue.js
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
vue实现可移动的悬浮按钮
Mar 04 Vue.js
如何理解Vue前后端数据交互与显示
May 10 Vue.js
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 Vue.js
一篇文章学会Vue中间件管道
Jun 20 Vue.js
一起来看看Vue的核心原理剖析
Mar 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
用DBSQL类加快开发MySQL数据库程序的速度
2006/10/09 PHP
详解PHP中websocket的使用方法
2016/09/15 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
原生js和jquery实现图片轮播特效
2015/04/23 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
Jquery判断form表单数据是否变化
2016/03/30 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
js+css实现红包雨效果
2018/07/12 Javascript
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
2019/05/28 Javascript
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
element-ui如何防止重复提交的方法步骤
2019/12/09 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
在MAC上搭建python数据分析开发环境
2016/01/26 Python
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
python中count函数简单的实例讲解
2020/02/06 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
2020/04/08 Python
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
主管职责范文
2013/11/09 职场文书
田径运动会开幕式及主持词
2014/03/28 职场文书
业务内勤岗位职责
2014/04/30 职场文书
人力资源职位说明书
2014/07/29 职场文书
粗暴解决CUDA out of memory的问题
2021/05/22 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python
Python实现简单的俄罗斯方块游戏
2021/09/25 Python
python编程学习使用管道Pipe编写优化代码
2021/11/20 Python