router.beforeEach可实现全局前置守卫,每次路由跳转前自动执行,用于登录校验与权限控制;接收to、from、next三参数,依据meta.requiresAuth等元信息判断是否放行或重定向至/login,须确保所有逻辑分支均调用next且避免重复调用。
直接用 router.beforeEach 就能实现全局前置守卫,它在每次路由跳转前自动执行,是做登录校验、权限控制最常用的方式。
注册守卫时传入一个回调函数,接收三个参数:
path、name、meta 等信息通常结合路由元信息(meta)做条件判断,比如:
to.meta.requiresAuth 是否为 true,再读取本地 token 或 store 状态next('/login') 或 next({ name: 'Login' })
next() 放行next,所有分支都要覆盖到在 router.js 中配置:
router.beforeEach((to, from, next) => {const token = localStorage.getItem('token')if (to.meta.requiresAuth && !token) {next('/login')} else if (to.meta.roles && !token) {next('/login')} else if (to.meta.roles && token) {const userRole = JSON.parse(atob(token.split('.')[1])).roleif (!to.meta.roles.includes(userRole)) {next('/403')} else {next()}} else {next()}})
几个关键细节容易出问题:
this,它是纯函数式调用async/await + next 配合,不能漏掉 next
if (to.name !== 'Login' && !token)
next(false) 可中断导航并停留在当前页,适合表单未保存等场景