基于VUE框架怎么做树形表格,过程及代码是什么
Admin 2022-06-14 群英技术资讯 1097 次浏览
很多朋友都对“基于VUE框架怎么做树形表格,过程及代码是什么”的内容比较感兴趣,对此小编整理了相关的知识分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获,那么感兴趣的朋友就继续往下看吧!本文实例为大家分享了vue+element UI实现树形表格的具体代码,供大家参考,具体内容如下
一、在component文件夹下新建如下treeTable文件夹,里面有2个文件:

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: "无"
}
]
}
]
}
]
}
]
};
},
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家介绍了Vue的过度与动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
Array.of用于将参数依次转换成数组中的一个,然后返回这个新的数组,无论这个参数是数字还是其他。当参数是一个并且是正整数时,Array.of将参数转换为数组中的一个。
当开发者需要为不同目的以不同形式处理URL时,我们经常会借助于JavaScript。本文就为大家整理了JavaScript验证URL的方法,希望对大家有所帮助
这篇文章主要为大家详细介绍了js实现酷炫倒计时动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章给大家分享的是jQuery怎样对文本框字数限制的方法。一般的文本输入框都是有字数限制的,下文我们尝试用jQuery怎样计算输入字数及控制和限制字数,文中的示例代码介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008