2025-08-05 Vue-Router

大部分摘抄至https://juejin.cn/post/7511568225987051555?searchId=202508041118462C6329C8A295609FB176#heading-36

1.Vue-Router 4.0X核心变化

  1. 创建路由
import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter({
    history: createWebHistory(),  // 或 createWebHashHistory
    routes: [...]
});

2.组合式API支持

  • useRouter() 获取路由实例(替代this.$router)
  • useRoute() 获取当前路由对象(替代this.$route)

2. 路由配置与核心概念

1.动态路由

{ path: '/user/:id', component: User };
// 获取参数:route.params.id

2.嵌套路由

{
    path: '/parent',
    component: Parent,
    children: [
        { path: 'child', component: Child }
    ]
}
  1. 命名路由与编程式导航
router.push({ name: 'user', params: { id: 1 } });

4.路由模式

  • createWebHistory():History模式(需服务器支持)
    History模式利用了HTML5的History API,允许我们使用“真实”的URL路径,而不是依赖#符号。通过这种方式,URL看起来更“干净”,并且支持浏览器的前进、后退操作
http://example.com/user/1

History模式的优缺点
优点: 更美观的URL,更好的用户体验,适合SEO。
缺点: 需要服务器配置,确保所有路径都指向应用的入口HTML文件。

  • createWebHashHistory():Hash模式

Hash模式是Vue Router的默认模式,它通过URL中的#符号来模拟不同的路径。由于#之后的内容不会被发送到服务器,所有的路径解析都在客户端进行,这种方式简单且兼容性好。

http://example.com/#/user/1

在这个URL中,#/user/1是Hash路径,浏览器只会将http://example.com/发送到服务器。

Hash模式的优缺点
优点: 兼容性好,无需服务器配置。
缺点: URL中有#符号,不够美观,且对于SEO不友好。

  • createMemoryHistory():SSR或测试环境
    5.重定向与别名
{ path: '/home', redirect: '/' }//redirect 重定向
{ path: '/', alias: 'home' }//alias 别名

3.导航守卫

1.全局守卫

  • router.beforeEach((to, from, next) => { ... })
  • router.afterEach((to, from) => { ... })
  • router.beforeResolve()
    to:router即将进入的路由对象;
    from:当前导航即将离开的路由;
    next:Function,进行管道中的一个钩子,如果执行完了,则导航的状态就是 confirmed (确认的);否则为false,终止导航
    2.路由独享守卫
    独享路由守卫是Vue Router提供的一种守卫方式,它只作用于某个特定的路由,而不像全局守卫那样作用于所有的路由。独享守卫允许我们在定义路由时,为某个路由添加特定的守卫逻辑。
{
    path: '/admin',
    component: Admin,
    beforeEnter: (to, from, next) => { ... }
}

3.组件内守卫
onBeforeRouteUpdate:路由参数变化
onBeforeRouteLeave:离开组件前
组件内路由守卫是定义在组件中的守卫,它们可以直接访问组件实例的属性和方法,因此可以更加灵活地处理与组件相关的导航逻辑。Vue.js 提供了以下三个组件内守卫钩子:

import { onBeforeRouteLeave } from 'vue-router';
export default {
    setup() {
        onBeforeRouteLeave((to, from, next) => {
            // 清理逻辑
            next();
        });
    }
};

4.高级特性与最佳实践

1.路由懒加载
懒加载也叫延迟加载,即在需要的时候进行加载,随用随载。

const User = () => import('./User.vue');
const User = defineAsyncComponent(() => import('./User.vue'));

你需要对懒加载的组件进行更细粒度的控制(例如,处理加载状态和错误),你可以使
const routes = [
  {
    path: '/',
    name: 'Home',
    component: defineAsyncComponent(() => import('./views/Home.vue'))
  },
  {
    path: '/about',
    name: 'About',
    component: defineAsyncComponent({
      loader: () => import('./views/About.vue'),
      loadingComponent: LoadingComponent, // 加载时的组件
      errorComponent: ErrorComponent, // 加载失败时的组件
      delay: 200, // 延迟显示加载组件,单位为毫秒 (可选)
      timeout: 3000, // 超过此时间则显示错误组件 (可选)
      // 其他选项...
    })
  }
];

2.路由元信息(meta)

{ path: '/profile', meta: { requireAuth: true } }
// 在导航守卫中访问:to.meta.requiresAuth

3.动态路由

添加路由:router.addRoute({ path: '/new', component: New })
删除路由:router.removeRoute('route-name')

4.路由组件传参

{ path: '/user/:id', component: User, props: true }
// 组件通过props:['id'] 接收

5.滚动行为控制

const router = createRouter({
    scrollBehavior(to, from, savedPosition) {
        return savedBehavior || { top: 0 };
    }
});

5.Vue-Router 4.X 与 3.X 的主要区别

API命名调整(如new VueRouter() -> createRouter())
组合式API支持(useRouter/useRoute)
动态路由API优化(addRoute/removeRoute)
2.如何实现路由权限控制

全局守卫 + 元信息

router.beforeEach((to, from, next) => {
    if(to.meta.requireAuth && !isAuthenticated) next('/login');
    else next();
});

3.如何处理动态路由加载顺序问题

router.isReady():确保初始路由解析完成再挂载应用

router.isReady().then(() => app.mount('#app'));

4.如何捕获导航错误

router.onError((error) => {
    console.error('导航错误', error);
});

5.路由组件如何复用并响应参数变化

onBeforeRouteUpdate:监听路由参数变化

onBeforeRouteUpdate((to, form, next) => {
    fetchData(to.params.id);
    next();
})

6.实战场景示例

const dynamicRoutes = [
    { path: '/admin', component: Admin, meta: { role: 'admin' } }
];
if (user.role === 'admin') {
    dynamicRoutes.forEach(route => router.addRoute(route));
}

// 路由懒加载与预加载(webpack魔法注释)
const Home = () => import( /* webpackPrefetch: true */ './Home.vue' );

7.注意事项

this.$router的兼容性:选项式API中仍可用,组合式API推荐useRouter
SSR适配:需使用createMemoryHistory并处理客户端激活
路由命名冲突:动态路由添加时注意避免重复路径或名称
导航守卫异步处理:确保调用next()或返回Promise

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容