vue+elementui搭建后台管理界面(5递归生成侧栏路由) vue定义定义多级路由菜单

本文主要是介绍vue+elementui搭建后台管理界面(5递归生成侧栏路由) vue定义定义多级路由菜单,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有一个菜单树,顶层菜单下面有多个子菜单,子菜单下还有子菜单。。。
这时候就要用递归处理

1 定义多级菜单

修改 src/router/index.js 的 / 路由

  {path: '/',redirect: '/dashboard',name: 'Container',component: Container,children: [{path: 'dashboard', name: '首页', component: Dashboard, children: [{path: 'dashboard1', name: '首页1', component: Dashboard,},{path: 'dashboard2', name: '首页2', component: Dashboard,children: [{path: 'dashboard21', name: '首页21', component: Dashboard,},{path: 'dashboard22', name: '首页22', component: Dashboard, },] },]},{path: 'article', name: '文章', component: Article, },]}

2 抽出Sidebar组件

生成的递归路由放在侧边栏,因此抽取 sidebar 组件,sidebar 包含logo和 递归路由
再抽取 SidebarItem 为单独的路由组件,方便递归调用

2.1 Sidebar

Sidebar 接收collapse、路由数组,同时引入 SidebarItem 组件

子组件传入:

  • barIdx: 当前路由的索引,用来定位子菜单
  • subroute: 路由对象
  • fatherpath: 父路径,如 /、 /a/b
<template><div><div class="app-side-logo"><img src="@/assets/logo.png":width="collapse ? '60' : '60'"height="60" /></div><el-menu class="el-menu-vertical-demo":default-active="defaultActive"router:collapse="collapse"><SidebarItem v-for="(item, idx) in routes" :subroute="item":fatherpath="fatherPath":barIdx="idx" :key="idx" /></el-menu></div>
</template><script>
import SidebarItem from './SidebarItem'
export default {naem: "Sidebar",components: {SidebarItem},props: {collapse: {type: Boolean},routes: {type: Array}},computed: {// 首次进入页面时展开当前页面所属的菜单defaultActive(){return this.$route.path},fatherPath(){// 这里直接获取路由配置的 '/' 项return this.$router.options.routes[1].path}}
}
</script><style></style>

2.2 SidebarItem

SidebarItem 接收路由、父路由path、父级idx,然后递归调用自身

<template><!-- 如果当前 subroute 有子节点 --><el-submenu v-if="!subroute.hidden && subroute.children && subroute.children.length > 0":index="genPath(fatherpath, subroute.path)"><!-- 创建菜单分组 --><template slot="title"><i class="el-icon-menu"></i><span slot="title">{{subroute.name}}</span></template><!-- 递归调用自身,直到 subroute 不含子节点 --><SidebarItem v-for="(submenu, subidx) in subroute.children":subroute="submenu":fatherpath="genPath(fatherpath, subroute.path)":barIdx="subidx" :key="barIdx + '-' + subidx" /></el-submenu><!-- 当前节点不含子节点且非隐藏 --><el-menu-item style="font-weight: 400"v-else-if="!subroute.hidden":index="genPath(fatherpath, subroute.path)">{{subroute.name}}</el-menu-item><el-menu-item style="font-weight: 400"v-else:index="genPath(fatherpath, subroute.path)">{{ subroute.name }}</el-menu-item>
</template><script>
export default {name: 'SidebarItem',props: {subroute: {type: Object},barIdx: {type: [String, Number]},fatherpath: {type: String}},computed: {// 默认激活的路由, 用来激活菜单选中状态defaultActive: function(){return this.$route.path},},methods: {// 生成侧边栏路由,格式: /a/b/cgenPath: function(){let arr = [ ...arguments ]let path = arr.map(v => {while (v[0] === '/'){v = v.substring(1)}while(v[-1] === '/'){v = v.substring(0, v.length)}return v }).join('/')path = path[0] === '/' ? path : '/'+pathreturn path},handleOpen: function(key, keyPath) {console.log(key, keyPath)},handleClose: function(key, keyPath) {console.log(key, keyPath)}},mounted: function(){console.log('sidebar routes: ', this.routes)}
}
</script><style>
</style>

3 项目结构

此时 src 的目录结构

│  App.vue
│  main.js
├─assets
│      logo.png
├─components
│      HelloWorld.vue
│      Sidebar.vue
│      SidebarItem.vue
├─container
│      Container.vue
├─router
│      index.js
├─styles
│      index.scss
└─views│  TheLogin.vue├─article│      index.vue└─dashboardindex.vue

4 修改容器配置

src/container/Container.vue 引入 Sidebar 组件

<template>
<!-- ... -->
<el-aside class="app-side app-side-left":class="isCollapse ? 'app-side-collapsed' : 'app-side-expanded'"><Sidebar :collapse="isCollapse" :routes="$router.options.routes[1].children"/>
</el-aside>
<!-- ... -->
</template>
<script>
import Sidebar from '@/components/Sidebar'
export default {name: 'Container',components: {Sidebar},
/** ... */
</script>

5 页面效果

页面效果如下

这篇关于vue+elementui搭建后台管理界面(5递归生成侧栏路由) vue定义定义多级路由菜单的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088910

相关文章

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

用Microsoft.Extensions.Hosting 管理WPF项目.

首先引入必要的包: <ItemGroup><PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" /><PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /><PackageReference Include="Serilog

vue, 左右布局宽,可拖动改变

1:建立一个draggableMixin.js  混入的方式使用 2:代码如下draggableMixin.js  export default {data() {return {leftWidth: 330,isDragging: false,startX: 0,startWidth: 0,};},methods: {startDragging(e) {this.isDragging = tr

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

android 带与不带logo的二维码生成

该代码基于ZXing项目,这个网上能下载得到。 定义的控件以及属性: public static final int SCAN_CODE = 1;private ImageView iv;private EditText et;private Button qr_btn,add_logo;private Bitmap logo,bitmap,bmp; //logo图标private st

js+css二级导航

效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1