本项目是基于vue-element-admin的基础模板vue-admin-template进行改造的,因为实际项目很多会用到顶部导航菜单和侧边导航相结合的情况,为了满足这种需求做了改造。

先上效果图:

改造过程:

主要涉及2个地方,在layout里加了一个Topbar组件,store里加了个permission用于存储侧边导航。

Topbar

位置: src/layout/components/Topbar.vue

主要思路就是把路由第一个拿出来,作为顶部导航,然后点击时,把当前选中的子项路由存在store中以便侧边导航使用。

<template><div class="top-nav"><div class="log">带一级导航的后台管理系统</div><el-menu:active-text-color="variables.menuActiveText":default-active="activeMenu"mode="horizontal"@select="handleSelect"><div v-for="item in routes" :key="item.path" class="nav-item"><app-link :to="resolvePath(item)"><el-menu-itemv-if="!item.hidden":index="item.path">{{ item.meta ? item.meta.title : item.children[0].meta.title }}</el-menu-item></app-link></div></el-menu><div class="right-menu"><el-dropdown class="avatar-container" trigger="click"><div class="avatar-wrapper"><img :src="avatar+'?imageView2/1/w/80/h/80'" class="user-avatar"><i class="el-icon-caret-bottom" /></div><el-dropdown-menu slot="dropdown" class="user-dropdown"><router-link to="/"><el-dropdown-item>Home</el-dropdown-item></router-link><a href="https://github.com/PanJiaChen/vue-admin-template/" target="_blank"><el-dropdown-item>Github</el-dropdown-item></a><a href="https://panjiachen.github.io/vue-element-admin-site/#/" target="_blank"><el-dropdown-item>Docs</el-dropdown-item></a><el-dropdown-item divided @click.native="logout"><span style="display:block;">Log Out</span></el-dropdown-item></el-dropdown-menu></el-dropdown></div></div>
</template><script>
import { mapGetters } from 'vuex'
import AppLink from './Sidebar/Link'
import { constantRoutes } from '@/router'
import variables from '@/styles/variables.scss'
import { isExternal } from '@/utils/validate'export default {name: 'Topbar',components: {AppLink},data() {return {routes: constantRoutes}},computed: {activeMenu() {const route = this.$routeconst { meta, path } = route// if set path, the sidebar will highlight the path you setif (meta.activeMenu) {return meta.activeMenu}// 如果是首页,首页高亮if (path === '/dashboard') {return '/'}// 如果不是首页,高亮一级菜单const activeMenu = '/' + path.split('/')[1]return activeMenu},variables() {return variables},sidebar() {return this.$store.state.app.sidebar},...mapGetters(['avatar'])},mounted() {this.initCurrentRoutes()},methods: {// 通过当前路径找到二级菜单对应项,存到store,用来渲染左侧菜单initCurrentRoutes() {const { path } = this.$routelet route = this.routes.find(item => item.path === '/' + path.split('/')[1])// 如果找不到这个路由,说明是首页if (!route) {route = this.routes.find(item => item.path === '/')}this.$store.commit('permission/SET_CURRENT_ROUTES', route)this.setSidebarHide(route)},// 判断该路由是否只有一个子项或者没有子项,如果是,则在一级菜单添加跳转路由isOnlyOneChild(item) {if (item.children && item.children.length === 1) {return true}return false},resolvePath(item) {// 如果是个完成的url直接返回if (isExternal(item.path)) {return item.path}// 如果是首页,就返回重定向路由if (item.path === '/') {const path = item.redirectreturn path}// 如果有子项,默认跳转第一个子项路由let path = ''/*** item 路由子项* parent 路由父项*/const getDefaultPath = (item, parent) => {// 如果path是个外部链接(不建议),直接返回链接,存在个问题:如果是外部链接点击跳转后当前页内容还是上一个路由内容if (isExternal(item.path)) {path = item.pathreturn}// 第一次需要父项路由拼接,所以只是第一个传parentif (parent) {path += (parent.path + '/' + item.path)} else {path += ('/' + item.path)}// 如果还有子项,继续递归if (item.children) {getDefaultPath(item.children[0])}}if (item.children) {getDefaultPath(item.children[0], item)return path}return item.path},handleSelect(key, keyPath) {// 把选中路由的子路由保存storeconst route = this.routes.find(item => item.path === key)this.$store.commit('permission/SET_CURRENT_ROUTES', route)this.setSidebarHide(route)},// 设置侧边栏的显示和隐藏setSidebarHide(route) {if (!route.children || route.children.length === 1) {this.$store.dispatch('app/toggleSideBarHide', true)} else {this.$store.dispatch('app/toggleSideBarHide', false)}},async logout() {await this.$store.dispatch('user/logout')this.$router.push(`/login?redirect=${this.$route.fullPath}`)}}
}
</script>

permission

位置: src/store/modules/permission.js

主要就是存储下选中的一级导航,用来渲染侧边导航。

import { constantRoutes } from '@/router'const state = {routes: [],addRoutes: [],currentRoutes: {}
}const mutations = {SET_CURRENT_ROUTES: (state, routes) => {state.currentRoutes = routes}
}export default {namespaced: true,state,mutations
}

最后就是要修改下里的routes,设置为当前选中路由的子路由

routes() {// return this.$router.options.routesreturn this.$store.state.permission.currentRoutes.children
},

中间还有一些细节比如侧边导航和收缩图标的显示隐藏,可以自行下载源码查看。

代码仓库地址:
我的码云仓库

vue-element-admin改造顶部一级导航,侧边二级导航相关推荐

  1. vue-element-admin改造顶部一级导航,侧边二级导航+权限路由

    vue-element-admin改造顶部一级导航,侧边二级导航+权限路由 前言 步骤 src/permission.js src/store/modules/permission.js src/st ...

  2. Vue Element Admin 使用mock模块模拟数据

    Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路.通过预先跟服务器端约定好的接口,模拟请求数据甚至逻辑,能够让前端开发更加独立自主,不会被服务端的开发所阻塞. vue-elem ...

  3. vue+element+admin(初始化项目)

    2022.10.17我接触到了vue+element+admin的使用,首先要安装node.jshttps://nodejs.org/zh-cn/download/.和githttps://git-s ...

  4. vue element admin登录方式切换(密码登录或短信登录)

    显示结果: 具体代码可以根据vue element admin源码进行更改,下面是页面代码 <el-form ref="loginForm" :model="log ...

  5. 后端使用SpringBoot和Jwt工具与Redis数据库+前端Vue Element Admin实现用户携带token的登录功能案例

    登录功能描述: 前端输入对应的用户信息 ,在用户输入邮箱后 点击发送按钮给邮箱发送验证码,拿取到验证填完之后,点击登录按钮给后端发送请求 ,后端接收到请求之后 ,第一步校验验证码,第二步校验用户名和密 ...

  6. Vue Element Admin 添加侧边栏以及他的页面

    1. 在 /src/views/ 下添加需要的页面 2. 配置路由器 router 中的路由表 routes,分为 constantRoutes 和 asyncRoutes. 将路由的配置信息添加进路 ...

  7. Vue Element Admin 用mock模块模拟数据

    步骤简单 一  在 src/api/charts 中添加接口 , 方法名为 getindexMock  import request from '@/utils/request'export func ...

  8. vue element admin中发送请求和设置loading效果

    需求:在表格数据加载完成前进入loading显示数据正在加载,数据加载完成后取消loading效果,axios的超时处理和异常的处理之后进行取消loading效果. 小编接下来就根据这个这个需求进行分 ...

  9. 【前端】Vue+Element UI案例:通用后台管理系统-代码总结(已开源)

    文章目录 前言 项目文件目录 api mockServe home.js permission.js index.js mock.js user.js assert components Common ...

最新文章

  1. 转强大Vim的配额置
  2. tif文件转pdf_PPT怎么转换成PDF文件?可以帮到你的PPT转PDF方法
  3. (转)递归转非递归的思路和例子
  4. SQLCLR(一)入门
  5. umts是移动还是联通_联通与电信合建5G:核心网各自建设 5G频率资源共享
  6. [瞎搞]JZOJ 3096 Hash函数
  7. ORACLE专有模式与共享模式
  8. 场景:如果一个select下拉框的值被选中,其他两个字段值的校验也生效
  9. 【语音去噪】基于matlab GUI LMS+RLS语音去噪【含Matlab源码 528期】
  10. 蓝宝石(Al2O3)晶体基片
  11. SIM800C通讯模块调试
  12. SumaTraPDF
  13. 查询最后一次消费记录
  14. 纯数学教程 Page 324 正项级数绝对收敛的一种判别法
  15. 程序员福利---免费接口
  16. Redis使用说明书(Windows)
  17. 双极型晶体管---三极管
  18. 地牢猎手显示无法连接服务器,地牢猎手5无法连接服务器
  19. 网页设置通栏后,缩小页面有一部分不显示
  20. Ubuntu 设置 虚拟分辨率

热门文章

  1. Heartbeat 安装教程
  2. .Net6开发winform程序使用依赖注入学习通http://www.bdgxy.com/
  3. 震动传感器的简单使用
  4. 游戏电竞蓝牙耳机哪个牌子好?超低延迟电竞耳机推荐
  5. 2022年有哪些平价好用蓝牙耳机?国产蓝牙耳机品牌推荐
  6. Dubbo架构整体设计
  7. Canvas - 画线
  8. 笔记本玩逆水寒服务器未响应,逆水寒游戏运行时电脑崩溃怎么办_逆水寒运行游戏是笔记本崩溃问题解决办法介绍_游戏吧...
  9. 2021年全国职业院校技能大赛(中职组)网络安全竞赛试题(2)详解
  10. AMBA APB5协议中文版