Vue iview-admin模板二級菜單改為三級菜單

最近在用 iview-admin的Vue后臺模板,從git上下載后發(fā)現(xiàn)左側(cè)導(dǎo)航欄最多支持到二級菜單,也發(fā)現(xiàn)很多童鞋在問如何實現(xiàn)三級菜單。在實際的應(yīng)用場景中還是會出現(xiàn)三級菜單的需求的,木有其他好辦法,只能自己手動改代碼了。

第一步:首先改寫VUE中的模板,修改sidebarMenu.vue文件,文件具體目錄建下圖:

image

將Menu導(dǎo)航菜單組件的的二級嵌套結(jié)構(gòu)改為三級嵌套,無非就是判斷二級路由頁面下是否有children屬性及是否含有子元素,有的話直接v-for循環(huán)生成子元素標(biāo)簽,新結(jié)構(gòu)如下:


image.png

組件中methods下添加一個方法:


image.png

第二步:修改創(chuàng)建當(dāng)前path路徑的邏輯方法:setCurrentPath ,在libs文件夾下util.js文件中:
'''
util.setCurrentPath = function (vm, name) {
let title = '';
let isOtherRouter = false;
vm.$store.state.app.routers.forEach(item => {
if (item.children.length === 1) {
if (item.children[0].name === name) {
title = util.handleTitle(vm, item);
if (item.name === 'otherRouter') {
isOtherRouter = true;
}
}
} else {
item.children.forEach(child => {
if (child.name === name) {
title = util.handleTitle(vm, child);
if (item.name === 'otherRouter') {
isOtherRouter = true;
}
}
});
}
});
let currentPathArr = [];
//去首頁
if (name === 'home_index') {
currentPathArr = [
{
title: util.handleTitle(vm, util.getRouterObjByName(vm.$store.state.app.routers, 'home_index')),
path: '',
name: 'home_index'
}
];
}
//去導(dǎo)航菜單一級頁面或者OtherRouter路由中的頁面
else if ((name.indexOf('_index') >= 0 || isOtherRouter) && name !== 'home_index') {
currentPathArr = [
{
title:util.handleTitle(vm,util.getRouterObjByName(vm.$store.state.app.routers,'home_index')),
path: '/home',
name: 'home_index'
},
{
title: title,
path: '',
name: name
}
];
}
//去導(dǎo)航菜單二級頁面或三級頁面
else {
let currentPathObj = vm.$store.state.app.routers.filter(item => {

        var hasMenu;

        if (item.children.length <= 1) {
            hasMenu = item.children[0].name === name;
            return hasMenu;
        } else {
            let i = 0;
            let childArr = item.children;
            let len = childArr.length;
            while (i < len) {
                //如果是三級頁面按鈕,則在二級按鈕數(shù)組中找不到這個按鈕名稱
                //需要二級頁面下可能出現(xiàn)三級子菜單的情況邏輯加入
                if (childArr[i].name === name) {
                    hasMenu = true;
                    return hasMenu;
                }
                i++;
            }
            //如果一級,二級菜單下都沒有此按鈕名稱,則遍歷三級菜單
            if(!hasMenu){
                for(let m=0;m<childArr.length;m++){
                    if(!childArr[m].children) continue;
                    let sonArr = childArr[m].children;
                    for(let n=0;n<sonArr.length;n++){
                        if(sonArr[n].name === name){
                            hasMenu = true;
                            return hasMenu;
                        }
                    }
                }
            }

            return false;
        }
    })[0];
   
    if (currentPathObj.children.length <= 1 && currentPathObj.name === 'home') {
        currentPathArr = [
            {
                title: '首頁',
                path: '',
                name: 'home_index'
            }
        ];
    } else if (currentPathObj.children.length <= 1 && currentPathObj.name !== 'home') {
        currentPathArr = [
            {
                title: '首頁',
                path: '/home',
                name: 'home_index'
            },
            {
                title: currentPathObj.title,
                path: '',
                name: name
            }
        ];
    } else {
         //如果是三級頁面按鈕,則在二級按鈕數(shù)組中找不到這個按鈕名稱
         //需要二級頁面下可能出現(xiàn)三級子菜單的情況邏輯加入
        let childObj = currentPathObj.children.filter((child) => {
            return  child.name === name;
        })[0];

       // let thirdLevelObj =
       console.log(childObj)
       //二級頁面
        if (childObj) {
            currentPathArr = [
                {
                    title: '首頁',
                    path: '/home',
                    name: 'home_index'
                },
                {
                    title: currentPathObj.title,
                    path: '',
                    name: currentPathObj.name
                },
                {
                    title: childObj.title,
                    path: currentPathObj.path + '/' + childObj.path,
                    name: name
                }
            ];
        }
        //childobj為undefined,再從三級頁面中遍歷
        else {
            let thirdObj;
            let childObj = currentPathObj.children.filter((child) => {
                let hasChildren;
                hasChildren = child.name === name;
                if (hasChildren) return hasChildren

                if (child.children) {
                    let sonArr = child.children;
                    for (let n = 0; n < sonArr.length; n++) {
                        if (sonArr[n].name === name) {
                            thirdObj = sonArr[n];
                            hasChildren = true;
                            return hasChildren;
                        }
                    }
                }
                return hasChildren
            })[0];

            if(thirdObj && childObj){
                currentPathArr = [
                    {
                        title: '首頁',
                        path: '/home',
                        name: 'home_index'
                    },
                    {
                        title: currentPathObj.title,
                        path: '',
                        name: currentPathObj.name
                    },
                    {
                        title: childObj.title,
                        path: '',               //設(shè)為空是因為此二級菜單沒有實際頁面且用于面包屑組件顯示,path為空的將不可單擊
                        name: childObj.name
                    },
                    {
                        title: thirdObj.title,
                        path: currentPathObj.path + '/' + childObj.path + '/' + thirdObj.path,
                        name: thirdObj.name
                    }
                ];
            }
            
        }
    }
}
vm.$store.commit('setCurrentPath', currentPathArr);
return currentPathArr;

};
'''
誰能告訴我簡書的代碼塊怎么這么難用啊,有的代碼格式顯示不正常。。。。。。。。

第三步:建立三級頁面test-child.vue,testcaca.vue和三級路由的容器組件artical-publish-center.vue
artical-publish-center.vue結(jié)構(gòu)如下圖: 要有<rout-view>標(biāo)簽


image.png

其他兩個三級頁面vue隨便寫了:


image.png

第四步:到這里,容器可以實現(xiàn)期待已久三級菜單了,_. 在router里添加三級頁面路由,router文件夾下router.js中:
加到appRouter中吧,可以放到title: '組件'的children數(shù)組中:

image.png

然后保存,運行你的項目,看下三級菜單出來了吧:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光劍書架上的書閱讀 4,183評論 2 8
  • 相關(guān)概念 混合開發(fā)和前后端分離 混合開發(fā)(服務(wù)器端渲染) 前后端分離后端提供接口,前端開發(fā)界面效果(專注于用戶的交...
    他愛在黑暗中漫游閱讀 3,018評論 4 45
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,174評論 0 29
  • 第二節(jié) 找房子 落地的那天冬冬和下大雨來接的我。冬冬和下大雨是夫婦,他們倆都是我在上海讀書時的研究生同學(xué),冬冬是北...
    siwen閱讀 211評論 0 1
  • 當(dāng)愛情傾斜時 文:喵苗 丨 壹心理專欄作者 我們尋找對象時,總是希望對方可以是個和自己互補的人,他沒有我們自身上所...
    胡子長閱讀 374評論 0 3

友情鏈接更多精彩內(nèi)容