最近做了一个项目,后台是无限层级的菜单,那么前端如何无限递归动态生成菜单呢? |
---|
自己写了一个递归算法效果如下 |





一、代码实现

subjectTree:[
{
id:1,
title:"计算机",
parentId:0,
children:[
{
id:2,
title:"前端",
parentId:1,
children:[
{
id:3,
title:"Vue",
parentId:2
},
{
id:4,
title:"Html",
parentId:2
},
]
},
{
id:5,
title:"后端",
parentId:1,
children:[
{
id:6,
title:"java",
parentId:5,
children:[
{
id:100,
title:"基础",
parentId:6,
}
]
},
{
id:7,
title:"spring boot",
parentId:5
},
]
},
]
},
{
id:8,
title:"艺术",
parentId:0,
children:[
{
id:9,
title:"绘画",
parentId:8,
children:[
{
id:10,
title:"素描",
parentId:9
},
{
id:11,
title:"色彩",
parentId:9
},
]
},
]
},
],



<template>
<div class="TreeSubject">
<Section class="c-s-dl">
<dl class = "nodeDl">
<dt><span>课程类别</span></dt>
<dd>
<ul>
<li>
<a href="javascript:;">全部</a>
</li>
<li v-for="item in subjectTree" :key="item.id">
<a href="javascript:;" @click="getChildren(item,0)">{{item.title}}</a>
</li>
</ul>
</dd>
</dl>
</Section>
</div>
</template>
<script>
export default{
name:"TreeSubject",
props:{
subjectTree:{
type:Array,
required:true
}
},
data(){
return{
}
},
mounted() {
},
methods:{
getChildren(item,index){
if(!item.children){
return;
}
const _this=this;
let c_s_dl = document.querySelector(".c-s-dl");
let c_s_dl_childNodes = c_s_dl.childNodes;
if(index == 0){
for(let i = c_s_dl_childNodes.length-1;i >= 1;i--){
c_s_dl.removeChild(c_s_dl_childNodes[i])
}
}
if(c_s_dl_childNodes.length>index+1){
for(let i = c_s_dl_childNodes.length-1;i >= index+1;i--){
c_s_dl.removeChild(c_s_dl_childNodes[i])
}
}
let dl = document.createElement("dl");
let dd = document.createElement("dd");
let ul = document.createElement("ul");
const cloneData = JSON.parse(JSON.stringify(item.children));
for(let i = 0;i < cloneData.length;i++){
let li =document.createElement("li");
let a = document.createElement("a");
a.onclick=function(){
_this.getChildren(cloneData[i],index+1);
}
a.innerHTML=cloneData[i].title+"";
li.appendChild(a)
ul.appendChild(li);
}
dl.appendChild(dd);
dd.appendChild(ul);
c_s_dl.appendChild(dl)
}
},
}
</script>
<style lang="less">
@import '@/assets/less/clearfix';
.TreeSubject{
.c-s-dl{
dl{
background-color: #F7F7F7;
height: 50px;
position: relative;
dt{
height: 50px;
line-height: 50px;
float: left;
font-size: 15px;
color: #777777;
margin-left: 15px;
}
dd{
display: inline-block;
height: 50px;
margin-left: 0px;
position: absolute;
left: 100px;
ul{
&:extend(.clearfix all);
height: 50px;
li{
height: 50px;
line-height: 50px;
float: left;
margin-right: 35px;
a{
color: #23272B;
font-size: 15px;
}
}
}
}
}
}
}
</style>
没有说到的都是一些基础内容,比如如何添加DOM节点,less样式这些 |
---|