VUE+elementUI递归实现动态路由多级菜单

01:在路由文件设置路由信息(index.js文件)

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export default new Router({
  // mode:history,
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      hidden: true,
      component: () => import('@/components/HelloWorld')//路由懒加载
    },
    {
      path: '/Login',
      name: 'Login',
      hidden: true,
      component: () => import('@/components/Login')
    },
    {
      path: '*',
      name: '404',
      hidden: true,
      component: () => import('@/components/404')
    },
    {
      path: '/home',
      name: '学生管理',
      menuType:'1',
      iconClass: 'fa fa-address-book-o',
      // redirect: '/home/student',
      component: () => import('@/components/home'),
      children: [
        {
          path: '/home/student',
          name: '学生列表',
          menuType:'2',
          component: () => import('@/components/student/StudentInfo')
        },
        {
          path: '/home/ceshi',
          name: '测试',
          menuType:'1',
          component: () => import('@/components/student/StudentInfo'),
          children: [
            {
                path: '/home/ceshicaidan',
                name: '测试下的菜单',
                menuType:'2',
                component: () => import('@/components/student/StudentInfo')
            }
          ]
        },
      ]
    },
    {
      path: '/dataAnalysis',
      name: '数据分析',
      menuType:'2',
      iconClass: 'fa fa-bar-chart'
      // component: ()=>import('@/components/dataAnalysis')
    },
    {
      path: '/users',
      name: '用户中心',
      menuType:'1',
      iconClass: 'fa fa-user-circle-o',
      component: () => import('@/components/home'),
      children: [
        {
          path: '/users/user',
          name: '用户列表',
          menuType:'2',
          component: () => import('@/components/user/user')
        },
      ]
    },
  ]
})

02:左侧菜单父组件(Menu.vue)

<template>
    <div class="menu">
        <el-aside class="aside" width="240px">
            <el-menu default-active="2" class="el-menu-vertical-demo" background-color="#545c64" text-color="#fff"
                active-text-color="#ffd04b">
                <MenuRouter v-for="item in menus" :key="item.path" :item="item" v-if="!item.hidden"/>                    
            </el-menu>
        </el-aside>
</div>
</template>
<script>
import MenuRouter from '../common/MenuRouter.vue'
export default {
    components: { MenuRouter },
    data() {
        return {
            menus:[]
        }
    },
    created(){
        this.menus = [...this.$router.options.routes]  //得到路由信息,就是index.js文件里面的路由信息可以打看查看
        console.log(this.menus);
    }
}
</script>
<style scoped>
.menu {
    height: 100%;
    /* width:240px; */
    overflow: hidden;
}

.aside {
    height: 100%;
    overflow: hidden;
}

.el-menu-vertical-demo {
    height: 100%;
}

/* 设置左边导航栏和顶部菜单不对齐的方法 */
.el-menu {
    border-right-width: 0;
}

span {
    margin-left: 4px;
}
</style>

03: 左侧菜单子组件(MenuRouter.vue)

<template>
    <div>
        <el-submenu :key="item.path" :index="item.path" v-if="item.children">
            <template slot="title">
                <i :class="item.iconClass"></i>
                <span>{{ item.name }}</span>
            </template>
            <MenuRouter v-for="child in item.children" :key="child.path" :item="child">
            </MenuRouter>
        </el-submenu>

        <el-menu-item :index="item.path" v-else> 
            <i :class="item.iconClass"></i>
            <span slot="title">{{ item.name }}</span>
        </el-menu-item>
</div>
</template>

<script>

export default {
    name: 'MenuRouter',
    props:{
        item:{
            type:Object,
            default:()=>{}
        }
    },
    data() {
        return {
        }
    },
}

</script>

04: 效果展示(仅为展示效果)

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值