将后台返回的数组,按照父子结构分类,并展示
如下为最简单的实现方法
需求:
后台返回数据 |
---|
前端要展示的效果 |
---|
实现代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<title>Document</title>
<style>
*{
padding: 0;
margin: 0;
box-sizing: border-box;
list-style: none;
}
ul.tab{
margin-bottom: 20px;
display: block;
overflow: hidden;
}
.tab li{
width: 120px;
float: left;
text-align: center;
border-bottom:1px solid #ccc;
margin-left: 20px;
height: 40px;
line-height: 40px;
}
li.on{
border-bottom:1px solid #69f;
}
.title{
font-size: 18px; border: 1px solid #ccc;
background-color: #ddd;
margin-bottom: 10px;
padding: 0 10px;
}
li{
line-height: 40px;
}
.list{
width: 500px;
height: 500px;
overflow: auto;
}
</style>
</head>
<body>
<div id="app">
<h2> {{msg}} </h2>
<hr/>
<div style="border: 1px solid #ddd; margin: 10px; padding: 20px; overflow: auto;">
<ul class="tab">
<li v-for="(item,index) in allKind" :key="item.name"
:class="[index == currentIndex ? 'on':'']"
@click="liClick(index)">
{{item.name}}
</li>
</ul>
<div class="list">
<ul>
<li v-for="(item,index) in currentList.children" :key="item.name">
<div v-if="item.children && item.children.length>0">
<div class="title">{{item.name}}</div>
<ul v-for="(sub) in item.children" :key="sub.propertyname">
<li>
<div v-if="sub.children && sub.children.length>0">
<div class="title">{{sub.propertyname}}</div>
<ul v-for="(son) in sub.children" :key="son.name">
<li>
无限循环 {{son.name}} {{ son.children }}
</li>
</ul>
</div>
<div v-else>{{sub.propertyname}}:
<input />
</div>
</li>
</ul>
</div>
<div v-else>{{ item.name }}</div>
</li>
</ul>
</div>
</div>
</div>
<script>
var obj =
{
"PropertyTypelist": "[{\"name\":\"属性\",\"propertyTypeName\":\"properties\"},{\"name\":\"类型\",\"propertyTypeName\":\"type\"}]",
"dtT": [
{
"id": 36446732,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "约束",
"propertyname": "底部标高",
"ifcurl": null,
"provalue": "ROOF PLAN",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446733,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "构造",
"propertyname": "椽截面",
"ifcurl": null,
"provalue": "33615",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446734,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "构造",
"propertyname": "封檐板深度(m)",
"ifcurl": null,
"provalue": "0",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446735,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "标识数据",
"propertyname": "图像",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446736,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "标识数据",
"propertyname": "注释",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446737,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "标识数据",
"propertyname": "标记",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446738,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "消防系统",
"propertyname": "Rating",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446739,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "阶段化",
"propertyname": "创建的阶段",
"ifcurl": null,
"provalue": "New Construction",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446740,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "阶段化",
"propertyname": "拆除的阶段",
"ifcurl": null,
"provalue": "无",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446741,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "标识数据",
"propertyname": "设计选项",
"ifcurl": null,
"provalue": "主模型",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446742,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "尺寸标注",
"propertyname": "坡度(%)",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446743,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "约束",
"propertyname": "房间边界",
"ifcurl": null,
"provalue": "1",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446744,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "编辑板形状",
"propertyname": "弯曲边缘条件",
"ifcurl": null,
"provalue": "0",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446745,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "约束",
"propertyname": "与体量相关",
"ifcurl": null,
"provalue": "0",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446746,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "尺寸标注",
"propertyname": "厚度(m)",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446747,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "约束",
"propertyname": "自标高的底部偏移(m)",
"ifcurl": null,
"provalue": "-0.587375",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446748,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "约束",
"propertyname": "截断标高",
"ifcurl": null,
"provalue": "无",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446749,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "约束",
"propertyname": "截断偏移(m)",
"ifcurl": null,
"provalue": "0",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446750,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "构造",
"propertyname": "最大屋脊高度(m)",
"ifcurl": null,
"provalue": "2533.5357",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446751,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "尺寸标注",
"propertyname": "体积(m³)",
"ifcurl": null,
"provalue": "33.1137760661546",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446752,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "尺寸标注",
"propertyname": "面积(㎡)",
"ifcurl": null,
"provalue": "75.4351607655083",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446753,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "构造",
"propertyname": "结构",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446754,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "图形",
"propertyname": "粗略比例填充样式",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446755,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "图形",
"propertyname": "粗略比例填充颜色",
"ifcurl": null,
"provalue": "8421504",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446756,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "构造",
"propertyname": "默认的厚度(m)",
"ifcurl": null,
"provalue": "0.473075",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446757,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "标识数据",
"propertyname": "类型图像",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446758,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "标识数据",
"propertyname": "注释记号",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446759,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "标识数据",
"propertyname": "型号",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446760,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "标识数据",
"propertyname": "制造商",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446761,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "标识数据",
"propertyname": "类型注释",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446762,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "标识数据",
"propertyname": "URL",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446763,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "标识数据",
"propertyname": "说明",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446764,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "标识数据",
"propertyname": "部件说明",
"ifcurl": null,
"provalue": "Roof Construction",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446765,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "标识数据",
"propertyname": "部件代码",
"ifcurl": null,
"provalue": "B1020",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446766,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "标识数据",
"propertyname": "类型标记",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446767,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "标识数据",
"propertyname": "成本",
"ifcurl": null,
"provalue": "",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446768,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "分析属性",
"propertyname": "传热系数(U)(W/(m².K))",
"ifcurl": null,
"provalue": "14488.1889763779",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446769,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "分析属性",
"propertyname": "热阻(R)((m²·K)/W)",
"ifcurl": null,
"provalue": "6.90217391304348E-05",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446770,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "分析属性",
"propertyname": "热质量(KJ/K)",
"ifcurl": null,
"provalue": "3.571904727144",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446771,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "分析属性",
"propertyname": "吸收率",
"ifcurl": null,
"provalue": "0.1",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446772,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "type",
"propertySetName": "分析属性",
"propertyname": "粗糙度",
"ifcurl": null,
"provalue": "1",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446773,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "几何中心点",
"propertyname": "X",
"ifcurl": null,
"provalue": "3492.494",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446774,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "几何中心点",
"propertyname": "Y",
"ifcurl": null,
"provalue": "-1206.23645",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446775,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "几何中心点",
"propertyname": "Z",
"ifcurl": null,
"provalue": "2533299.2121",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446776,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "包围盒顶点坐标",
"propertyname": "point 1",
"ifcurl": null,
"provalue": "-2019.306,-5651.2365,2533062.7242",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446777,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "包围盒顶点坐标",
"propertyname": "point 2",
"ifcurl": null,
"provalue": "9004.294,-5651.2365,2533062.7242",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446778,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "包围盒顶点坐标",
"propertyname": "point 3",
"ifcurl": null,
"provalue": "9004.294,3238.7636,2533062.7242",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446779,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "包围盒顶点坐标",
"propertyname": "point 4",
"ifcurl": null,
"provalue": "-2019.306,3238.7636,2533062.7242",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446780,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "包围盒顶点坐标",
"propertyname": "point 5",
"ifcurl": null,
"provalue": "-2019.306,-5651.2365,2533535.7",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446781,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "包围盒顶点坐标",
"propertyname": "point 6",
"ifcurl": null,
"provalue": "9004.294,-5651.2365,2533535.7",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446782,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "包围盒顶点坐标",
"propertyname": "point 7",
"ifcurl": null,
"provalue": "9004.294,3238.7636,2533535.7",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
},
{
"id": 36446783,
"glid": "4523149",
"externalId": "4523149",
"propertyTypeName": "properties",
"propertySetName": "包围盒顶点坐标",
"propertyname": "point 8",
"ifcurl": null,
"provalue": "-2019.306,3238.7636,2533535.7",
"modelName": "766218",
"groupname": "基本屋顶",
"MileageID": 16,
"DocumentModel": "766218"
}
]
}
var vm=new Vue({
el: '#app',
data:{
msg: '标题',
allKind: [],
currentList: [],
currentIndex: 0
},
mounted(){
this.dealData();
},
methods:{
liClick(index){
console.log('index',index);
this.currentIndex = index;
this.currentList = this.allKind[index]
},
dealData(){
let allKindArr;
if(typeof obj.PropertyTypelist === 'string'){
allKindArr = JSON.parse(obj.PropertyTypelist)
}else{
allKindArr = obj.PropertyTypelist
}
for (let i = 0; i < allKindArr.length; i++) {
for (let j = 0; j < obj.dtT.length; j++) {
if(obj.dtT[j].propertyTypeName == allKindArr[i].propertyTypeName){
if(!allKindArr[i].data){
allKindArr[i].data = []
}
allKindArr[i].data.push(obj.dtT[j])
}
}
}
console.error('allKindArr',allKindArr);
// 再次循环,对儿子分类
for (let i = 0; i < allKindArr.length; i++) {
let nameArr = []
console.error('清空nameArr',nameArr.toString());
for (let j = 0; j < allKindArr[i].data.length; j++) {
let one = allKindArr[i].data[j]
if(!nameArr.includes(one.propertySetName)){
nameArr.push(one.propertySetName)
console.log('nameArr:',nameArr.toString());
let newKind = {
name: one.propertySetName,
children: [one]
}
if(!allKindArr[i].children){
allKindArr[i].children = []
}
allKindArr[i].children.push(newKind)
}
else{
// 如果已经存在了
// console.error('nameArr存在',j,nameArr.toString());
let indx = nameArr.indexOf(one.propertySetName);
console.log('indx',indx);
allKindArr[i].children[indx].children.push(one)
}
}
}
this.allKind = allKindArr;
// 默认第一个
this.currentList = this.allKind[0];
console.log('currentList',this.currentList);
}
}
})
</script>
</body>
</html>
以上为最简单的实现方法:其实:
最佳实现方法: 组件递归
对于这种无限循环的内容,最好采用vue的组件递归的方法,就能轻松适应了。不管后台返回多少层,都能循环渲染出来。
如果对vue的组件递归方法有兴趣的,可以自己百度,也可以加我微信号yizheng369聊喔。