基本布局
<el-header> 头部区域
<el-container> 主体区域
<el-aside>侧边栏
<el-menu> 菜单
侧边栏结构
<el-menu background-color="#333744" text-color="#fff" active-text-color="#409EFF" :unique-opened="true" :collapse="isCollapse" :collapse-transition="false" router :default-active="activePath"> <!-- 一级菜单 --> <el-submenu :index="item.id+ ''" v-for="item in menulist" :key="item.id"> <!-- 一级菜单模板区域 --> <template slot="title"> <!-- 图标 --> <i :class="iconsObj[item.id]"></i> <!-- 文本 --> <span>{{item.authName}}</span> </template> <!--二级菜单--> <el-menu-item :index="'/'+subItem.path" v-for="subItem in item.children" :key="subItem.id" @click="saveNavState('/'+subItem.path)"> <!-- 二级菜单模板区域 --> <template slot="title"> <!-- 图标 --> <i class="el-icon-menu"></i> <!-- 文本 --> <span>{{subItem.authName}}</span> </template> </el-menu-item> </el-submenu> </el-menu>
<template slot>作用域插槽,是对组件的扩展,通过slot插槽向组件内部指定位置传递内容,通过slot可以父子传参;
二级菜单: el-menu-item :index="'/'+subItem.path" :index指定默认路由为'/'+subItem.path"
全部代码
<template> <el-container class="home-container"> <!-- 头部区域 --> <el-header> <div> <img src="../assets/heima.png" alt=""> <span>电商后台管理系统</span> </div> <el-button type="info" @click="logout">退出</el-button> </el-header> <!-- 页面主体区域 --> <el-container> <!-- 侧边栏 --> <el-aside :width="isCollapse ? '64px':'200px'"> <!-- 折叠展开 --> <div class="toggle-button" @click="toggleCollapse">|||</div> <!-- 侧边栏菜单区域 --> <el-menu background-color="#333744" text-color="#fff" active-text-color="#409EFF" :unique-opened="true" :collapse="isCollapse" :collapse-transition="false" router :default-active="activePath"> <!-- 一级菜单 --> <el-submenu :index="item.id+ ''" v-for="item in menulist" :key="item.id"> <!-- 一级菜单模板区域 --> <template slot="title"> <!-- 图标 --> <i :class="iconsObj[item.id]"></i> <!-- 文本 --> <span>{{item.authName}}</span> </template> <!--二级菜单--> <el-menu-item :index="'/'+subItem.path" v-for="subItem in item.children" :key="subItem.id" @click="saveNavState('/'+subItem.path)"> <!-- 二级菜单模板区域 --> <template slot="title"> <!-- 图标 --> <i class="el-icon-menu"></i> <!-- 文本 --> <span>{{subItem.authName}}</span> </template> </el-menu-item> </el-submenu> </el-menu> </el-aside> <!-- 内容--> <el-main> <!-- 路由占位符 --> <router-view></router-view> </el-main> </el-container> </el-container> </template> <script> export default { data() { return { menulist: [], iconsObj: { '125': 'iconfont icon-user', '103': 'iconfont icon-tijikongjian', '101': 'iconfont icon-shangpin', '102': 'iconfont icon-danju', '145': 'iconfont icon-baobiao' }, isCollapse: false, //是否折叠 activePath: '' //被激活的链接地址 } }, created() { this.getMenuList() this.activePath = window.sessionStorage.getItem('activePath') }, methods: { logout(){ window.sessionStorage.clear() this.$router.push('/login') }, // 获取所有的菜单 async getMenuList() { const {data: res} = await this.$http.get('menus') // console.log(res) if (res.meta.status != 200) return this.$message.error(res.meta.msg) this.menulist = res.data }, // 点击切换菜单折叠与展开 toggleCollapse(){ this.isCollapse = !this.isCollapse }, // 保存链接的激活状态 saveNavState(activePath){ window.sessionStorage.setItem('activePath',activePath) // 记忆到session, 刷新后不忘记 this.activePath = activePath } } } </script> <style lang="less" scoped> .home-container{ height: 100%; } .el-header{ background-color: #373D41; display: flex; justify-content: space-between; padding-left: 0; align-items: center; color: #fff; font-size: 20px; div{ display: flex; align-items: center; span{ margin-left: 15px; } } } .el-aside{ background-color: #333744; .el-menu{ border-right: none; } } .el-main{ background-color: #EAEDF1; } .iconfont{ margin-right: 10px; } .toggle-button{ background-color: #4A5064; font-size: 10px; line-height: 24px; color: #fff; text-align: center; letter-spacing: 0.2em; cursor: pointer; } </style>