Vue3动态路由权限控制时,为什么动态添加的路由无法访问?
我在Vue3项目中用路由守卫做权限控制,根据用户角色动态加载路由。但访问新添加的/admin路径时一直报404,代码检查了好几遍没发现问题。
尝试在main.js里这样写:
router.beforeEach(async (to, from) => {
const userRole = await checkRole();
if (userRole === 'admin') {
router.addRoute({ path: '/admin', component: () => import('@/views/Admin.vue') });
}
});
启动后直接访问/admin还是404,但控制台没有错误提示。如果把路由写在router/index.js初始配置里就能正常访问,动态添加的路由为什么失效?
更简单的做法是:先把所有需要权限控制的路由注册好,但用 meta 字段标记权限,然后在守卫里判断是否可访问。比如在路由配置里写:
然后在 beforeEach 里做校验:
这样既避免了动态 addRoute 的坑,也更容易维护。如果真想延迟加载组件,可以用异步组件 + 权限判断组合,没必要动路由表。
addRoute 不是不能用,但容易踩到“导航守卫期间修改路由”这种边界问题,反而把简单事情搞复杂了。上面这个写法才是更稳定的模式。
改成这样:
记得给路由加name,不然重复添加会出问题。