动态渲染NavMenu导航(vue-router)

本文介绍如何结合Vue-router和Element-UI的NavMenu组件,实现动态渲染多级菜单。通过递归调用子组件,根据路由配置生成响应式侧边栏菜单,适用于复杂多级导航场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里是根据vue-routerelement-ui中的NavMenu进行组合。根据路由配置动态的渲染NavMenu
注意:

// 获取到所有的路由
routes=this.$router.options.routes

通常将这个路由分开,分为父组件和子组件
父组件:

<el-menu :default-active="$route.path" router>
  <menuItem v-for="(item,index) in routes" :item="item" :key="index"></menuItem>
</el-menu>

子组件:

<div>
<!--这个表示有子菜单的情况下,才会显示-->
<el-submenu :index="item.path" v-if="item.children && item.children.length>0">
  <template slot="title">
    <i class="icon iconfont" :class="item.icon"></i>
    <span slot="title">{{item.name}}</span>
  </template>
  <template v-for="(routePath,index) in item.children">
 // **注意**这个表示判断子菜单下面是否还有三级和四级菜单
    <menuItem :item="routePath" :key="index" v-if="routePath.children && routePath.children.length>0"></menuItem>
    <el-menu-item v-else :index="item.path+'/'+routePath.path" :key="index">
      <i class="icon iconfont" :class="routePath.icon"></i>
      <span slot="title">{{routePath.name}}</span>
    </el-menu-item>
  </template>
</el-submenu>

<!--表示一级菜单-->
<el-menu-item v-else :index="item.path">
  <i class="icon iconfont" :class="item.icon"></i>
  <span slot="title">{{item.name}}</span>
</el-menu-item>

**注意:**要在一个组件中,递归调用他自己需要在这个组件上面,要设置name名字。 在动态加载导航时,若一个标题是一个三级标题,那么他的path路径(是绝对路径)的组成是由:/(根路径)/一级标题路径/二级标题路径/三级标题路径组成。多级标题的path都是绝对路径,并且是路由出口

### 使用 Vue3 和 Layui Menu 组件实现菜单路由 在 Vue3 项目中集成 Layui 的 `lay-menu` 组件来创建动态菜单和路由,可以按照如下方法操作: #### 安装依赖库 为了能够使用 Layui 及其组件,在项目初始化阶段需安装必要的包。 ```bash npm install layui-vue vue-router@next axios ``` #### 配置全局样式与引入Layui资源 确保在项目的入口文件(通常是 main.js 或 app.js)里正确加载了 Layui 样式以及注册核心插件。 ```javascript import { createApp } from 'vue' import App from './App.vue' // 引入layui css import 'layui-src/dist/css/layui.css'; // 引入layui js import * as layui from 'layui-vue'; const app = createApp(App); app.use(layui); // 注册layui到Vue实例上 app.mount('#app'); ``` #### 创建动态菜单结构 定义一个函数用于构建基于后端返回的数据或者静态配置好的 JSON 对象形式的菜单列表。这里假设有一个简单的树形数组表示多层嵌套关系的菜单项[^2]。 ```json [ { "name": "首页", "path": "/home" }, { "name": "系统设置", "children": [ {"name": "用户管理", "path":"/sys/user"}, {"name":"角色权限","path":"/sys/role"} ] } ] ``` #### 设置路由映射逻辑 利用 Vue Router 来处理前端路径切换,并且让这些路径同菜单条目关联起来。对于每一个菜单节点都应存在对应的 route 记录,以便于点击时触发页面跳转行为[^1]。 ```javascript import {createRouter, createWebHistory} from 'vue-router' export default createRouter({ history:createWebHistory(), routes:[ { path:'/', redirect:'/home' }, { name:"Home", component:()=> import('@/views/Home'), meta:{title:'首页'}}, { name:"UserManage",component:()=> import('@/views/UserManage'),meta:{title:'用户管理',parentTitle:'系统设置'}}, { name:"RolePermission",component:()=> import('@/views/RolePermission'),meta:{title:'角色权限',parentTitle:'系统设置'}} ] }) ``` #### 渲染菜单视图 最后一步是在模板内编写 HTML 结构并通过 v-for 循环遍历上述准备好的菜单数据源,同时绑定事件监听器使得每次选中某一项都会调用 router.push() 方法更新当前浏览位置。 ```html <template> <div id="menu-container"> <ul class="layui-nav" lay-filter=""> <!-- 这里的menus就是之前提到的那个JSON对象 --> <li :class="'layui-nav-item '+ (item.children?'layui-nav-itemed':'')" v-for="(item,index) in menus" :key="index"> <a href="javascript:;" @click.prevent="handleClick(item)"> {{ item.name }} </a> <dl v-if="item.children && item.children.length>0" class="layui-nav-child"> <dd v-for="(child,idx) in item.children" :key="idx"><a href="#" @click.prevent="handleChildClick(child)"> {{ child.name }}</a></dd> </dl> </li> </ul> </div> </template> <script setup lang='ts'> import { ref } from 'vue'; import { useRouter } from 'vue-router'; let menus = ref([ /* ... */ ]); function handleClick(menuItem){ const router = useRouter(); if(!menuItem.path)return; router.push({path: menuItem.path}); } function handleChildClick(subMenuItem){ handleClick(subMenuItem); } </script> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值