一、效果图

二、封装两个组件,分别为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. 最小安装的centos7下安装oracle 12c

    下载 oracal 安装包 进入https://www.oracle.com/index.html  依次选择-->Menu -->Downloads and trials -->D ...

  2. Maven简介、安装、配置

    1.Maven是什么? Maven是一种跨平台的项目管理工具,是一个开源的项目,主要服务于基于java平台的项目构建.依赖管理和项目信息管理.Maven还提供了中央仓库,能帮助我们自动的下载构件.Ma ...

  3. awk_printf

    awk -F: 'BEGIN{printf "%-20s%-20s%-20s\n","User","UID","Home" ...

  4. laravel 服务容器的用法

    建立一个服务 <?php namespace App\Services; class FooService { public function __construct(){ } public f ...

  5. DockerAPI版本不匹配的问题

    1.问题描述 在执行docker指令的时候显示client和server的API版本不匹配,如下: 说明:在这里server API的版本号比client API版本号低,因此不能有效实现cilent ...

  6. 小米 oj 发奖励(思维)

     发奖励 序号:#75难度:有挑战时间限制:1000ms内存限制:10M 描述 小明老师准备给一些得到小红花的小朋友发糖果做为奖励. 假设有n个小朋友,每个小朋友拥有的小红花为m(n)个,他让这n个小 ...

  7. ege图形库之动画排序

    老师布置了一个学习ege图形库来做动画排序的小动画程序,这是我自己做的效果.由于个人水平有限,可能代码有些地方可以改进.不足之处敬请指出. 注:要运行该代码需要正确配置,连接好ege图形库的头文件,做 ...

  8. XGBoost的优点

    1. Gradient boosting(GB) Gradient boosting的思想是迭代生多个(M个)弱的模型,然后将每个弱模型的预测结果相加,后面的模型Fm+1(x)基于前面学习模型的Fm( ...

  9. C#实现代码生成器

    最近在用layui做后台管理,增删改查这些一成不变的东西写起来浪费大量时间,于是做了个简单的代码生成器快速生成 代码生成器的原理其实很简单,都是基于模板实现替换,Razor是个不错的选择(或者Nvel ...

  10. C语言实现简单的哈希表

    这是一个简单的哈希表的实现,用c语言做的. 哈希表原理 这里不讲高深理论,只说直观感受.哈希表的目的就是为了根据数据的部分内容(关键字),直接计算出存放完整数据的内存地址. 试想一下,如果从链表中根据 ...