一、效果图

二、封装两个组件,分别为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实现动态生成多级表头的更多相关文章

  1. vue+element-ui动态生成多级表头,并且将有相同字段下不同子元素合并为同一个

    element表头要多层生成,下一级表头数据源必须是当前表头的子一级,这样一层一层嵌套可以生成多层表头: 要把数据处理成这种类型的数据 var arr = []; for (var key in ob ...

  2. MVC5+EF6 入门完整教程13 -- 动态生成多级菜单

    稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据mode ...

  3. JAVA操作Excel 可配置,动态 生成复杂表头 复杂的中国式报表表头

    转载:开源社区http://www.oschina.net/code/snippet_1424099_49530?p=2代码] [Java]代码 该代码实现了Excel复杂表头的生成 基于sql se ...

  4. vue2.0+Element UI 实现动态表单(点击按钮增删一排输入框)

    对于动态增减表单项,Element UI 官方文档表单那一节已经介绍得很清楚了,我之前没有看见,绕了很多弯路,这里针对点击按钮增删一排输入框的问题做一个总结. 效果图如下 存在一排必填的姓名与手机号, ...

  5. WPF + RDLC + 动态生成列 + 表头合并

    如下,评论超过20条,马上发代码*(੭*ˊᵕˋ)੭*ଘ,效果如下: 代码逻辑简单. WPF使用RDLC需要使用如下DLL 新建WPF 窗体,黏贴下大概如下 <Window xmlns:rv=&q ...

  6. vue+element UI递归方式实现多级导航菜单

    介绍 这是一个是基于element-UI的导航菜单组件基础上,进行了二次封装的菜单组件,该组件以组件递归的方式,实现了可根据从后端接收到的json菜单数据,动态渲染多级菜单的功能. 使用方法 由于该组 ...

  7. 使用aspose.cell动态导出多表头 EXCEL

    效果图: 前台调用: using System; using System.Collections.Generic; using System.Linq; using System.Web; usin ...

  8. 第三方控件netadvantage UltraWebGrid如何生成多级跨行表头个人总结

    1.生成多级表头,横向和纵向跨度. 1>对于有字段的的表头合并:也就是(工期.项目经理信息除外)可以在前台通过spanx和spany属性控制.对于空字段(工资.项目经理必须通过后台动态添加),而 ...

  9. MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航

    上篇文章我们完成了 动态生成多级菜单 这个实用组件. 本篇文章我们要开发另一个实用组件:面包屑导航. 面包屑导航(BreadcrumbNavigation)这个概念来自童话故事"汉赛尔和格莱 ...

随机推荐

  1. 内置对象:Math

    JavaScript内置函数Math.random()自定义封装函数:1,Math.floor(Math.random()*(b-a+1)+a)  随机生成a到b之间的整数. 也可以写成:Math.f ...

  2. net core 3 使用 autofac

    参考官方:https://docs.autofac.org/en/latest/integration/aspnetcore.html#startup-class 有一些变动,现在暂时还没用net c ...

  3. sqlite3-python

    官网资料 https://sqlite.org/lang_createtable.html 操作参考: https://www.runoob.com/sqlite/sqlite-insert.html ...

  4. @Autowired @Primary @Qualifier

    1 2 3 4 5

  5. 51 Nod 1070 Bash游戏v4(斐波那契博弈)

    这题的证明看不太懂,日后再重做... 1070 Bash游戏 V4  基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有一堆石子共有N个.A B两个 ...

  6. x86—EFLAGS寄存器详解[转]

    鉴于EFLAGS寄存器的重要性,所以将这一部分内容从处理器体系结构及寻址模式一文中单独抽出另成一文,这部分内容主要来自Intel Developer Mannual,在后续的内核系列中遇到的许多和EF ...

  7. 解决xftp远程连接后出现中文乱码

  8. JVM GC之垃圾收集器

    简述 如果说收集算法时内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.这里我们讨论的垃圾收集器是基于JKD1.7之后的Hotspot虚拟机,这个虚拟机包含的所有收集器如图: Serial 收集 ...

  9. Druid数据源监控配置

    在web.xml中添加如下代码 <!-- druid监控 --> <servlet> <servlet-name>DruidStatView</servlet ...

  10. 【平台中间件】为什么用etcd而不用ZooKeeper?从应用场景到实现原理的全方位解读

    前言 博主在工作过程中经常接触到ETCD,搜索相关资料的时候发现排名最高的是一篇图片全是404的转载文章,后来看到了原文,感觉有义务让更多的人看到这样的精品文章,所以进行了转载. 原文发布在infoQ ...