【vue】导航栏变动后刷新router的几种方法

方法1:window.location.reload()

强制整页刷新

这种方法最为直接,但会中断当前的用户体验,有瞬间白屏。

方法2:使用hidden控制menu渲染

1、适合APP这种通过输入网址进入界面情况;

2、menu一般在login进入主页面后只加载一次不会频繁触发,所以onMounted中可以执行菜单显隐控制逻辑。

router/index.js

javascript 复制代码
import { createRouter, createWebHistory } from 'vue-router';
import Layout from '@/layout/index.vue';
import { useAppStore } from '../store';
import { invoke } from '@tauri-apps/api/core';

const router = createRouter({
  history: createWebHistory(import.meta.env.VITE_BASE_URL),
  routes: [
    {
      path: '/account/login',
      name: 'login',
      hidden: true,
      component: () => import('@/views/account/login.vue'),
    },
    {
      path: '/',
      component: Layout,
      redirect: '/account/login',
      children: [
        {
          path: 'dashboard',
          name: 'Home',
          component: () => import('@/views/entry/index.vue'),
          meta: {
            title: 'menu.home',
            icon: 'menu_home',
            affix: true,
          },
        },
      ],
    },
    {
      path: '/robot',
      component: Layout,
      children: [
        {
          path: 'robot',
          name: 'RobotManage', // 没有name面包屑不展示
          component: () => import('@/views/robot/index.vue'),
          meta: {
            title: 'menu.robot', // 各处导航标题
            icon: 'menu_robot',
          },
        },
      ],
    },
    {
      path: '/setting',
      component: Layout,
      redirect: '/setting/scene',
      children: [
        {
          path: 'scene',
          name: 'SceneManage',
          component: () => import('@/views/setting/scene/sceneManage/index.vue'),
          meta: {
            title: 'menu.config',
            icon: 'menu_setting',
          },
        },
      ],
    },
    {
      path: '/log',
      component: Layout,
      children: [
        {
          path: 'log',
          name: 'LogManage',
          component: () => import('@/views/log/index.vue'),
          meta: {
            title: 'menu.logs',
            icon: 'menu_log',
          },
        },
      ],
    },
    {
      path: '/map',
      component: Layout,
      children: [
        {
          path: 'map',
          name: 'MapManage',
          component: () => import('@/views/map/index.vue'),
          meta: {
            title: 'menu.design',
            icon: 'menu_map',
          },
        },
      ],
    },
    {
      path: '/404',
      component: () => import('@/views/404.vue'),
      hidden: true,
    },
    {
      path: '/:pathMatch(.*)*',
      redirect: '/404',
      hidden: true,
    },
  ],
});

export const resetRouter = () => {
  // console.log(router)
};

/**
 * 路由拦截设置
 *
 */
router.beforeEach(async (to, from, next) => {
  console.log('监测路由变化:从', from.path, '到', to.path);
  next();
  return;
});

export default router;

menu导航页面:

html 复制代码
<template>
  <el-scrollbar :height="props.height" id="router-menu">
    <!-- 必须添加background-color属性,因为收起菜单时 悬浮二级菜单默认为白色背景 需要重置 -->
    <el-menu
      :active-text-color="variables.menuActiveText"
      :background-color="variables.menuBg"
      :collapse="isCollapse"
      :collapse-transition="false"
      :default-active="activeMenu"
      :text-color="variables.menuText"
      :unique-opened="false"
      mode="vertical"
    >
      <item :base-path="route.path" :info="route" :key="route.path" v-for="route in routes" />
    </el-menu>
  </el-scrollbar>
</template>

<script setup>
import { onMounted, onUnmounted, ref, computed, inject } from 'vue';
import { useRouter, useRoute } from 'vue-router';
// import { onBeforeRouteUpdate } from 'vue-router'

import variables from '@/styles/variables.module.scss';
import Item from './Item.vue';

const props = defineProps({
  height: {
    type: String,
    default: '100%',
  },
  isCollapse: {
    type: Boolean,
    default: false,
  },
});

const routes = ref(useRouter().options.routes);
const route = useRoute();

const activeMenu = computed(() => {
  const { meta, path } = route;
  // if set path, the sidebar will highlight the path you set
  if (meta.activeMenu) {
    return meta.activeMenu;
  }
  return path;
});

const updateMenuRoutes = () => {
  routes.value.forEach(item => {
    if (item.path === '/robot' && localStorage.getItem('features') === 'emulator') {
      item.hidden = true;
    } else if (item.path === '/robot' && localStorage.getItem('features') !== 'emulator') {
      item.hidden = false;
    }
  });
};

onMounted(() => {
  updateMenuRoutes();
});
</script>
相关推荐
旧梦星轨2 分钟前
掌握 Vite 环境配置:从 .env 文件到运行模式的完整实践
前端·前端框架·node.js·vue·react
PieroPC3 分钟前
NiceGui 3.4.0 的 ui.pagination 分页实现 例子
前端·后端
叫我詹躲躲3 分钟前
为什么永远不要让前端直接连接数据库
javascript·mysql
晚霞的不甘4 分钟前
实战前瞻:构建高可用、强实时的 Flutter + OpenHarmony 智慧医疗健康平台
前端·javascript·flutter
小兔崽子去哪了7 分钟前
文件上传专题
java·javascript
精神病不行计算机不上班9 分钟前
[Java Web]Java Servlet基础
java·前端·servlet·html·mvc·web·session
Aevget12 分钟前
DevExtreme JS & ASP.NET Core v25.2预览 - DataGrid/TreeList全新升级
开发语言·javascript·asp.net·界面控件·ui开发·devextreme
玉木成琳14 分钟前
Taro + React + @nutui/nutui-react-taro 时间选择器重写
前端·react.js·taro
lxh011319 分钟前
2025/12/17总结
前端·webpack
芳草萋萋鹦鹉洲哦20 分钟前
【elementUI】form表单rules没生效
前端·javascript·elementui