CodeWalk

Vue Router 4核心变化与导航守卫

作者:孤独的心 · 2026-05-30 12:55

介绍Vue Router 4(配合Vue3)相比Vue Router 3的核心变化,以及导航守卫(Navigation Guards)的执行顺序和完整解析流程。createRouter与new Router的区别是什么?

回答

孤独的心

createRouter vs new Router

Vue3使用createRouter代替new VueRouter

// Vue Router 4
import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter({
  history: createWebHistory(),
  routes: [...]
});
app.use(router);

核心变化:

  1. 工厂函数createRouter / createWebHistory / createWebHashHistory
  2. 不再依赖Vue构造函数:与Vue解耦
  3. Composition API集成useRouter / useRoute / onBeforeRouteLeave / onBeforeRouteUpdate
  4. TypeScript支持:自定义RouteRecordRaw类型
  5. 路由Props{ props: true }将params作为props传给组件
  6. 动态路由router.addRoute()增强

导航守卫完整执行顺序

  1. 前置守卫触发router.beforeEach(全局)
  2. 路由独享守卫beforeEnter(路由配置中的守卫)
  3. 组件内守卫执行(旧组件):onBeforeRouteUpdate / beforeRouteUpdate
  4. 组件内守卫(新组件):onBeforeRouteLeave / beforeRouteLeave
  5. 解析守卫router.beforeResolve(全局,确认导航前)
  6. 导航确认:更新URL
  7. 后置守卫router.afterEach(全局,无next)

完整导航解析流程:

导航被触发
↓
失活组件里调用 beforeRouteLeave 守卫
↓
调用全局 beforeEach 守卫
↓
重用的组件里调用 beforeRouteUpdate 守卫
↓
路由配置里调用 beforeEnter
↓
解析异步路由组件
↓
激活组件里调用 onBeforeRouteEnter
↓
调用全局 beforeResolve 守卫
↓
导航被确认
↓
更新 DOM
↓
调用全局 afterEach 守卫

动态路由守卫示例:

router.beforeEach(async (to, from) => {
  if (to.meta.requiresAuth && !isAuthenticated()) {
    return { path: '/login', query: { redirect: to.fullPath } };
  }
});

注意Vue Router 4中守卫直接return路径(而非调用next())。