Vue iview-admin模板二级菜单改为三级菜单

最近在用 iview-admin的Vue后台模板,从git上下载后发现左侧导航栏最多支持到二级菜单,也发现很多童鞋在问如何实现三级菜单。在实际的应用场景中还是会出现三级菜单的需求的,木有其他好办法,只能自己手动改代码了。

第一步:首先改写VUE中的模板,修改sidebarMenu.vue文件,文件具体目录建下图:

image

将Menu导航菜单组件的的二级嵌套结构改为三级嵌套,无非就是判断二级路由页面下是否有children属性及是否含有子元素,有的话直接v-for循环生成子元素标签,新结构如下:


image.png

组件中methods下添加一个方法:


image.png

第二步:修改创建当前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'
}
];
}
//去导航菜单一级页面或者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
}
];
}
//去导航菜单二级页面或三级页面
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) {
                //如果是三级页面按钮,则在二级按钮数组中找不到这个按钮名称
                //需要二级页面下可能出现三级子菜单的情况逻辑加入
                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 {
         //如果是三级页面按钮,则在二级按钮数组中找不到这个按钮名称
         //需要二级页面下可能出现三级子菜单的情况逻辑加入
        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: '',               //设为空是因为此二级菜单没有实际页面且用于面包屑组件显示,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结构如下图: 要有<rout-view>标签


image.png

其他两个三级页面vue随便写了:


image.png

第四步:到这里,容器可以实现期待已久三级菜单了,_. 在router里添加三级页面路由,router文件夹下router.js中:
加到appRouter中吧,可以放到title: '组件'的children数组中:

image.png

然后保存,运行你的项目,看下三级菜单出来了吧:


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    禅与计算机程序设计艺术阅读 3,760评论 2 8
  • 相关概念 混合开发和前后端分离 混合开发(服务器端渲染) 前后端分离后端提供接口,前端开发界面效果(专注于用户的交...
    他爱在黑暗中漫游阅读 2,724评论 4 45
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 4,989评论 0 29
  • 第二节 找房子 落地的那天冬冬和下大雨来接的我。冬冬和下大雨是夫妇,他们俩都是我在上海读书时的研究生同学,冬冬是北...
    siwen阅读 190评论 0 1
  • 当爱情倾斜时 文:喵苗 丨 壹心理专栏作者 我们寻找对象时,总是希望对方可以是个和自己互补的人,他没有我们自身上所...
    胡子长阅读 292评论 0 3