<template> <div :class="{'has-logo':showLogo}"> <logo v-if="showLogo" :collapse="isCollapse" /> <el-scrollbar wrap-class="scrollbar-wrapper"> <el-menu default-active="1" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose" background-color="rgb(31 45 61)" text-color="#fff" active-text-color="#ffd04b"> <template v-for="item in menus"> <app-link v-if="item.children.length<1" :to="item.path"> <el-menu-item :index="item.id"> <i :class="item.icon"></i> <span slot="title">{{ item.name }}</span> </el-menu-item> </app-link> <el-submenu v-else :index="item.id"> <template slot="title"> <i class="el-icon-location"></i> <span>{{ item.name }}</span> </template> <template v-for="sub in item.children"> <app-link v-if="sub.children.length<1" :to="sub.path"> <el-menu-item :index="sub.id">{{ sub.name }}</el-menu-item> </app-link> <el-submenu v-else :index="sub.id"> <template slot="title">{{ sub.name }}</template> <app-link :to="three.path" v-for="three in sub.children" :index="three.id" > <el-menu-item >{{ three.name }}</el-menu-item> </app-link> </el-submenu> </template> </el-submenu> </template> </el-menu> </el-scrollbar> </div> </template>
//js部分,applink组件可以直接用el-link代替,只是一个封装
import { mapGetters } from 'vuex' import Logo from './Logo' import variables from '@/styles/variables.scss' import AppLink from './Link' export default { components: { Logo,AppLink }, data() { return { menus:[ { id:'1', name:'一级菜单', icon:'el-icon-location', path:'/', children:[ { id:'2', name:'二级菜单', icon:'el-icon-setting', path:'/', children:[ { id:'3', name:'三级菜单', icon:'el-icon-setting', path:'/404', } ] }, { id:'4', name:'二级菜单2', icon:'el-icon-setting', path:'/nested/menu1/menu1-1/index', children:[ ] }, ] }, { id:'5', name:'一级菜单2', icon:'el-icon-location', path:'/', children:[ { id:'6', name:'二级菜单', icon:'el-icon-setting', path:'/', children:[ ] } ] }, { id:'7', name:'一级菜单3', icon:'el-icon-location', path:'/table/index', children:[ ] }, ] } }, computed: { ...mapGetters([ 'sidebar' ]), routes() { console.log('r',this.$router.options.routes) return this.$router.options.routes }, activeMenu() { const route = this.$route const { meta, path } = route // if set path, the sidebar will highlight the path you set if (meta.activeMenu) { return meta.activeMenu } return path }, showLogo() { return this.$store.state.settings.sidebarLogo }, variables() { return variables }, isCollapse() { return !this.sidebar.opened } }, methods:{ handleOpen(key, keyPath) { //console.log(key, keyPath); }, handleClose(key, keyPath) { //console.log(key, keyPath); } } } </script>
效果:
可以只看menu菜单部分