vue+element-ui中实现多层级复杂的维度根据数据自动生成的表头

表头主要复杂在:
1,有三层,一层是大类,第二层是具体项,第三层是标准值/对比值
2,首列和末尾列是一层
3,整个表格的维度是根据数据的输入自己生成,也就是动态的

vue+element-ui中实现多层级复杂的维度根据数据自动生成的表头_第1张图片

下面是在 vue + eleUI 中的解决方案:


   
   
       
           
               
           

       

   

   
       
   


其对应data:
//整理出所有的label和标准对象的属性
itemList: [],
//实际数据

tableData:[]

《方法二》

vue+element
html配置:

< div id= "table" >{{tableData}}
< el-table : data= "tabledata01" : span-method= "tableSpanMethod" max-height= "420" >
< el-table-column v-for= 'item in tableConfig' : label= "item.label" : prop= 'item.prop' : width= 'item.width' : key= "item.id" >
< el-table-column v-if= 'item.children||item.children.length>0' v-for= "item1 in item.children"
: label= "item1.label" : prop= 'item1.prop' : width= 'item1.width' : key= "item1.id" >
< el-table-column v-if= 'item1.children||item1.children.length>0' v-for= "item2 in item1.children"
: label= "item2.label" : prop= 'item2.prop' : width= 'item2.width' : key= "item2.id" >
el-table-column >
el-table-column >
el-table-column >
el-table >
div >

data:
tableConfig:[
{id: 100,label: '一级表头',prop: '',width: '',children:[
{id: 110,label: '二级表头1',prop: 'districtName',width: ''},
{id: 120,label: '二级表头2',prop: 'timeDimension',width: ''}
]},
{id: 200,label: '一级表头',prop: '',width: '',children:[
{id: 210,label: '二级表头',prop: '',width: '',children:[
{id: 211,label: '三级表头',prop: 'residentPopNum',width: '110'},
{id: 212,label: '三级表头',prop: 'residentPopDst',width: '110'}
]}
]},
{id: 300,label: '一级表头',prop: '',width: '',children:[
{id: 310,label: '二级表头',prop: '',width: '',children:[
{id: 311,label: '三级表头',prop: 'liveLandArea',width: '110'},
{id: 312,label: '三级表头',prop: 'liveLandDst',width: '110'}
],
},
{id: 320,label: '二级表头',prop: '',width: '',children:[
{id: 321,label: '三级表头(km²)',prop: 'employmentLandArea',width: '110'},
{id: 322,label: '三级表头',prop: 'employmentLandDst',width: '110'}
],
}
]},
{id: 400,label: '一级表头',prop: '',width: '',children:[
{id: 410,label: '二级表头',prop: '',width: '',children:[
{id: 411,label: '三级表头(个)',prop: 'regionTrafficHubNum',width: '110'},
{id: 412,label: '三级表头(人次/km²)',prop: 'regionTrafficHubFlow',width: '140'}
],
},
{id: 420,label: '二级表头',prop: '',width: '',children:[
{id: 421,label: '三级表头(个)',prop: 'highSpeedNum',width: '110'},
{id: 422,label: '三级表头(个/km²)',prop: 'highSpeedDst',width: '140'}
],
},{id: 430,label: '二级表头',prop: '',width: '',children:[
{id: 431,label: '三级表头(个)',prop: 'trackTrafficSpotNum',width: '140'},
{id: 432,label: '三级表头(个/km²)',prop: 'trackTrafficSpotDst',width: '140'}
],
},
{id: 440,label: '二级表头',prop: '',width: '',children:[
{id: 441,label: '三级表头(km)',prop: 'trackTrafficNetNum',width: '110'},
{id: 442,label: '三级表头(km/km²)',prop: 'trackTrafficNetDst',width: '140'}
],
},
{id: 450,label: '二级表头',prop: '',width: '',children:[
{id: 451,label: '三级表头(个)',prop: 'cityTrafficHubNum',width: '110'},
{id: 452,label: '三级表头(个/km²)',prop: 'cityTrafficHubDst',width: '110'},
{id: 453,label: '三级表头(人次/km²)',prop: 'cityTrafficHubFlow',width: '140'}
],
},
{id: 460,label: '二级表头',prop: '',width: '',children:[
{id: 461,label: '三级表头(km)',prop: 'cityTrafficNetNum',width: '110'},
{id: 462,label: '三级表头',prop: 'cityTrafficNetDst',width: '140'}
],
},
]},
{id: 500,label: '一级表头',prop: '',width: '',children:[
{id: 510,label: '二级表头',prop: '',width: '',children:[
{id: 511,label: '三级表头(km²)',prop: 'pubServeLandArea',width: '110'},
{id: 512,label: '三级表头',prop: 'pubServeLandDst',width: '110'}
],
},
{id: 520,label: '二级表头',prop: '',width: '',children:[
{id: 521,label: '三级表头(个)',prop: 'hospitalResourcesNum',width: '110'},
{id: 522,label: '三级表头(km²)',prop: 'hospitalResourcesArea',width: '110'},
{id: 523,label: '三级表头(个/km²)',prop: 'hospitalResourcesDst',width: '110'}
],
},{id: 530,label: '二级表头',prop: '',width: '',children:[
{id: 531,label: '三级表头(个)',prop: 'schoolResourcesNum',width: '110'},
{id: 532,label: '三级表头(km²)',prop: 'schoolResourcesArea',width: '110'},
{id: 533,label: '三级表头(个/km²)',prop: 'schoolResourcesDst',width: '110'}
],
},
{id: 540,label: '二级表头',prop: '',width: '',children:[
{id: 541,label: '三级表头(个)',prop: 'humanResourcesNum',width: '110'},
{id: 542,label: '三级表头(个/km²)',prop: 'humanResourcesDst',width: '110'}
],
},
{id: 550,label: '二级表头',prop: '',width: '',children:[
{id: 551,label: '三级表头(个)',prop: 'businessResourcesNum',width: '110'},
{id: 552,label: '三级表头(个/km²)',prop: 'businessResourcesDst',width: '110'}
],
},
{id: 560,label: '二级表头',prop: '',width: '',children:[
{id: 561,label: '三级表头(个)',prop: 'environResourcesNum',width: '110'},
{id: 562,label: '三级表头(个/km²)',prop: 'environResourcesDst',width: '110'}
],
},
]},
{id: 600,label: '一级表头',prop: '',width: '',children:[
{id: 610,label: '二级表头',prop: '',width: '',children:[
{id: 611,label: '三级表头(分)',prop: 'populationScore',width: '110'},
],
},
{id: 620,label: '二级表头',prop: '',width: '',children:[
{id: 621,label: '三级表头(分)',prop: 'landScore',width: '110'},
],
},{id: 630,label: '二级表头',prop: '',width: '',children:[
{id: 631,label: '三级表头(分)',prop: 'trafficScore',width: '110'},
],
},
{id: 640,label: '二级表头',prop: '',width: '',children:[
{id: 641,label: '三级表头(分)',prop: 'communalFacilitiesScore',width: '110'},
],
},
{id: 650,label: '二级表头',prop: '',width: '',children:[
{id: 651,label: '三级表头(分)',prop: 'modelScore',width: '110'},
],
}
]},
],
注:动态生成表头必须配置"key"
view:

《elementUI使用指南》

开发环境


1.安装webpack

npm install -g webpack
  • 1

2.安装vue-cli

vue-cli是什么?

vue-cli 是vue.js的脚手架,用于自动生成vue.js模板工程的。

使用步骤:

  • 安装vue-cli:

    npm install -g vue-cli
    • 1
  • 使用vue-cli构建项目

    vue init webpack project-name  //创建一个基于webpack模板的名为project-name的项目
    • 1

    目前可用的模板包括:

    • browserify–全功能的Browserify + vueify,包括热加载,静态检测,单元测试。
    • browserify-simple–一个简易的Browserify + vueify,以便于快速开始。
    • webpack–全功能的Webpack + vueify,包括热加载,静态检测,单元测试。
    • webpack-simple–一个简易的Webpack + vueify,以便于快速开始。
  • 安装项目依赖

    cd project-name    //进入项目目录
    npm install        //安装项目依赖
    npm run dev        //运行项目
    • 1
    • 2
    • 3

此时在浏览器打开:localhost:8080即可看到欢迎页。

关于webpack和vue-cli的更多使用方法参见官方文档。

  • 但是这个只能在本地跑,要如何在我们自己的服务器上访问呢?此时需要执行

    npm run build
    • 1

搭建开发环境

本来想用vue-cli重新创建项目,试了几次总是出现各种问题,没办法成功。最后在仔细查看 Element-UI 的官方文档的 快速上手 部分的时候发现 饿了么 团队给了一个他们自己的 项目模板 。于是我就用这个模板来尝试了下,结果成功了。所以,如果你不想太折腾的话,建议还是使用官方给的项目模板,可以省很多事。

第一步:安装项目模板

  • 克隆/下载项目模板

  • 将下载的模板放到你项目的根目录下

  • 安装依赖

    npm install
    • 1
  • 运行项目模板

    npm run dev
    • 1

    此时在浏览器打开:localhost:8080即可看到欢迎页。

    欢迎页

项目模板里已经把需要配置的文件都配置好了。

第二步:安装element-ui

第一步,我们成功安装了项目模板,接下来,我们需要安装element-ui到项目下。

npm i element-ui@next -D
  • 1

开始使用

接下来我们就可以参照 Element-UI 的官方文档上手开发了。

例子

我们参照官方的按钮组件使用说明,在项目模板的基础上做一个按钮的例子。其它文件不需要改动,只修改App.vue文件的内容。代码如下:

App.vue