当前位置: 首页 > news >正文

Vue.js 路由

Vue Router 是 Vue.js 的官方路由管理器,用于构建单页应用(SPA),实现页面组件的切换、参数传递、导航守卫等功能。

以下是 Vue Router 的核心用法(以Vue 3 + Vue Router 4为主,同时标注 Vue 2 的差异):


一、安装

# Vue 3npminstallvue-router@4# Vue 2npminstallvue-router@3

二、基础配置

1. 创建路由实例

// router/index.jsimport{createRouter,createWebHistory}from'vue-router';importHomefrom'../views/Home.vue';importAboutfrom'../views/About.vue';constroutes=[{path:'/',component:Home},{path:'/about',component:About},];constrouter=createRouter({history:createWebHistory(),// Vue 3 默认使用 history 模式routes,});exportdefaultrouter;

Vue 2 写法

importVuefrom'vue';importVueRouterfrom'vue-router';Vue.use(VueRouter);constrouter=newVueRouter({mode:'history',// 或 'hash'routes,});

2. 挂载到应用

// main.jsimport{createApp}from'vue';importAppfrom'./App.vue';importrouterfrom'./router';constapp=createApp(App);app.use(router);app.mount('#app');

三、核心组件

1.<router-link>:导航链接

<template><nav><!-- 默认渲染为 <a> 标签,点击自动跳转 --><router-linkto="/">首页</router-link><router-linkto="/about">关于</router-link><!-- 指定 tag 属性渲染为其他标签(Vue 2) --><router-linkto="/home"tag="button">首页</router-link><!-- Vue 3 使用 v-slot 自定义 --><router-linkto="/home"v-slot="{ navigate, href, isActive }"><a:href="href":class="{ active: isActive }"@click="navigate">首页</a></router-link></nav></template>

2.<router-view>:路由出口

<template><divid="app"><router-view/><!-- 组件渲染在这里 --></div></template>

四、路由配置详解

1. 动态路由参数

constroutes=[{path:'/user/:id',component:User},{path:'/post/:id/comment/:commentId',component:Comment},];
<router-link:to="'/user/' + userId">用户详情</router-link>
// User.vue 中获取参数import{useRoute}from'vue-router';constroute=useRoute();console.log(route.params.id);// 获取 :id 的值

2. 查询参数(Query)

<router-link:to="{ path: '/search', query: { q: 'vue', page: 1 } }">搜索</router-link>
// 获取 queryconsole.log(route.query.q);// 'vue'console.log(route.query.page);// 1

3. 嵌套路由(子路由)

constroutes=[{path:'/user',component:User,children:[{path:'profile',component:UserProfile},// 完整路径: /user/profile{path:'settings',component:UserSettings},],},];
<!-- User.vue --><template><div><h1>用户中心</h1><router-linkto="/user/profile">个人资料</router-link><router-linkto="/user/settings">设置</router-link><router-view/><!-- 子组件渲染在这里 --></div></template>

4. 重定向与别名

constroutes=[{path:'/',redirect:'/home'},// 访问 / 跳转到 /home{path:'/home',component:Home},{path:'/h',alias:'/home'},// 访问 /h 等同于 /home];

五、编程式导航

在组件内使用useRouter钩子进行跳转:

import{useRouter,useRoute}from'vue-router';constrouter=useRouter();constroute=useRoute();// 跳转router.push('/about');// 带参数router.push({name:'User',params:{id:123}});// 带查询参数router.push({path:'/search',query:{q:'vue'}});// 替换当前历史记录(不可回退)router.replace('/login');// 前进/后退router.go(-1);// 后退一页router.go(1);// 前进一页

六、导航守卫(路由拦截)

1. 全局守卫

// router/index.jsrouter.beforeEach((to,from,next)=>{constisAuthenticated=localStorage.getItem('token');if(to.meta.requiresAuth&&!isAuthenticated){next('/login');// 未登录跳转到登录页}else{next();// 放行}});

2. 路由独享守卫

constroutes=[{path:'/admin',component:Admin,beforeEnter:(to,from,next)=>{if(isAdmin()){next();}else{next('/403');}},},];

3. 组件内守卫

exportdefault{beforeRouteEnter(to,from,next){// 组件实例还没创建,this 不可用next(vm=>{vm.fetchData();});},beforeRouteUpdate(to,from,next){// 当前组件复用,参数变化时触发this.fetchData(to.params.id);next();},beforeRouteLeave(to,from,next){// 离开当前路由时触发if(this.hasUnsavedChanges){constanswer=window.confirm('有未保存内容,确定离开吗?');next(answer);}else{next();}},};

七、路由元信息(Meta)

在路由配置中添加自定义字段:

constroutes=[{path:'/admin',component:Admin,meta:{requiresAuth:true,role:'admin'},},];

在守卫中读取:

router.beforeEach((to,from,next)=>{if(to.meta.requiresAuth&&!isAuthenticated){next('/login');}elseif(to.meta.role&&!hasRole(to.meta.role)){next('/403');}else{next();}});

八、懒加载(代码分割)

优化性能,按需加载路由组件:

constroutes=[{path:'/about',component:()=>import('../views/About.vue'),// 只有访问时才加载},];

九、Vue 2 vs Vue 3 关键差异

特性Vue 2 (Router 3)Vue 3 (Router 4)
创建路由new VueRouter()createRouter()
创建历史mode: 'history'createWebHistory()
获取路由this.$routeuseRoute()
获取导航this.$routeruseRouter()
组件内守卫beforeRouteEnter同上
动态参数this.$route.paramsroute.params
导航守卫router.beforeEach同上

十、总结

功能核心 API
路由配置createRouter({ routes })
导航链接<router-link to="...">
路由出口<router-view />
编程跳转router.push(),router.replace()
获取参数route.params,route.query
导航守卫router.beforeEach(),beforeRouteEnter
懒加载() => import('...')

核心流程

  1. 定义路由配置(路径 → 组件映射)
  2. 创建路由实例并挂载
  3. 使用<router-link><router-view>构建页面
  4. 利用导航守卫处理权限、数据加载等逻辑

Vue Router 是 Vue 生态中不可或缺的一部分,熟练掌握它能极大提升开发效率。

http://www.jsqmd.com/news/746193/

相关文章:

  • 别再只盯着OES了!干法刻蚀中,如何利用设备日志和RF匹配参数实现低成本终点检测?
  • 亲测有效!海康IVMS-4200 V2.8.2.2老版本下载与降级安装保姆级教程(解决Win10/Win Server兼容性)
  • C++ string全面解析:从入门到精通
  • 同济高数第七版第一章:函数与极限,我用Python画图帮你理解(附代码)
  • 如何用命令行工具3分钟搞定光猫配置?zteOnu让你的网络管理效率飙升
  • Backtrader机器学习交易策略终极指南:从特征工程到智能部署的完整教程
  • 领域专用AI助手开发:提示工程与安全防护实战
  • 2026文昌航天一站式服务领域哪一家机构提供的服务更加专业 - 热敏感科技蜂
  • Solon AI v.. 发布(智能体开发框架,支持 Java 到 Java)
  • SOGo API开发指南:构建企业级协作应用的终极指南
  • 用机器学习守护心理健康:10个情绪识别与干预系统实战指南
  • 音频驱动的动态令牌压缩技术解析与应用
  • 【企业级Python数据库配置标准】:金融级加密传输+动态密钥轮换+审计日志闭环,已通过等保2.0三级认证
  • 用Python模拟「三个枪手」博弈:从零实现反向归纳法,手把手教你算胜率
  • 终极窗口分辨率自由:Simple Runtime Window Editor 三步实现游戏截图革命
  • 如何利用Laravel Debugbar的请求历史功能实现前后请求对比分析
  • 为什么汽车以太网PHY必须手动配主从?聊聊车载启动那几毫秒的生死时速
  • 终极Wireshark跨平台构建指南:掌握CMakeLists.txt编写技巧
  • 如何快速开发自定义MP4盒子:MP4Parser扩展格式完整指南
  • 为什么你的Java车载应用在-40℃无法启动?揭秘JVM内存模型在汽车MCU异构环境中的温度敏感性失效(附ARM Cortex-A72+Linux RT Patch调优参数)
  • 终极Instaparse性能优化指南:从二次时间复杂度到线性解析的实战秘籍
  • File Browser部署踩坑实录:从下载到汉化,一篇搞定CentOS 7下的常见报错
  • 为内部知识库问答系统集成 Taotoken 实现模型灵活切换
  • 20260503 投资反思——关于持续性利好的思考
  • 成本感知贝叶斯优化在交互设备设计中的应用
  • 如何在Windows系统上完整部署iperf3网络性能测试工具:实用指南与最佳实践
  • AIGC 检测升级 AI 率飙升,嘎嘎降AI 双引擎应对 AI 率降到 5% 以内!
  • 如何快速加强应用小龙虾 OpenClaw 持久记忆和知识库
  • 终极指南:如何在微服务架构中应用compression实现分布式系统高效压缩策略
  • 终极指南:卡尔曼滤波如何重塑气象科学 - 从阿波罗登月到气候变迁研究