element UI实现动态生成多级表头

一、效果图

二、封装两个组件,分别为DynamicTable.vue和TableColumn.vue,TableColumn.vue主要是使用递归来对表头进行循环生成

DynamicTable.vue

 1 <template>
 2   <el-table :data="tableData" border :height="height">
 3     <template v-for="item in tableHeader">
 4       <table-column v-if="item.children && item.children.length" :key="item.id" :coloumn-header="item"></table-column>
 5       <el-table-column v-else :key="item.id" :label="item.label" :prop="item.prop" align="center"></el-table-column>
 6     </template>
 7   </el-table>
 8 </template>
 9
10 <script>
11 import TableColumn from ‘./TableColumn‘
12 export default {
13   props: {
14     // 表格的数据
15     tableData: {
16       type: Array,
17       required: true
18     },
19     // 多级表头的数据
20     tableHeader: {
21       type: Array,
22       required: true
23     },
24     // 表格的高度
25     height: {
26       type: String,
27       default: ‘300‘
28     }
29   },
30   components: {
31     TableColumn
32   }
33 }
34 </script>
35
36 <style scoped>
37
38 </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代码

1     <div class="result-wrapper">
2       <dynamic-table :table-data="tableData" :table-header="tableConfig" v-if="dynamicTableShow"></dynamic-table>
3       <dynamic-form v-else></dynamic-form>
4     </div>

JS代码

  1 <script>
  2 import DynamicTable from ‘./components/DynamicTable‘
  3 export default {
  4   components: {
  5     DynamicTable
  6   },
  7   data () {
  8     return {
  9       searchForm: {
 10         month: getMonth(),
 11         serviceCategory: ‘1‘
 12       },
 13       dynamicTableShow: true, // 使得DynamicTable组件重新渲染变量
 14       // 表数据
 15       tableData: [
 16         {
 17           districtName: ‘1‘,
 18           timeDimension: ‘2‘,
 19           residentPopNum: ‘3‘,
 20           residentPopDst: ‘4‘,
 21           liveLandArea: ‘5‘,
 22           liveLandDst: ‘6‘,
 23           employmentLandArea: ‘7‘,
 24           employmentLandDst: ‘8‘
 25         }
 26       ],
 27       // 表头数据
 28       tableConfig: [
 29         {
 30           id: 100,
 31           label: ‘一级表头‘,
 32           prop: ‘‘,
 33           children: [
 34             {
 35               id: 110,
 36               label: ‘二级表头1‘,
 37               prop: ‘districtName‘
 38             },
 39             {
 40               id: 120,
 41               label: ‘二级表头2‘,
 42               prop: ‘timeDimension‘
 43             }
 44           ]
 45         },
 46         {
 47           id: 200,
 48           label: ‘一级表头1‘,
 49           prop: ‘‘,
 50           children: [
 51             {
 52               id: 210,
 53               label: ‘二级表头2‘,
 54               prop: ‘‘,
 55               children: [
 56                 {
 57                   id: 211,
 58                   label: ‘三级表头3‘,
 59                   prop: ‘residentPopNum‘
 60                 },
 61                 {
 62                   id: 212,
 63                   label: ‘三级表头‘,
 64                   prop: ‘residentPopDst‘
 65                 }
 66               ]
 67             }
 68           ]
 69         },
 70         {
 71           id: 300,
 72           label: ‘一级表头1‘,
 73           prop: ‘‘,
 74           children: [
 75             {
 76               id: 310,
 77               label: ‘二级表头2‘,
 78               prop: ‘‘,
 79               children: [
 80                 {
 81                   id: 311,
 82                   label: ‘三级表头3‘,
 83                   prop: ‘liveLandArea‘
 84                 },
 85                 {
 86                   id: 312,
 87                   label: ‘三级表头3‘,
 88                   prop: ‘liveLandDst‘
 89                 }
 90               ]
 91             },
 92             {
 93               id: 320,
 94               label: ‘二级表头1‘,
 95               prop: ‘‘,
 96               children: [
 97                 {
 98                   id: 321,
 99                   label: ‘三级表头3‘,
100                   prop: ‘employmentLandArea‘
101                 },
102                 {
103                   id: 322,
104                   label: ‘三级表头3‘,
105                   prop: ‘employmentLandDst‘
106                 }
107               ]
108             }
109           ]
110         }
111       ]
112     }
113   },
114   methods: {
115     // 服务类型改变的时候,需要重新请求表头信息和表格数据
116     handleServiceCategoryChange (val) {
117       // 设置dynamicTableShow为false,使得DynamicTable组件重新渲染
118       this.dynamicTableShow = false
119       if (val === ‘1‘) {
120         this.tableData = [
121           {
122             districtName: ‘1‘,
123             timeDimension: ‘2‘,
124             residentPopNum: ‘3‘,
125             residentPopDst: ‘4‘,
126             liveLandArea: ‘5‘,
127             liveLandDst: ‘6‘,
128             employmentLandArea: ‘7‘,
129             employmentLandDst: ‘8‘
130           }
131         ]
132         this.tableConfig = [
133           {
134             id: 100,
135             label: ‘一级表头‘,
136             prop: ‘‘,
137             children: [
138               {
139                 id: 110,
140                 label: ‘二级表头1‘,
141                 prop: ‘districtName‘
142               },
143               {
144                 id: 120,
145                 label: ‘二级表头2‘,
146                 prop: ‘timeDimension‘
147               }
148             ]
149           },
150           {
151             id: 200,
152             label: ‘一级表头1‘,
153             prop: ‘‘,
154             children: [
155               {
156                 id: 210,
157                 label: ‘二级表头2‘,
158                 prop: ‘‘,
159                 children: [
160                   {
161                     id: 211,
162                     label: ‘三级表头3‘,
163                     prop: ‘residentPopNum‘
164                   },
165                   {
166                     id: 212,
167                     label: ‘三级表头‘,
168                     prop: ‘residentPopDst‘
169                   }
170                 ]
171               }
172             ]
173           },
174           {
175             id: 300,
176             label: ‘一级表头1‘,
177             prop: ‘‘,
178             children: [
179               {
180                 id: 310,
181                 label: ‘二级表头2‘,
182                 prop: ‘‘,
183                 children: [
184                   {
185                     id: 311,
186                     label: ‘三级表头3‘,
187                     prop: ‘liveLandArea‘
188                   },
189                   {
190                     id: 312,
191                     label: ‘三级表头3‘,
192                     prop: ‘liveLandDst‘
193                   }
194                 ]
195               },
196               {
197                 id: 320,
198                 label: ‘二级表头1‘,
199                 prop: ‘‘,
200                 children: [
201                   {
202                     id: 321,
203                     label: ‘三级表头3‘,
204                     prop: ‘employmentLandArea‘
205                   },
206                   {
207                     id: 322,
208                     label: ‘三级表头3‘,
209                     prop: ‘employmentLandDst‘
210                   }
211                 ]
212               }
213             ]
214           }
215         ]
216       } else {
217         this.tableData = [
218           {
219             districtName: ‘111‘,
220             timeDimension: ‘222‘
221           }
222         ]
223         this.tableConfig = [
224           {
225             id: 100,
226             label: ‘一级表头‘,
227             prop: ‘‘,
228             children: [
229               {
230                 id: 110,
231                 label: ‘二级表头1‘,
232                 prop: ‘districtName‘
233               },
234               {
235                 id: 120,
236                 label: ‘二级表头2‘,
237                 prop: ‘timeDimension‘
238               }
239             ]
240           }
241         ]
242       }
243       // 此处是DOM还没有更新,此处的代码是必须的
244       this.$nextTick(() => {
245         // DOM 现在更新了
246         this.dynamicTableShow = true
247       })
248     }
249   }
250 }
251 </script>
252
253 <style scoped>
254 .policy-wrapper{
255   margin-top: 10px;
256 }
257 .result-wrapper{
258   margin-top: 22px;
259 }
260 </style>

原文地址:https://www.cnblogs.com/llcdxh/p/9473458.html

时间: 2024-10-14 09:29:31

element UI实现动态生成多级表头的相关文章

动态生成多级菜单

MVC5+EF6 入门完整教程13 -- 动态生成多级菜单 稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据model动态产生. 文章提纲 概述要点 && 理论基础 详细步骤 一.分析多级目录的html结构 二.根据html结构构建data model 三.根据data model动态生成树形结构 四.解析树形结构成html 总结 概述要点 &am

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

稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据model动态产生. 文章提纲 概述要点 && 理论基础 详细步骤 一.分析多级目录的html结构 二.根据html结构构建data model 三.根据data model动态生成树形结构 四.解析树形结构成html 总结 概述要点 && 理论基础 要实现动态菜单,只要解决两个问题:

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

转载:开源社区http://www.oschina.net/code/snippet_1424099_49530?p=2代码] [Java]代码 该代码实现了Excel复杂表头的生成 基于sql server 的一张树表 你们可以 看代码自行建库 package com.jingjiu.util; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; i

poi 动态生成多表头execl

如果所示,我要导出的数据界面是下面这样的,前面样品编号.样品名称.炉次为主表数据,而检验结果是子表数据,这里子表的数据作为了主表的数据的一个字段(集合属性),下面代码会给大家看vo结构 下图为要导出的execl效果 开发思路: 1.该表头表体是根据主表样品名称不同而子表元素个数就会不同,所以第一步就是将前端传来的数据按样品名称分组 2.由于导出的数据顺序会乱,所以还是需要map排序下,这里我们可以按key排序 3.由于我要导出的数据是主子表结构,所以要将表体数据利用反射映射到表头去,以方便导出使

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

效果图: 前台调用: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using ExportCells; namespace WebApplication1 { public partial class _Default : Sy

用jquery根据json动态创建多级菜单导航

HTML结构: <section class="sidebar"></setion> { "liClass": "active treeview", "link": "index2.html", "label": "结构预览", "iClass": "'fa fa-dashboard'", "c

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

上篇文章我们完成了 动态生成多级菜单 这个实用组件. 本篇文章我们要开发另一个实用组件:面包屑导航. 面包屑导航(BreadcrumbNavigation)这个概念来自童话故事"汉赛尔和格莱特",当汉赛尔和格莱特穿过森林时,不小心迷路了,但是他们发现在沿途走过的地方都撒下了面包屑,让这些面包屑来帮助他们找到回家的路.所以,面包屑导航的作用是告诉访问者他们目前在网站中的位置以及如何返回.(摘自百度百科) 要实现面包屑导航,也可以直接从nuget搜一些sitemap组件直接使用. 当然,和

Silverlight系列--动态生成DataGrid列 根据动态列绑定Dictionary数据

1.获取表头数据源动态生成DataGrid表头 DataGridTextColumn d = new DataGridTextColumn(); d.Header = itemPriceClass.PriceKindCode + itemPriceClass.PriceKindName; Binding bin = new Binding(); bin.Converter = new RowIndexConverter(); bin.ConverterParameter = itemPriceC

vue+element UI实现多级导航菜单

1.前言 在某次日常开发中,项目要求页面的导航菜单需要动态加载,即菜单不能在页面上写死,菜单上的数据由后端开发从数据库中获取返回给前端使用,前端拿到数据后再通过解析数据最终将菜单渲染出来.由于菜单有可能是多级的,所以我们需要使用递归的方式,一层一层的递归数据,将多级菜单完整显示出来.本篇博文借助element UI组件库中的Navmenu导航菜单组件,将其进行改造后封装成一个多级导航菜单组件. 2.工作流程 组件封装好之后,由父组件调用该组件,父组件先向后端发送请求获取菜单数据,然后将菜单数据传