成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Vue iview-admin框架二級菜單改為三級菜單

codeKK / 2992人閱讀

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

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

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

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

組件中methods下添加一個方法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 = [];
    //去首頁
    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 {
                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)如下圖: 要有標(biāo)簽

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

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

{
                path: "artical-publish",
                title: "用戶配置",
                name: "artical-publish",
                icon: "compose",
                component: () => import("@/views/test/artical-publish-center.vue"), //引用三級頁面的中間容器層
                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")
                    }
                ]
            }  

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95892.html

相關(guān)文章

  • iview-admin 三級菜單路由嵌套

    摘要:使用,框架是二級菜單,因業(yè)務(wù)需要改成三級菜單。系統(tǒng)配置用戶配置管理員部門信息工單配置出現(xiàn)了,請寫,問題重現(xiàn)了問題也就解決啦。 使用iview-admin,框架是二級菜單,因業(yè)務(wù)需要改成三級菜單。其他部分都已經(jīng)改好,但是頁面仍然沒有出來,頁面也沒有了報錯,比較詭異。后來發(fā)現(xiàn)問題可能在路由配置,看到了別人寫的這個demo,鏈接:https://jsfiddle.net/767nb8u1/1...

    劉明 評論0 收藏0
  • Element做管理系統(tǒng)時 2、3級路由切換時,界面數(shù)據(jù)不緩存問題

    摘要:解決方案方法一適用范圍,菜單列表是通過接口返回的。菜單列表不是接口返回的,接口只返回訪問菜單的權(quán)限,大體意思就是統(tǒng)一把路由寫成三級形式。我比較贊成菜單權(quán)限列表一律放在后臺做這樣做風(fēng)險遠(yuǎn)比在前端處理的要小。 解決方案 方法一: 適用范圍,菜單列表是通過接口返回的。PS:只要通過接口返回的菜單列表就意味著用戶是可以訪問的,權(quán)限處理一律放在后臺做,但寫本地路由時不論是二級界面還是三級界面,配...

    wuyangchun 評論0 收藏0
  • 關(guān)于前后端分離權(quán)限控制,元素細(xì)粒度(iview-admin實現(xiàn))

    摘要:按鈕方面按鈕通過自定義指令綁定其特定的操作接口信息如產(chǎn)品上傳按鈕,需要擁有產(chǎn)品上傳的信息,才可以繼續(xù)執(zhí)行按鈕的業(yè)務(wù)邏輯。 開篇啰嗦幾句 在傳統(tǒng)單體項目中,通常會有一些框架用來管理熟知的權(quán)限。如耳濡目染的 Shiro 或者 Spring Security 。然而,到了現(xiàn)在這個時代,新開始的項目會更多的才用后端微服務(wù) + 前端 mvvm 的架構(gòu)開始書寫項目。權(quán)限控制方面將變得有些許晦澀。當(dāng)...

    YorkChen 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<