路由独享守卫是Vue Router中为特定路由配置的前置守卫,仅在访问该路由时触发,支持独立权限控制、逻辑内聚、维护清晰;需在routes数组某对象中定义beforeEnter函数,参数为(to, from, next),须手动处理异步且next只能调用一次。
路由独享守卫是 Vue Router 中专为某个具体路由配置的前置守卫,只在访问该路由时触发,不干扰其他路由。它比全局守卫更精准,适合对敏感页面(如后台管理页、用户中心)做独立权限控制,且逻辑只写在对应路由配置里,维护清晰、耦合低。
在 router/index.js(或你的路由配置文件)中,直接在某条 routes 数组里的对象 上添加 beforeEnter 函数:
(to, from, next),其中 to 是目标路由,from 是来源路由,next 是必须调用的放行函数router.beforeEach 里,必须属于某一条 { path: '/admin', name: 'Admin', component: ..., beforeEnter: ... }
async/await 直接返回,需手动处理异步(比如用 next(false) 或重定向)假设你用 localStorage 存 token,只有带有效 token 才能进后台页:
{ path: '/admin', name: 'Admin', component: () => import('@/views/Admin.vue'), beforeEnter: (to, from, next) => { const token = localStorage.getItem('token') if (!token) { next({ name: 'Login', query: { redirect: to.fullPath } }) return } // 可选:检查 token 是否过期(比如解析 JWT payload) try { const payload = JSON.parse(atob(token.split('.')[1])) if (Date.now() >= payload.exp * 1000) { localStorage.removeItem('token') next({ name: 'Login', query: { redirect: to.fullPath } }) return } } catch (e) { next({ name: 'Login', query: { redirect: to.fullPath } }) return } next() }}
redirect 参数里,登录成功后可自动跳回/admin 这一个路由,不影响首页、文章页等其他路径当你只需要限制个别页面,而不是全站统一拦截时,路由独享守卫更合适:
if (to.name === 'xxx') 判断,让代码更聚焦实际写的时候容易踩坑,这几个细节建议标在注释里:
next() 必须且只能调用一次,漏调会卡住导航,重复调用会报错beforeEnter 里直接修改 router.push,要用 next({ path: ... }) 替代next(false) 暂停,等响应回来再手动 next() 或 next('/login')
createRouter(...) 实例,且 beforeEnter 写在 routes 数组内,不是 router 实例上