Vue.js 前端开发实战之 06-Vue 路由

初识路由

路由概述

程序开发中的路由分为后端路由和前端路由。

后端路由通过用户请求的 URL 分发到具体的处理程序,浏览器每次跳转到不同的 URL,都会重新访问服务器。

前端路由是一种在单页应用(SPA)中管理页面导航的技术。其主要作用是根据用户的操作(如点击链接)动态地加载和显示不同的页面内容,而无需重新加载整个页面。

单页面应用的核心思想之一,就是更新局部的视图,而不重新请求页面。

对于单页面应用来说,主要通过 URL 中的 hash 符号(# 号)来实现不同页面之前的切换。

前端路由在访问一个新页面的时候,仅仅只是变换了 hash 值,没有和服务端交互,不存在网络延迟,提升了用户体验。

vue-router 初体验

vue-router 是 Vue 官方推出的路由管理器,主要用于管理 URL,实现 URL 和组件的对应,通过 URL 进行组件之间的切换。

vue-router 3.x 文档:https://v3.router.vuejs.org/zh/

vue-router 的使用:

  • 新建 HTML 文件,并使用 script 标签引入 vue.js、vue-router.js。
  • 创建路由对象,配置一组路由。
  • 实例化 Vue 实例,并将路由对象传递给 Vue 实例。
  • 在 app 盒子中,使用 router-link 标签创建路由跳转按钮、使用 router-view 标签定义视图占位符。

示例:vue-router 初体验

入口页面(index.html):

<divid="app"><!-- router-link:相当于a标签 to:相当于a标签的href属性 tag:把a替换成xxx --><router-linkto="/login"tag="button">登录</router-link><router-linkto="/register">注册</router-link><!-- router-view:充当视图占位符 --><router-view></router-view></div><scriptsrc="vue.js"></script><scriptsrc="vue-router.js"></script><script>// 定义路由对象// router路由管理者letrouter=newVueRouter({// routes:一组路由routes:[// {}:一条路由{path:'/login',// 路由地址component:{// 组件对象,不是组件名称template:'<h3>登录页面</h3>'}},{path:'/register',component:{template:'<h3>注册页面</h3>'}}]})letvm=newVue({el:'#app',data:{},// 将路由对象传递给Vue实例// router属性:路由对象router:router})</script>

示例效果:


路由模式

使用 vue-router 实现前端路由时,提供了两种模式。

  • hash:vue-router 的默认模式,URL 中会包含 # 号。hash 模式利用了 window 监听 onhashchange 事件来实现的。
  • history:URL 中不会包含 # 号。history 模式利用了 window.history.pushState 方法来实现的。

路由模式配置的基本用法:

letrouter=newVueRouter({mode:'history',// ...})

路由对象属性

路由对象表示当前激活的路由的状态信息,包含了当前 URL 解析得到的信息,还有 URL 匹配到的路由记录。路由对象是不可变的,每次成功地导航后都会产生一个新的对象。

this.$route 表示当前的路由对象。

路由对象的基本属性:

名称描述
$route.path路由的路径
$route.queryURL 的查询参数,是一个 {key: value} 对象
$route.params路由跳转携带参数,是一个 {key: value} 对象
$route.hash在 histoty 模式下获取当前路由的 hash 值,带 # 号
$route.fullPath完成解析后的 URL,包含查询参数和 hash 的完整路径
$route.name路由的名称

路由传参

query 传参

通过 query 方式传递参数,类似于 GET 请求,在页面跳转的时候,可以在地址栏看到请求参数。


示例:query 传参

入口页面(index.html):

<divid="app"><router-linkto="/user?id=77&name=多仔">登录</router-link><router-view></router-view></div><script>letrouter=newVueRouter({routes:[{path:'/user',component:{template:'<h3>欢迎您,{{this.$route.query.name}}</h3>',created(){console.log(this.$route)}}}]})letvm=newVue({el:'#app',router:router})</script>

示例效果:


params 传参

使用 params 方式传递参数,类似于 POST 请求和 RESTFul 风格,将参数放在路径中或直接隐藏。


示例:params 传参

入口页面(index.html):

<divid="app"><router-linkto="/user/77/多仔">登录</router-link><router-view></router-view></div><script>letrouter=newVueRouter({routes:[{// 使用:xx指定参数占位符path:'/user/:id/:name',component:{template:'<h3>欢迎您,{{this.$route.params.name}}</h3>',created(){console.log(this.$route)}}}]})letvm=newVue({el:'#app',data:{},router:router})</script>

示例效果:


嵌套路由

嵌套路由概述

嵌套路由就是在一个路由中嵌套一组子路由。


示例:嵌套路由

入口页面(index.html):

<style>ul, li, h1{padding:0;margin:0;list-style:none;}#app{width:100%;display:flex;flex-direction:row;}ul{width:200px;flex-direction:column;color:#fff;}li{flex:1;background:#000;margin:5px auto;text-align:center;line-height:30px;}.about-detail{flex:1;margin-left:30px;}.about-detail h1{font-size:24px;color:blue;}</style><divid="app"><ul><router-linkto="/about"tag="li">关于公司</router-link><router-linkto="/contact"tag="li">联系我们</router-link></ul><router-view></router-view></div><!-- 关于公司-template --><templateid="about-template"><divclass="about-detail"><h1>北京xx科技有限公司简介</h1><router-linkto="/about/detail">公司简介</router-link>|<router-linkto="/about/governance">公司治理</router-link><router-view></router-view></div></template><!-- 联系我们-template --><templateid="contact-template"><divclass="about-detail"><h1>联系我们</h1><p>公司位于北京市海淀区中关村科技园内,主营业务包括餐饮娱乐、服装设计等</p></div></template><!-- 公司简介-template --><templateid="detail-template"><div><p>xx是全球领先... ...</p></div></template><!-- 公司治理-template --><templateid="governance-template"><div><p>公司坚持以客户为中心、以奋斗者为本... ...</p></div></template><script>letrouter=newVueRouter({routes:[{// 关于公司path:'/about',component:{template:'#about-template'},// “关于公司”路由的子路由列表children:[{// 公司治理// 子路由的path属性前不能带有/// 子路由地址 = 父路由 + "/" + 子路由path:'governance',component:{template:'#governance-template'},},{// 公司简介path:'detail',component:{template:'#detail-template'},}]},{// 联系我们path:'/contact',component:{template:'#contact-template'}}]})letvm=newVue({el:'#app',router:router})</script>

示例效果:


命名路由

命名路由概述

vue-router 提供了一种隐式的引用路径,即命名路由。

在创建路由时,给路由指定 name 名称,链接路由跳转时,通过路由的名称取代路由地址。


示例:命名路由

入口页面(index.html):

<divid="app"><!-- :to:为router-link绑定要跳转的路由对象的信息 name:路由名称 params:要使用params方式传递的参数 --><router-link:to="{name:'user', params: {name:'多仔'}}">登录</router-link><router-view></router-view></div><script>letrouter=newVueRouter({routes:[{path:'/user',name:'user',// 指定路由名称component:{template:'<h3>欢迎您,{{this.$route.params.name}}</h3>'}}]})letvm=newVue({el:'#app',router:router})</script>

示例效果:


命名视图

命名视图概述

vue-router 提供了命名视图,可以通过命名视图来在同一个路由中渲染多个组件。


示例:命名视图

入口页面(index.html):

<divid="app"><!-- name:为视图占位符取名字 视图占位符默认的名字为default --><router-viewname="default"></router-view><router-viewname="main"></router-view></div><script>letrouter=newVueRouter({routes:[{path:'/',components:{// 该路由对应多个组件// 视图名称: 组件对象'default':{template:'<h3>default</h3>'},'main':{template:'<h3>main</h3>'}}}]})letvm=newVue({el:'#app',router:router})</script>

示例效果:


编程式导航

router.push

router.push 方法用于实现路由跳转,路由跳转时会在 history 中添加一条新的记录。

router.push 的基本用法:

router.push(跳转路径)router.push({path:跳转路径})router.push({path:跳转路径,query:query传参参数对象})router.push({name:跳转路由名称,params:params传参参数对象})

示例:router.push

入口页面(index.html):

<divid="app"><button@click="goStart1">跳转1</button><button@click="goStart2">跳转2</button><router-view></router-view></div><script>letrouter=newVueRouter({routes:[{path:'/user',name:'user',component:{template:'<div><p>用户名query:{{this.$route.query.name}}</p><p>用户名params:{{this.$route.params.name}}</p></div>'}}]})letvm=newVue({el:'#app',router:router,methods:{goStart1(){// 使用path + query传递参数this.$router.push({path:'/user',query:{name:'admin'}})},goStart2(){// 使用name + params传递参数this.$router.push({name:'user',params:{name:'admin'}})}}})</script>

示例效果:


router.replace

router.replace 方法用于实现路由替换,路由替换时不会在 history 中添加一条新的记录。

router.replace 的基本用法:

router.replace(替换路径或替换的路由对象)

router.go

router.go 方法用于实现路由的前进和后退,类似于 history.go、history.forward、history.back 等方法。

router.go 的基本用法:

// 路由前进router.go(1)// 路由后退router.go(-1)// 路由刷新router.go(0)

路由守卫

全局前置守卫

全局前置守卫在路由跳转之前进行拦截,执行操作。

全局前置守卫是最常用的导航守卫,它主要作用于登录验证,获取用户权限信息等场景。

全局前置守卫的基本用法:

router.beforeEach((to,from,next)=>{// to: 即将进入的目标路由对象// from: 正在离开的路由对象// next: 路由下一步操作的函数// next(): 直接跳转到目标路由// next('/path'): 跳转到一个不同的地址// ...})

示例:全局前置守卫

入口页面(index.html):

router.beforeEach((to,from,next)=>{if(用户未登录){// 重定向到登录页面next({path:'/login'})}else{// 正常跳转next()}});

全局后置守卫

全局后置守卫在路由跳转之前进行拦截,执行操作。

全局后置守卫主要作用于滚动条回调、更新页面标题等场景。

全局后置守卫的基本用法:

router.afterEach((to,from)=>{// ...})

示例:全局后置守卫

入口页面(index.html):

router.afterEach((to,from)=>{window.scrollTo(0,0);})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1204614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速搭建AI数字人直播间,Live Avatar实战应用详解

快速搭建AI数字人直播间&#xff0c;Live Avatar实战应用详解 1. 引言&#xff1a;为什么你需要一个AI数字人直播间&#xff1f; 你有没有想过&#xff0c;一个人就能撑起一场24小时不间断的直播&#xff1f;不需要休息、不会犯错、还能同时应对成千上万观众的互动——这不再…

Qwen3-Embedding-0.6B工业场景:设备手册语义搜索实战案例

Qwen3-Embedding-0.6B工业场景&#xff1a;设备手册语义搜索实战案例 在制造业一线&#xff0c;工程师常面临一个高频却棘手的问题&#xff1a;面对动辄上千页的设备手册PDF&#xff0c;如何快速定位“某型号伺服电机过热报警的复位步骤”&#xff1f;传统关键词搜索常因术语不…

Z-Image-Turbo运行报错?常见异常排查与修复指南

Z-Image-Turbo运行报错&#xff1f;常见异常排查与修复指南 1. 引言&#xff1a;为什么你的Z-Image-Turbo会“卡住”&#xff1f; 你是不是也遇到过这种情况&#xff1a;满怀期待地启动Z-Image-Turbo&#xff0c;输入提示词&#xff0c;按下回车——结果程序直接崩溃、显存爆…

Vue.js 前端开发实战之 05-Vue 过渡和动画

过渡和动画基础 过渡和动画概述 Vue 在插入、更新或者移除 DOM 时&#xff0c;提供了多种过渡效果。 过渡&#xff0c;就是从一个状态向另外一个状态插入值&#xff0c;新的状态替换了旧的状态。 Vue 提供了内置的过渡封装组件 transition&#xff0c;可以结合 CSS 动画 ke…

CosyVoice2-0.5B实时对话应用:低延迟优化完整指南

CosyVoice2-0.5B实时对话应用&#xff1a;低延迟优化完整指南 1. 为什么你需要关注这个语音模型&#xff1f; 你有没有遇到过这样的场景&#xff1a; 正在开发一个智能客服系统&#xff0c;用户刚说完问题&#xff0c;却要等3秒以上才听到AI回复&#xff1f; 想给短视频配上定…

Open-AutoGLM镜像免配置部署:3步搞定AI手机助理

Open-AutoGLM镜像免配置部署&#xff1a;3步搞定AI手机助理 你有没有想过&#xff0c;让手机自己“看懂”屏幕、理解你的指令、再自动点开App、输入关键词、完成关注——全程不用你动一根手指&#xff1f;这不是科幻电影&#xff0c;而是今天就能上手的真实能力。Open-AutoGLM…

AI如何帮你解决SYNAPTICS.EXE驱动问题

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个AI驱动的SYNAPTICS.EXE诊断修复工具&#xff0c;功能包括&#xff1a;1.自动扫描系统日志识别SYNAPTICS.EXE相关错误&#xff1b;2.分析错误类型并提供修复建议&#xff1…

verl自动化脚本编写:提升部署效率的Python实例

verl自动化脚本编写&#xff1a;提升部署效率的Python实例 1. verl 是什么&#xff1a;专为大模型后训练打造的强化学习框架 你可能已经听说过用强化学习来优化大语言模型&#xff0c;但真正能在生产环境稳定跑起来、又不让你天天调参改配置的框架并不多。verl 就是这样一个少…

MinerU自动化报告生成:Python脚本调用mineru命令

MinerU自动化报告生成&#xff1a;Python脚本调用mineru命令 PDF文档处理一直是技术写作、学术研究和企业知识管理中的高频痛点。多栏排版、嵌入图表、复杂公式、跨页表格……这些元素让传统OCR工具束手无策&#xff0c;人工重排又耗时费力。MinerU 2.5-1.2B 镜像的出现&#…

虎贲等考 AI:让数据分析告别工具内耗,实证研究高效破局

还在被数据分析裹挟进 “工具迷宫”&#xff1f;用 SPSS 调试参数耗掉整宿&#xff0c;靠 Python 写代码屡屡报错&#xff0c;好不容易算出结果&#xff0c;却因数据预处理不规范被导师驳回&#xff1b;明明是硬核实证&#xff0c;却困在 “清洗 - 建模 - 可视化” 的低效循环里…

告别繁琐配置!用科哥镜像快速实现音频情感分析全流程

告别繁琐配置&#xff01;用科哥镜像快速实现音频情感分析全流程 1. 为什么你需要这个镜像&#xff1a;从“想试试”到“马上用”的跨越 你有没有过这样的经历&#xff1f; 在论文里看到一个惊艳的语音情感识别模型&#xff0c;点开GitHub——先装PyTorch&#xff0c;再配CUD…

5个高质量免费数据集下载网站实测

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个数据集聚合搜索工具&#xff0c;输入关键词后自动从Kaggle、UCI、Google Dataset Search等平台获取相关数据集信息&#xff0c;比较数据量、更新时间和下载方式&#xff0…

如何用AI自动生成CompletableFuture.runAsync代码

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请生成一个Java程序&#xff0c;使用CompletableFuture.runAsync实现异步任务执行。要求&#xff1a;1) 创建一个简单的异步任务&#xff0c;打印当前线程信息&#xff1b;2) 添加…

PCB过孔盖油的3大常见缺陷附避坑指南

各位 PCB 工程师&#xff0c;是不是经常遇到过孔盖油出问题的情况&#xff1f;比如盖油后过孔有气泡、油膜脱落、孔壁露铜…… 这些缺陷不仅影响板子的外观&#xff0c;还会严重降低板子的可靠性。今天咱们就来揭秘过孔盖油的 3 大常见缺陷&#xff0c;再给大家分享一套 “避坑…

人工磨枪 vs AI 赋能:虎贲等考 AI 问卷设计功能,重构科研数据收集新范式

在学术研究的征途上&#xff0c;问卷设计堪称实证研究的 “第一道关卡”。多少研究者曾为一个模糊的措辞反复推敲&#xff0c;为一组互斥的选项彻夜难眠&#xff0c;为一份缺乏信效度的问卷扼腕叹息。据统计&#xff0c;近 40% 的社科类毕业论文因问卷设计缺陷影响结论科学性。…

过孔盖油的 “黑科技”:那些你不知道的进阶工艺

各位 PCB 工程师&#xff0c;提到过孔盖油&#xff0c;你是不是只知道丝网印刷和手工涂覆这两种方法&#xff1f;其实&#xff0c;随着 PCB 技术的发展&#xff0c;过孔盖油也出现了很多 “黑科技” 进阶工艺。这些工艺不仅能提高盖油的质量&#xff0c;还能满足一些特殊 PCB 的…

Java开发效率革命:Cursor对比传统IDE实测

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请对比实现以下Java功能在Cursor和传统IDE中的效率&#xff1a;1. 创建JPA实体类 2. 编写Service层逻辑 3. 生成Controller接口 4. 添加单元测试。记录每个步骤的时间消耗和代码质…

CYBERCHEF入门指南:零基础学会数据转换

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式CYBERCHEF新手教程&#xff0c;包含&#xff1a;1) 界面导览视频 2) 5个渐进式练习&#xff08;文本编码、简单加密、数据提取等&#xff09;3) 实时错误检查和提示…

零基础学RC滤波:从原理到第一个电路

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个面向初学者的RC低通滤波电路教学项目。要求&#xff1a;1. 用通俗语言解释滤波原理&#xff1b;2. 提供最简电路图&#xff08;不超过5个元件&#xff09;&#xff1b;3. …

9 款 AI 写论文哪个好?深度实测:虎贲等考 AI 凭硬核实力 C 位出圈

毕业季来临&#xff0c;AI 论文工具赛道迎来 “神仙打架”。为帮广大学子避开工具选择的坑&#xff0c;我们耗时两周&#xff0c;对虎贲等考 AI、WPS AI、ChatGPT、豆包、讯飞星火、通义千问、文心一言、Notion AI、Grammarly AI 这 9 款热门 AI 写论文工具展开全维度实测。从学…