vue.js與element-ui實現菜單樹形結構的解決方法
由于業(yè)務需要,要求實現樹形菜單,且菜單數據由后臺返回,在網上找了幾篇文章,看下來總算有了解決辦法。
場景:根據業(yè)務要求,需要實現活動的樹形菜單,菜單數據由后臺返回,最后的效果圖如下:

后臺返回的數據格式是這個樣子的:
data=[{
pID:'1',//父ID
name:'目錄一',
menuID:'m1',//本身ID
isContent:false//判斷是否是目錄
},
{
pID:'1',
name:'目錄二',
menuID:'m2',
isContent:false
},
{
pID:'m1',
name:'目錄一--菜單一',
menuID:'m11',
isContent:true
},
{
pID:'m1',
name:'目錄一--目錄一',
menuID:'m12',
isContent:false
},
{
pID:'m12',
name:'目錄一--目錄一--菜單一',
menuID:'m121',
isContent:true
},
{
pID:'m2',
name:'目錄二--菜單一',
menuID:'m21',
isContent:true
},
{
pID:'m2',
name:'目錄二--菜單二',
menuID:'m22',
isContent:true
},
]
這是一串具有父子關系的數據,首先就是要把這一大串數據轉化成樹形結構:
tree(){
let data=[{
pID:'1',//父ID
name:'目錄一',
menuID:'m1',//本身ID
isContent:false//判斷是否是目錄
},
{
pID:'1',
name:'目錄二',
menuID:'m2',
isContent:false
},
{
pID:'m1',
name:'目錄一--菜單一',
menuID:'m11',
isContent:true
},
{
pID:'m1',
name:'目錄一--目錄一',
menuID:'m12',
isContent:false
},
{
pID:'m12',
name:'目錄一--目錄一--菜單一',
menuID:'m121',
isContent:true
},
{
pID:'m2',
name:'目錄二--菜單一',
menuID:'m21',
isContent:true
},
{
pID:'m2',
name:'目錄二--菜單二',
menuID:'m22',
isContent:true
},
]
let tree = []
for(let i=0;i<data.length;i++){
if(data[i].pID == '1'){
let obj = data[i]
obj.list = []
tree.push(obj)
data.splice(i,1)
i--
}
}
menuList(tree)
console.log(tree)
function menuList(arr){
if(data.length !=0){
for(let i=0; i<arr.length;i++){
for(let j=0;j<data.length;j++){
if(data[j].pID == arr[i].menuID){
let obj = data[j]
obj.list = []
arr[i].list.push(obj)
data.splice(j,1)
j--
}
}
menuList(arr[i].list)
}
}
}
}
運行完后返回的結構就是這個樣子:
[{"pID":"1","name":"目錄一","menuID":"m1","isContent":false,"list":[{"pID":"m1","name":"目錄一--菜單一","menuID":"m11","isContent":true,"list":[]},{"pID":"m1","name":"目錄一--目錄一","menuID":"m12","isContent":false,"list":[{"pID":"m12","name":"目錄一--目錄一--菜單一","menuID":"m121","isContent":true,"list":[]}]}]},{"pID":"1","name":"目錄二","menuID":"m2","isContent":false,"list":[{"pID":"m2","name":"目錄二--菜單一","menuID":"m21","isContent":true,"list":[]},{"pID":"m2","name":"目錄二--菜單二","menuID":"m22","isContent":true,"list":[]}]}]
接下來就要展示了,項目中用的element-ui的導航菜單組件,為了實現這樣的樹形結構,將每一級的菜單單獨作為一個組件,通過判斷isContent的值來遞歸。我直接把代碼貼出來
<el-menu
theme="dark"
:default-active="openMenuID"
:default-openeds="openMenuArr"
class="el-menu"
@select="handleSelect">
<template v-for="(item,index) in menuList">
<el-submenu :index=item.menuID v-if="item.IsContent">
<template slot="title">
<i class="el-icon-menu"></i>
{{item.name}}
</template>
<tree-menu :data="item.list"></tree-menu>
</el-submenu>
<el-menu-item :index=item.menuID v-else>{{item.name}}</el-menu-item>
</template>
</el-menu>
tree-menu組件的代碼:
<template v-for="(menu,index) in data">
<el-submenu :index=menu.menuID v-if="menu.IsContent">
<template slot="title">
<i class="el-icon-plus"></i>
{{menu.name}}</template>
<tree-menu :data="menu.list"></tree-menu>
</el-submenu>
<el-menu-item v-else :index=menu.menuID>
{{menu.name}}
</el-menu-item>
</template>
總結
以上所述是小編給大家介紹的vue.js與element-ui實現菜單樹形結構的解決方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!
相關文章
VUE中setTimeout和setInterval自動銷毀案例
這篇文章主要介紹了VUE中setTimeout和setInterval自動銷毀案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
el-select自定義指令實現觸底加載分頁請求options數據(完整代碼和接口可直接用)
某些情況下,下拉框需要做觸底加載,發(fā)請求,獲取option的數據,下面給大家分享el-select自定義指令實現觸底加載分頁請求options數據(附上完整代碼和接口可直接用),感興趣的朋友參考下吧2024-02-02
vue中axios的get請求和post請求的傳參方式、攔截器示例代碼
Post是向服務器提交數據的一種請求,get是向服務器發(fā)索取數據的一種請求,post在真正接受數據之前會先將請求頭發(fā)送給服務器進行確認,然后才真正發(fā)送數據,本文給大家介紹vue中axios的get請求和post請求的傳參方式、攔截器示例代碼,感興趣的朋友一起看看吧2023-10-10
vue+element下日期組件momentjs轉換賦值問題解決
這篇文章主要介紹了vue+element下日期組件momentjs轉換賦值問題,記錄下使用momentjs轉換日期字符串賦值給element的日期組件報錯問題,需要的朋友可以參考下2024-02-02

