前端面试 P059:导航守卫、顺序与权限边界
来源:方格前端讲面试 · 17.Vue-Router的路由守卫,5 分 29 秒。
回看定位:00:28 分类 · 00:28 组件守卫 · 04:19 顺序的原说法
全局、记录与组件守卫
beforeEach 处理全局导航前检查;beforeEnter 针对进入记录;beforeRouteLeave、beforeRouteUpdate 等处理组件离开或复用。Router 4 常用返回值或 Promise 决定结果:false 取消,路由位置重定向,正常返回继续。
router.beforeEach(to => {
if (to.meta.requiresAuth && !session.isLoggedIn && to.name !== 'login') {
return { name: 'login', query: { redirect: to.fullPath } };
}
});
这是配置片段,session 为应用提供的当前会话状态。跳回 redirect 前还要校验目标,避免不受控跳转。旧 next 形式仍可用,但分支中要避免重复调用或一直不调用。
必须纠正:离开守卫不在全局前置之后才统一执行
课程把顺序概括为“全局 beforeEach → beforeEnter → 组件守卫”,不完整且会误导。常见顺序是:离开组件的 beforeRouteLeave → 全局 beforeEach → 复用组件 beforeRouteUpdate → 路由 beforeEnter → 解析异步组件 → 进入组件 beforeRouteEnter → beforeResolve → 确认导航 → afterEach 等后续步骤。
beforeRouteEnter 中还没有组件实例,不能使用 this;Options API 的 beforeRouteLeave 可以访问已存在实例,不能把两者一并说成都不能访问。
重用与权限
仅 params/query/hash 改变,不一定重新触发 beforeEnter,应根据记录重用规则处理。afterEach 不能阻止导航,适合完成后的观察、标题等操作,并处理导航 failure。
前端守卫改善导航和展示体验,不是服务端权限边界。敏感接口必须独立认证授权,即使有人绕过前端路由也不能拿到无权数据。