最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue iview-admin框架二級(jí)菜單改為三級(jí)菜單的方法

 更新時(shí)間:2018年07月03日 14:12:37   作者:飛翔的獵鷹  
這篇文章主要介紹了Vue iview-admin框架二級(jí)菜單改為三級(jí)菜單的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

最近在用 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屬性及是否含有子元素,有的話直接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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue?eslint報(bào)錯(cuò)error?"Component?name?"*****"?should?always?be?multi-word"解決

    vue?eslint報(bào)錯(cuò)error?"Component?name?"*****"

    這篇文章主要給大家介紹了關(guān)于vue?eslint報(bào)錯(cuò)error?“Component?name?“*****“?should?always?be?multi-word”的解決方法,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • vue3中proxy的基本用法說(shuō)明

    vue3中proxy的基本用法說(shuō)明

    這篇文章主要介紹了vue3中proxy的基本用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 關(guān)于vant的日歷組件,在iPhonex上可選日期空白

    關(guān)于vant的日歷組件,在iPhonex上可選日期空白

    這篇文章主要介紹了關(guān)于vant的日歷組件,在iPhonex上可選日期空白,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 如何使用vue-pdf-embed實(shí)現(xiàn)PDF在線預(yù)覽

    如何使用vue-pdf-embed實(shí)現(xiàn)PDF在線預(yù)覽

    vue-pdf-embed是一個(gè)基于Vue.js的插件,專(zhuān)門(mén)用于在Vue應(yīng)用中嵌入和展示PDF文件,本文將使用vue-pdf-embed實(shí)現(xiàn)PDF在線預(yù)覽功能,有需要的小伙伴可以參考一下
    2025-03-03
  • Vue3數(shù)字滾動(dòng)插件vue-countup-v3的使用

    Vue3數(shù)字滾動(dòng)插件vue-countup-v3的使用

    vue-countup-v3 插件是一個(gè)基于 Vue3 的數(shù)字動(dòng)畫(huà)插件,用于在網(wǎng)站或應(yīng)用程序中創(chuàng)建帶有數(shù)字動(dòng)畫(huà)效果的計(jì)數(shù)器,本文主要介紹了Vue3數(shù)字滾動(dòng)插件vue-countup-v3的使用,感興趣的可以了解一下
    2023-10-10
  • Vue系列之Element?UI表單自定義校驗(yàn)規(guī)則

    Vue系列之Element?UI表單自定義校驗(yàn)規(guī)則

    表單校驗(yàn)是注冊(cè)環(huán)節(jié)中必不可少的操作,表單校驗(yàn)可以提醒用戶(hù)填寫(xiě)數(shù)據(jù)規(guī)則以確保用戶(hù)提交數(shù)據(jù)的效性,也可以防止用戶(hù)因誤操作而占用服務(wù)器資源,這篇文章主要給大家介紹了關(guān)于Vue系列之Element?UI表單自定義校驗(yàn)規(guī)則的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Vuex結(jié)合storage實(shí)現(xiàn)用戶(hù)信息本地存儲(chǔ)方式

    Vuex結(jié)合storage實(shí)現(xiàn)用戶(hù)信息本地存儲(chǔ)方式

    這篇文章主要介紹了Vuex結(jié)合storage實(shí)現(xiàn)用戶(hù)信息本地存儲(chǔ)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Element-UI+Vue模式使用總結(jié)

    Element-UI+Vue模式使用總結(jié)

    這篇文章主要介紹了Element-UI+Vue模式使用總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • vue實(shí)現(xiàn)調(diào)取手機(jī)攝像頭和相冊(cè)功能

    vue實(shí)現(xiàn)調(diào)取手機(jī)攝像頭和相冊(cè)功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)調(diào)取手機(jī)攝像頭和相冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Vue3中el-table表格數(shù)據(jù)不顯示的原因和解決方法

    Vue3中el-table表格數(shù)據(jù)不顯示的原因和解決方法

    這篇文章主要給大家介紹了Vue3中el-table表格數(shù)據(jù)不顯示的原因和解決方法,文中有詳細(xì)的代碼示例供大家參考,如果有遇到相同問(wèn)題的朋友可以參考閱讀本文,希望能夠幫到您
    2023-11-11

最新評(píng)論

南涧| 翼城县| 电白县| 台前县| 胶州市| 丰台区| 渭源县| 肥西县| 博兴县| 宁强县| 香港 | 平武县| 临邑县| 白沙| 杨浦区| 汶上县| 宣威市| 石河子市| 安新县| 武冈市| 巨野县| 汕头市| 乌兰浩特市| 绥德县| 沁水县| 安阳市| 金寨县| 苗栗市| 内乡县| 宜宾县| 苏尼特左旗| 萝北县| 云龙县| 屯昌县| 雅江县| 乌鲁木齐县| 孙吴县| 贵州省| 勐海县| 乌鲁木齐市| 商都县|