element UI实现动态生成多级表头
一、效果图


二、封装两个组件,分别为DynamicTable.vue和TableColumn.vue,TableColumn.vue主要是使用递归来对表头进行循环生成
DynamicTable.vue
<template>
<el-table :data="tableData" border :height="height">
<template v-for="item in tableHeader">
<table-column v-if="item.children && item.children.length" :key="item.id" :coloumn-header="item"></table-column>
<el-table-column v-else :key="item.id" :label="item.label" :prop="item.prop" align="center"></el-table-column>
</template>
</el-table>
</template> <script>
import TableColumn from './TableColumn'
export default {
props: {
// 表格的数据
tableData: {
type: Array,
required: true
},
// 多级表头的数据
tableHeader: {
type: Array,
required: true
},
// 表格的高度
height: {
type: String,
default: '300'
}
},
components: {
TableColumn
}
}
</script> <style scoped> </style>
TableColumn.vue
<template>
<el-table-column :label="coloumnHeader.label" :prop="coloumnHeader.label" align="center">
<template v-for="item in coloumnHeader.children">
<tableColumn v-if="item.children && item.children.length" :key="item.id" :coloumn-header="item"></tableColumn>
<el-table-column v-else :key="item.name" :label="item.label" :prop="item.prop" align="center"></el-table-column>
</template>
</el-table-column>
</template> <script>
export default {
name: 'tableColumn',
props: {
coloumnHeader: {
type: Object,
required: true
}
}
}
</script> <style scoped> </style>
三、使用
HTML代码
<div class="result-wrapper">
<dynamic-table :table-data="tableData" :table-header="tableConfig" v-if="dynamicTableShow"></dynamic-table>
<dynamic-form v-else></dynamic-form>
</div>
JS代码
<script>
import DynamicTable from './components/DynamicTable'
export default {
components: {
DynamicTable
},
data () {
return {
searchForm: {
month: getMonth(),
serviceCategory: '1'
},
dynamicTableShow: true, // 使得DynamicTable组件重新渲染变量
// 表数据
tableData: [
{
districtName: '1',
timeDimension: '2',
residentPopNum: '3',
residentPopDst: '4',
liveLandArea: '5',
liveLandDst: '6',
employmentLandArea: '7',
employmentLandDst: '8'
}
],
// 表头数据
tableConfig: [
{
id: 100,
label: '一级表头',
prop: '',
children: [
{
id: 110,
label: '二级表头1',
prop: 'districtName'
},
{
id: 120,
label: '二级表头2',
prop: 'timeDimension'
}
]
},
{
id: 200,
label: '一级表头1',
prop: '',
children: [
{
id: 210,
label: '二级表头2',
prop: '',
children: [
{
id: 211,
label: '三级表头3',
prop: 'residentPopNum'
},
{
id: 212,
label: '三级表头',
prop: 'residentPopDst'
}
]
}
]
},
{
id: 300,
label: '一级表头1',
prop: '',
children: [
{
id: 310,
label: '二级表头2',
prop: '',
children: [
{
id: 311,
label: '三级表头3',
prop: 'liveLandArea'
},
{
id: 312,
label: '三级表头3',
prop: 'liveLandDst'
}
]
},
{
id: 320,
label: '二级表头1',
prop: '',
children: [
{
id: 321,
label: '三级表头3',
prop: 'employmentLandArea'
},
{
id: 322,
label: '三级表头3',
prop: 'employmentLandDst'
}
]
}
]
}
]
}
},
methods: {
// 服务类型改变的时候,需要重新请求表头信息和表格数据
handleServiceCategoryChange (val) {
// 设置dynamicTableShow为false,使得DynamicTable组件重新渲染
this.dynamicTableShow = false
if (val === '1') {
this.tableData = [
{
districtName: '1',
timeDimension: '2',
residentPopNum: '3',
residentPopDst: '4',
liveLandArea: '5',
liveLandDst: '6',
employmentLandArea: '7',
employmentLandDst: '8'
}
]
this.tableConfig = [
{
id: 100,
label: '一级表头',
prop: '',
children: [
{
id: 110,
label: '二级表头1',
prop: 'districtName'
},
{
id: 120,
label: '二级表头2',
prop: 'timeDimension'
}
]
},
{
id: 200,
label: '一级表头1',
prop: '',
children: [
{
id: 210,
label: '二级表头2',
prop: '',
children: [
{
id: 211,
label: '三级表头3',
prop: 'residentPopNum'
},
{
id: 212,
label: '三级表头',
prop: 'residentPopDst'
}
]
}
]
},
{
id: 300,
label: '一级表头1',
prop: '',
children: [
{
id: 310,
label: '二级表头2',
prop: '',
children: [
{
id: 311,
label: '三级表头3',
prop: 'liveLandArea'
},
{
id: 312,
label: '三级表头3',
prop: 'liveLandDst'
}
]
},
{
id: 320,
label: '二级表头1',
prop: '',
children: [
{
id: 321,
label: '三级表头3',
prop: 'employmentLandArea'
},
{
id: 322,
label: '三级表头3',
prop: 'employmentLandDst'
}
]
}
]
}
]
} else {
this.tableData = [
{
districtName: '111',
timeDimension: '222'
}
]
this.tableConfig = [
{
id: 100,
label: '一级表头',
prop: '',
children: [
{
id: 110,
label: '二级表头1',
prop: 'districtName'
},
{
id: 120,
label: '二级表头2',
prop: 'timeDimension'
}
]
}
]
}
// 此处是DOM还没有更新,此处的代码是必须的
this.$nextTick(() => {
// DOM 现在更新了
this.dynamicTableShow = true
})
}
}
}
</script> <style scoped>
.policy-wrapper{
margin-top: 10px;
}
.result-wrapper{
margin-top: 22px;
}
</style>
element UI实现动态生成多级表头的更多相关文章
- vue+element-ui动态生成多级表头,并且将有相同字段下不同子元素合并为同一个
element表头要多层生成,下一级表头数据源必须是当前表头的子一级,这样一层一层嵌套可以生成多层表头: 要把数据处理成这种类型的数据 var arr = []; for (var key in ob ...
- MVC5+EF6 入门完整教程13 -- 动态生成多级菜单
稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据mode ...
- JAVA操作Excel 可配置,动态 生成复杂表头 复杂的中国式报表表头
转载:开源社区http://www.oschina.net/code/snippet_1424099_49530?p=2代码] [Java]代码 该代码实现了Excel复杂表头的生成 基于sql se ...
- vue2.0+Element UI 实现动态表单(点击按钮增删一排输入框)
对于动态增减表单项,Element UI 官方文档表单那一节已经介绍得很清楚了,我之前没有看见,绕了很多弯路,这里针对点击按钮增删一排输入框的问题做一个总结. 效果图如下 存在一排必填的姓名与手机号, ...
- WPF + RDLC + 动态生成列 + 表头合并
如下,评论超过20条,马上发代码*(੭*ˊᵕˋ)੭*ଘ,效果如下: 代码逻辑简单. WPF使用RDLC需要使用如下DLL 新建WPF 窗体,黏贴下大概如下 <Window xmlns:rv=&q ...
- vue+element UI递归方式实现多级导航菜单
介绍 这是一个是基于element-UI的导航菜单组件基础上,进行了二次封装的菜单组件,该组件以组件递归的方式,实现了可根据从后端接收到的json菜单数据,动态渲染多级菜单的功能. 使用方法 由于该组 ...
- 使用aspose.cell动态导出多表头 EXCEL
效果图: 前台调用: using System; using System.Collections.Generic; using System.Linq; using System.Web; usin ...
- 第三方控件netadvantage UltraWebGrid如何生成多级跨行表头个人总结
1.生成多级表头,横向和纵向跨度. 1>对于有字段的的表头合并:也就是(工期.项目经理信息除外)可以在前台通过spanx和spany属性控制.对于空字段(工资.项目经理必须通过后台动态添加),而 ...
- MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航
上篇文章我们完成了 动态生成多级菜单 这个实用组件. 本篇文章我们要开发另一个实用组件:面包屑导航. 面包屑导航(BreadcrumbNavigation)这个概念来自童话故事"汉赛尔和格莱 ...
随机推荐
- mongodb命令----批量更改文档字段名
因为mongodb基于javascript的特性,为了体验cursor的威力我们不妨利用js的for循环创建记录 先创建文档 db.createCollection("columnsampl ...
- Java数据库小项目02--管家婆项目
目录 项目要求 开发环境搭建 工具类JDBCUtils 创建管家婆数据表 项目分层 MainApp层 MainView层 ZhangWuController层 ZhangWuService层 Zhan ...
- How to Set Up Chinese Characters on Windows 7
How to Change the Display Language of non-Unicode Programs in Windows http://www.7tutorials.com/chan ...
- codeforces163D
Large Refrigerator CodeForces - 163D 给定一个长方体的体积V,求出这个长方体的最小表面积. 输入 第一行有一个整数t (1 ≤ t ≤ 500) — 测试数据的组数 ...
- 第一次使用Open Live Writer写博客
写一下来试一试,感觉还是蛮有趣的.但是我并不知道写下来的文章是什么格式的,我刚才用VS Code打开看了一下好像都是二进制格式. 7.5正式入职,已经过去七天了.等培训结束就要去Base地了,新的生活 ...
- js off动画事件
每个假期都过得如此快10月一是2017年最后一个假期.不由感叹时间过得真快.我已上个月离职,一直在家休整,今天得空吧前几天学习的知识真理一下. 今天主要整理关于,offset系列的,动画是咱们全都工作 ...
- Hdu 5248
hdu5248-序列变换 题意: 给你一个序列A,要求改变序列A中的某些元素的顺序,形成一个新的数列B,并保证数列B严格单调递增,求出最小代价. 代价计算公式 $ cost(a,b)=max(|A_i ...
- java随机生成6位随机数 5位随机数 4位随机数
随机数,应用会相当广,验证数,订单号,流水号拼接. 下面是java随机数生成语句: 生成6位随机数(不会是5位或者7位,仅只有6位): System.+)*)); 同理,生成5位随机数: System ...
- 2个最好的JavaScript编辑器 必须要知道
JavaScript程序员有许多很好的工具可供选择,几乎太多了.在这篇文章中,介绍2个最好用的文本编辑器,也是顶级的.并且很好地支持使用JavaScript,HTML5和CSS进行开发,并用Markd ...
- pom标签大全
[原文链接]:Maven POM | 菜鸟教程 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...