vue-router meta(2)页面进入详情页面时,无子项导航栏时,该菜单未高亮。

本文介绍了一种在Vue项目中解决导航栏高亮显示的方法。通过在路由配置中添加属性并调整el-menu组件的默认激活路径,使得在详情页也能正确高亮相应的菜单项。

原因

管理系统,左侧导航栏有个单级的菜单(无子一级的菜单),进入后页面显示的是具体的房间列表。点击具体的房间可以进入房间详情页面,展示具体的房间数据。这时页面路由发生变化。发现,导航栏中不存在高亮的选项。

进入导航栏页面

<el-menu
	....//其他配置项
	:default-active="$route.path"
	....
 </el-menu>

上述列表项

<el-menu-item index="/roomIndex">
      <span slot="title" class="roomListIcon">
          <span>房间列表</span>
      </span>
  </el-menu-item>

而进入的房间详情页面在vue router 配置页面为

{
      path: '/roomIndex',
      name: 'RoomIndex',
      component: RoomIndex,
      meta: { },
 },
{
      path: '/roomDetail/:roomId',
      name: 'Roomdetail',
      component: Roomdetail,
      meta: {}
}

这样就可以看到,是因为el-menu 高亮显示的是 $route.path 。当页面进入到详情页面中,el-menu 没找到对应的path 导致没有高亮的选项。

解决

在router的配置页面

{
      path: '/roomIndex',
      name: 'RoomIndex',
      component: RoomIndex,
      meta: { },
 },
{
	path: '/roomDetail/:roomId',
    name: 'Roomdetail',
    component: Roomdetail,
    meta: {
		belong: "/roomIndex"
	}
}
// 这里给详情页面上的meta 中添加一个属性
//该熟悉的值保持和列表页面的path一致

并且对 导航栏文件中 el-menu 的配置做修改

<el-menu
	....//其他配置项
	:default-active="$route.meta.belong ? $route.meta.belong:$route.path"
	....
 </el-menu>

这样就可以保持页面在详情页面中时,就算导航栏中没有对应的菜单也可以高亮。

### 左侧导航栏的实现 在 `vue-element-admin` 中,左侧导航栏是通过读取路由配置并结合用户的权限来动态生成的。为了实现这一点,项目利用了 Vue Router 的功能以及 Element UI 组件库中的菜单组件。 #### 动态生成侧边栏 侧边栏的内容基于应用内的路由定义自动生成。对于需要动态判断权限的基础页面(如登录页),这些路径被存储于 `constantRoutes` 数组内;而对于需根据用户角色决定访问权的页面,则放置到 `asyncRoutes` 列表中[^3]。 ```javascript // src/router/index.js 示例片段 import { constantRoutes, asyncRoutes } from './routes' const createRouter = () => new Router({ scrollBehavior: () => ({ y: 0 }), routes: constantRoutes }) const router = createRouter() export function resetRouter() { const newRouter = createRouter() router.matcher = newRouter.matcher // reset router } export default router; ``` 当应用程序启动,会先加载常量路由(`constantRoutes`),之后再依据当前用户的权限信息向路由器实例添加异步路由(`asyncRoutes`)。此过程确保只有授权后的资源才会显示给特定用户群体查看。 #### 使用递归组件构建多层结构 考虑到可能存在多层次嵌套的情况,在模板设计上采用了递归的方式来处理这种情况: ```html <!-- src/components/SidebarItem.vue --> <template> <el-submenu v-if="item.children && item.children.length > 0" :index="resolvePath(item.path)"> <span slot="title">{{ item.meta.title }}</span> <!--子项再次调用自己 --> <sidebar-item v-for="(child, index) in item.children" :key="`${item.name}-${index}`" :is="item.component" :item="child" :base-path="resolvePath(item.path)" /> </el-submenu> <el-menu-item v-else :index="resolvePath(item.path)" @click="$router.push(resolvePath(item.path))"> {{ item.meta.title }} </el-menu-item> </template> ``` 上述代码展示了如何根据同类型的节点渲染同的UI元素——如果某一项具有子项,则创建一个带有标题和内部列表的新菜单;反之则直接呈现为可点击链接。 #### 修改默认设置 要调整左侧导航栏的具体样式或行为,可以编辑位于 `src/layout/components/Sidebar` 下的相关Vue文件,比如更改logo图片、文字颜色等属性。另外,若希望改变整个布局框架的设计风格,还可以考虑修改主题色或其他全局CSS变量[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余九月丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值