前置知识: Vue 3

Vue-Router导航守卫

1 minAdvanced2026/6/14

Vue Router导航守卫详解:全局守卫、路由独享守卫、组件内守卫。

1. 全局守卫

1.1 beforeEach

router.beforeEach((to, from) => {
  const auth = useAuthStore();
  if (to.meta.requiresAuth && !auth.isLoggedIn) {
    return { name: 'login', query: { redirect: to.fullPath } };
  }
});

1.2 afterEach

router.afterEach((to, from, failure) => {
  if (!failure) {
    document.title = to.meta.title || 'App';
  }
});

2. 路由独享守卫

const routes = [
  {
    path: '/admin',
    component: Admin,
    beforeEnter: (to, from) => {
      if (!isAdmin()) return '/login';
    },
  },
];

3. 组件内守卫

export default {
  beforeRouteEnter(to, from, next) {
    // 无法访问 this
    next((vm) => {
      // 通过 vm 访问组件实例
    });
  },
  beforeRouteUpdate(to, from) {
    // 路由参数变化时(如 /user/1 → /user/2)
  },
  beforeRouteLeave(to, from) {
    // 离开前确认
    if (hasUnsavedChanges) {
      return window.confirm('确认离开?');
    }
  },
};

4. 守卫执行顺序

1. beforeRouteLeave(离开组件)
2. beforeEach(全局)
3. beforeRouteUpdate(复用组件)
4. beforeEnter(路由配置)
5. beforeRouteEnter(进入组件)
6. afterEach(全局)

5. 返回值

返回值效果
true / undefined允许导航
false取消导航
路由对象重定向