vue3路由跳转后激活菜单匹配不上的问题解决

vue3路由跳转后激活菜单匹配不上的问题

出现原因: 路由跳转后继续运行了onMounted钩子函数,导致我们保存的激活菜单被重制了。
解决办法:
1.将激活路径保存在store中,onMounted函数中将store中保存的激活菜单取出;
2.将激活路径保存在localStorage中,onMounted函数中将localStorage中保存的激活菜单取出;
3.onMounted函数中获取页面的路由name,再赋值给激活菜单(需要name和激活菜单字段是一致)

以下为第三种办法的实例:

<template>
  <div id="alarmList" class="menuList">
    <div class="menuNumberContainer">
      <div
        v-for="item in menuNumber"
        :key="item.key"
        class="card"
        :class="activeMenu == item.key ? 'active-menu-style' : ''"   //此处做了一个激活样式 activeMenu
        @click="changePage(item)"
      >
        <img :src="item.img" alt="" />
        <div class="menuName">{{ item.name }}</div>
      </div>
    </div>
    <router-view v-slot="{ Component, route }" :key="$route.fullPath">
      <!-- <transition appear name="fade-transform" mode="out-in"> -->
      <component :is="Component" :key="route.path" @update-station="updateStation" />
      <!-- </transition> -->
    </router-view>
  </div>
</template>

<script lang="ts" setup>
import { onMounted, reactive, ref, nextTick, watch } from 'vue';
import { useRouter, useRoute } from 'vue-router';
const router = useRouter();

const activeMenu = ref<string>('homePage'); // 进入页面默认 homePage 页面

const menuNumber = reactive([
  {key: 'homePage',},
  {key: 'mainWiringDiagram',},
  {key: 'deviceMonitor',},
  {key: 'faultAlarm',},
  {key: 'curveReport',},
]);
const changePage = (item: any) => {
  // 点击按钮后进行页面跳转
  // 记录当前点击的按钮来匹配激活的菜单,!!!!但是!!!并没有生效
  // activeMenu.value = item.key;
  // 跳转路由
  router.push(item.key);
};

//路由跳转后会重新运行这个钩子函数
onMounted(() => {
  // 应该采用这段
  // router.currentRoute.value.name 查询当前的路由名称,将路由名称赋值给 activeMenu (注意:需要路由名称和activeMenu是一样的字段才行)
  activeMenu.value = router.currentRoute.value.name ? router.currentRoute.value.name : 'homePage';
 
});
</script>
### Vue3 导航菜单样式解决方案 在 Vue3 项目中,为了实现导航菜单样式的动态切换以及保持良好的用户体验,可以采用多种方法来定制化导航栏的外观。 #### 使用 `router-link` 实现精确匹配高亮显示 对于简单的导航链接,可以在 `<router-link>` 中利用 `exact-active-class` 属性指定当路径完全匹配时应用特定类名。这有助于确保只有当前激活路由才会被赋予特殊的样式[^3]: ```html <template> <div> <!-- 首页 --> <router-link to="/" class="menu-item" exact-active-class="selected">首页</router-link> <!-- 其他页面 --> <router-link to="/about" class="menu-item" exact-active-class="selected">关于我们</router-link> </div> </template> <style scoped> .menu-item { color: black; } .selected { font-weight: bold; text-decoration: underline; } </style> ``` #### 自定义组件方式创建复杂的导航栏 如果需求更为复杂,则建议构建一个可复用的自定义导航栏组件。此做法仅提高了代码的模块性和维护性,还允许更精细地控制各个部分的行为和表现形式。例如,在 Uni-app 或者标准 Web 应用程序里都可以这样做[^1]: ```javascript // src/components/CustomNav.vue <script setup lang="ts"> import { ref, computed } from &#39;vue&#39;; import { useRoute } from &#39;vue-router&#39;; const route = useRoute(); let currentPath = computed(() => route.path); defineProps({ menuItems: Array, }); </script> <template> <nav> <ul> <li v-for="(item, index) in menuItems" :key="index" :class="{ active: item.link === currentPath }"> <a :href="item.link">{{ item.title }}</a> </li> </ul> </nav> </template> <style scoped> .active a { background-color: lightblue; } </style> ``` 上述例子展示了如何通过计算属性跟踪当前活动路径,并据此调整相应项目的 CSS 类以反映其状态变化。 #### 处理多级嵌套路由下的样式问题 针对存在子路由的情况,可能需要额外考虑父级与子级之间的关系。一种常见策略是在根级别设置默认重定向规则,使得访问顶级目录自动跳转到第一个有效子节点;同时配合编程式导航或监听 `$route` 对象的变化来进行更加细致化的操作[^4]。 ```javascript { path: &#39;/&#39;, component: ParentComponent, children: [ { path: &#39;&#39;, redirect: &#39;child-one&#39; }, { path: &#39;child-one&#39;, name: &#39;ChildOne&#39;, component: ChildOneComponent } ] } ``` 这样做的好处是可以简化 URL 结构并减少必要的重复工作量,同时也便于管理同层次间的一致性展示效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值