Vue iview-admin框架二級(jí)菜單改為三級(jí)菜單的方法
最近在用 iview-admin的Vue后臺(tái)模板,從git上下載后發(fā)現(xiàn)左側(cè)導(dǎo)航欄最多支持到二級(jí)菜單,也發(fā)現(xiàn)很多童鞋在問(wèn)如何實(shí)現(xiàn)三級(jí)菜單。在實(shí)際的應(yīng)用場(chǎng)景中還是會(huì)出現(xiàn)三級(jí)菜單的需求的,木有其他好辦法,只能自己手動(dòng)改代碼了。
1. 第一步:首先改寫(xiě)VUE中的模板,修改sidebarMenu.vue文件,文件具體目錄建下圖:
將Menu導(dǎo)航菜單組件的的二級(jí)嵌套結(jié)構(gòu)改為三級(jí)嵌套,無(wú)非就是判斷二級(jí)路由頁(yè)面下是否有children屬性及是否含有子元素,有的話(huà)直接v-for循環(huán)生成子元素標(biāo)簽,新結(jié)構(gòu)如下:
<template> <Menu ref="sideMenu" :active-name="$route.name" :open-names="openNames" :theme="menuTheme" width="auto" @on-select="changeMenu"> <template v-for="item in menuList"> <MenuItem v-if="item.children.length<=1" :name="item.children[0].name" :key="'menuitem' + item.name"> <Icon :type="item.children[0].icon || item.icon" :size="iconSize" :key="'menuicon' + item.name"></Icon> <span class="layout-text" :key="'title' + item.name">{{ itemTitle(item.children[0]) }}</span> </MenuItem> <Submenu v-if="item.children.length > 1" :name="item.name" :key="item.name"> <template slot="title"> <Icon :type="item.icon" :size="iconSize"></Icon> <span class="layout-text">{{ itemTitle(item) }}</span> </template> <template v-for="child in item.children"> <!-- 添加條件判斷是否還有三級(jí)菜單 v-if="child.children.length<=1" --> <MenuItem v-if="isThirdLeveMenu(child)==false" :name="child.name" :key="'menuitem' + child.name"> <Icon :type="child.icon" :size="iconSize" :key="'icon' + child.name"></Icon> <span class="layout-text" :key="'title' + child.name">{{ itemTitle(child) }}</span> </MenuItem> <!-- 以下為新增 添加條件判斷如果有三級(jí)菜單 則增加三級(jí)菜單 --> <Submenu v-if="isThirdLeveMenu(child)==true" :name="child.name" :key="'menuitem' + child.name"> <template slot="title"> <Icon :type="child.icon" :size="iconSize" :key="'icon' + child.name"></Icon> <span class="layout-text" :key="'title' + child.name">{{ itemTitle(child) }}</span> </template> <template v-for="son in child.children"> <MenuItem :name="son.name" :key="'menuitem' + son.name"> <Icon :type="son.icon" :size="iconSize" :key="'icon' + son.name"></Icon> <span class="layout-text" :key="'title' + son.name">{{ itemTitle(son) }}</span> </MenuItem> </template> </Submenu> <!-- 以上為新增 --> </template> </Submenu> </template> </Menu> </template>
組件中methods下添加一個(gè)方法isThirdLeveMenu,判斷是否含有children屬性:
methods: { changeMenu(active) { this.$emit("on-change", active); }, itemTitle(item) { if (typeof item.title === "object") { return this.$t(item.title.i18n); } else { return item.title; } }, isThirdLeveMenu(child){ if(child.children){ if(child.children.length>0)return true; else return false; } else { return false; } } },
第二步:修改創(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 = []; //去首頁(yè) if (name === 'home_index') { currentPathArr = [ { title: util.handleTitle(vm, util.getRouterObjByName(vm.$store.state.app.routers, 'home_index')), path: '', name: 'home_index' } ]; } //去導(dǎo)航菜單一級(jí)頁(yè)面或者OtherRouter路由中的頁(yè)面 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)航菜單二級(jí)頁(yè)面或三級(jí)頁(yè)面 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) { //如果是三級(jí)頁(yè)面按鈕,則在二級(jí)按鈕數(shù)組中找不到這個(gè)按鈕名稱(chēng) //需要二級(jí)頁(yè)面下可能出現(xiàn)三級(jí)子菜單的情況邏輯加入 if (childArr[i].name === name) { hasMenu = true; return hasMenu; } i++; } //如果一級(jí),二級(jí)菜單下都沒(méi)有此按鈕名稱(chēng),則遍歷三級(jí)菜單 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: '首頁(yè)', path: '', name: 'home_index' } ]; } else if (currentPathObj.children.length <= 1 && currentPathObj.name !== 'home') { currentPathArr = [ { title: '首頁(yè)', path: '/home', name: 'home_index' }, { title: currentPathObj.title, path: '', name: name } ]; } else { //如果是三級(jí)頁(yè)面按鈕,則在二級(jí)按鈕數(shù)組中找不到這個(gè)按鈕名稱(chēng) //需要二級(jí)頁(yè)面下可能出現(xiàn)三級(jí)子菜單的情況邏輯加入 let childObj = currentPathObj.children.filter((child) => { return child.name === name; })[0]; // let thirdLevelObj = console.log(childObj) //二級(jí)頁(yè)面 if (childObj) { currentPathArr = [ { title: '首頁(yè)', path: '/home', name: 'home_index' }, { title: currentPathObj.title, path: '', name: currentPathObj.name }, { title: childObj.title, path: currentPathObj.path + '/' + childObj.path, name: name } ]; } //childobj為undefined,再?gòu)娜?jí)頁(yè)面中遍歷 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: '首頁(yè)', path: '/home', name: 'home_index' }, { title: currentPathObj.title, path: '', name: currentPathObj.name }, { title: childObj.title, path: '', //設(shè)為空是因?yàn)榇硕?jí)菜單沒(méi)有實(shí)際頁(yè)面且用于面包屑組件顯示,path為空的將不可單擊 name: childObj.name }, { title: thirdObj.title, path: currentPathObj.path + '/' + childObj.path + '/' + thirdObj.path, name: thirdObj.name } ]; } } } } vm.$store.commit('setCurrentPath', currentPathArr); return currentPathArr; };
第三步:建立三級(jí)頁(yè)面test-child.vue,testcaca.vue和三級(jí)路由的容器組件artical-publish-center.vue
artical-publish-center.vue結(jié)構(gòu)如下圖: 要有<rout-view>標(biāo)簽
其他兩個(gè)三級(jí)頁(yè)面vue隨便寫(xiě)了:
第四步:到這里,容器可以實(shí)現(xiàn)期待已久三級(jí)菜單了,^_^. 在router里添加三級(jí)頁(yè)面路由,router文件夾下router.js中:
加到appRouter中吧,可以放到title: '組件'的children數(shù)組中:
{ path: 'artical-publish', title: '用戶(hù)配置', name: 'artical-publish', icon: 'compose', component: () => import('@/views/test/artical-publish-center.vue'), //引用三級(jí)頁(yè)面的中間容器層 children:[ { path: 'testcaca', icon: 'ios-pause', name: 'testcaca', title: 'test4', component: () => import('@/views/test/testcaca.vue') }, { path: 'test-child', icon: 'ios-pause', name: 'test-child', title: 'test-child', component: () => import('@/views/test/test-child.vue') } ] }
最后保存,運(yùn)行你的項(xiàng)目,看下三級(jí)菜單出來(lái)了吧:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- vue遞歸實(shí)現(xiàn)三級(jí)菜單
- vue+element使用動(dòng)態(tài)加載路由方式實(shí)現(xiàn)三級(jí)菜單頁(yè)面顯示的操作
- vue.js實(shí)現(xiàn)三級(jí)菜單效果
- vue實(shí)現(xiàn)后臺(tái)管理權(quán)限系統(tǒng)及頂欄三級(jí)菜單顯示功能
- vue+iview的菜單與頁(yè)簽的聯(lián)動(dòng)方式
- Vue實(shí)現(xiàn)左右菜單聯(lián)動(dòng)實(shí)現(xiàn)代碼
- vue基于mint-ui實(shí)現(xiàn)城市選擇三級(jí)聯(lián)動(dòng)
- 詳解Vue、element-ui、axios實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)
- vue + elementUI實(shí)現(xiàn)省市縣三級(jí)聯(lián)動(dòng)的方法示例
- vue實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)動(dòng)態(tài)菜單
相關(guān)文章
vue中添加語(yǔ)音播報(bào)功能的實(shí)現(xiàn)
本文主要介紹了vue中添加語(yǔ)音播報(bào)功能的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Vue 中 template 有且只能一個(gè) root的原因解析(源碼分析)
這篇文章主要介紹了Vue 中 template 有且只能一個(gè) root的原因解析,本文從源碼角度分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04vue-cli創(chuàng)建vue項(xiàng)目的詳細(xì)步驟記錄
vue.cli是vue中的項(xiàng)目構(gòu)造工具,是一個(gè)npm包,需要安裝node.js和 git才能用,下面這篇文章主要給大家介紹了關(guān)于利用vue-cli創(chuàng)建vue項(xiàng)目的詳細(xì)步驟,需要的朋友可以參考下2022-06-06如何使用Nginx將前端Vue項(xiàng)目部署到云服務(wù)器
記錄使用Nginx將純前端的Vue3項(xiàng)目部署到阿里云服務(wù)器(Ubuntu?22.04)上,包含通過(guò)Nginx代理實(shí)現(xiàn)跨域請(qǐng)求、以及個(gè)人踩坑記錄,感興趣的朋友一起看看吧2024-04-04從Element日期組件源碼中學(xué)到的兩個(gè)工具方法技巧
這篇文章主要介紹了從Element日期組件源碼中學(xué)到的兩個(gè)工具方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08vue-video-player 解決微信自動(dòng)全屏播放問(wèn)題(橫豎屏導(dǎo)致樣式錯(cuò)亂問(wèn)題)
這篇文章主要介紹了vue-video-player 解決微信自動(dòng)全屏播放問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Vue使用mixins實(shí)現(xiàn)壓縮圖片代碼
本篇文章主要介紹了Vue使用mixins實(shí)現(xiàn)壓縮圖片代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03