标准答案

  1. 完整导航会先触发失活组件的 beforeRouteLeave,再触发全局 beforeEach。
  2. 接着会处理路由配置里的 beforeEnter,以及复用组件的 beforeRouteUpdate、进入组件的 beforeRouteEnter。
  3. 异步组件解析完成后,会触发全局 beforeResolve;导航确认后触发 afterEach,最后更新 DOM。
  4. 登录鉴权一般放在 router.beforeEach 中,根据目标路由 meta.requiresAuth、登录态和权限信息决定放行、重定向登录页或跳转无权限页。
  5. 按钮权限和接口权限不能只靠路由守卫。路由守卫控制页面访问,按钮展示控制体验,真正授权仍要由服务端接口校验。

题目解析

面试里不一定要背每个钩子的完整顺序,但要能说出全局前置守卫适合做登录鉴权。

beforeResolve 发生在异步组件和组件内守卫解析之后,适合做进入页面前的最后确认。

afterEach 不能阻止导航,适合埋点、标题更新、关闭进度条这类导航完成后的副作用。

代码示例

登录鉴权通常读取路由 meta,并保留 redirect 方便登录后返回。

TypeScript
router.beforeEach((to) => {
  const authStore = useAuthStore()

  if (to.meta.requiresAuth && !authStore.isLoggedIn) {
    return {
      path: '/login',
      query: {
        redirect: to.fullPath
      }
    }
  }

  if (to.meta.roles && !authStore.hasAnyRole(to.meta.roles as string[])) {
    return '/403'
  }

  return true
})

常见误区

  • 把登录鉴权分散在每个页面 mounted 里,页面已经渲染后才跳转。
  • 在 afterEach 里做拦截逻辑。afterEach 只能观察结果,不能取消导航。
  • 只做前端路由权限,后端接口没有校验,直接请求仍然能拿到数据。

作者信息