登录后动态挂载路由需立即拉取权限数据并注册,确保跳转前路由就位;刷新时在守卫中兜底恢复;登出时清理路由;菜单与守卫分离,守卫才是权限控制唯一入口。
登录后动态挂载路由,核心是拿到权限数据、转成合法路由对象、用 router.addRoute 注册,并确保跳转前路由已就位。不能等页面打开再加,否则会白屏或 404。
用户输入凭证并验证通过后,应立刻请求后端返回该角色的可访问路由列表(结构如 path/name/component/meta),然后逐条注册:
component 必须写成异步函数形式:() => import('@/views/xxx.vue'),否则无法懒加载router.addRoute(route),推荐给每条路由加 meta: { dynamic: true } 标记,方便后续清理router.addRoute('Layout', childRoute)
router.hasRoute('目标路由名') 检查是否生效,返回 true 才算成功页面刷新后,内存中的动态路由消失,但用户仍处于登录态。需在路由守卫中主动兜底:
router.beforeEach 中判断:如果已登录(如 token 存在),且关键路由(如 home)尚未注册,就触发权限路由拉取与注册逻辑next({ path: to.fullPath, replace: true }) 重新触发导航,避免重复跳转或丢失参数router.getRoutes() 判断是否存在——它只返回已访问过的活跃路由;hasRoute 才是权威依据不清理会导致残留路由干扰下一次登录,甚至出现越权访问:
addRoute 都会返回一个清除函数,例如:const remove = router.addRoute(route)
remove() 即可移除对应路由;批量操作可把所有 remove 函数存进数组统一调用router.removeRoute('name'),但必须确保 name 唯一且已知,不如清除函数稳妥router.push('/login'),避免停留在无效页面菜单只是展示层,权限控制必须由路由守卫兜底:
router.getRoutes(),过滤出 meta.showInMenu === true 且当前角色在 meta.roles 中的路由!router.hasRoute(to.name) —— 路由不存在,说明无权限,直接重定向到 /403
Tplink企业版路由器WiFi名称的默认设置介绍(Tplink企业版路由器WiFi名称的默认设置是什么)
Tplink路由器灯常亮无法上网的原因分析(如何解决Tplink路由器灯常亮无法上网的问题)
Tplink千兆企业级路由器自动重启的作用和优势介绍(如何设置Tplink千兆企业级路由器自动重启功能)
一根天线的tplink路由器有哪些(一根天线的Tplink路由器的特点和优势介绍)
tplink路由器外网访问不了nas(Tplink路由器外网访问NAS的原因分析)
Tplink无法搜到路由器的原因分析(如何解决Tplink无法搜到路由器的问题)