一文彻底学会Vue3路由:全面讲解路由流程、路由模式、传参等——全栈开发之路--前端篇(7)路由详解

全栈开发一条龙——前端篇
第一篇:框架确定、ide设置与项目创建
第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。
第三篇:setup语法,设置响应式数据。
第四篇:数据绑定、计算属性和watch监视
第五篇 : 组件间通信及知识补充
第六篇:生命周期和自定义hooks

本文将带你从头到尾将Vue3中的路由学透,学完之后所有的跳转需求都可以实现。


文章目录

  • 路由
  • 一、路由基础实践——流程梳理
    • 1.index.ts
    • 2.三个页面组件的vue
    • 3.main.ts
    • 4.app.vue
    • 5.自定义路由名
    • 效果展示
  • 二、路由模式
    • 1.history模式
    • 2.hash模式
    • 3.模式使用推荐
  • 三、嵌套路由
    • 1.基本嵌套
    • 2.路由传参
      • 1.query参数
        • a)基本写法
        • b)对象快速写法
      • 2.params参数
        • 1.基本写法
        • 2.快捷写法
    • 3.路由的props配置
  • 四、编程式导航(重要)脚本操作跳转
  • 五、补充
    • 1.replace属性
    • 2.重定向


路由

路由可以实现页面的跳转,可以用来实现SPA应用(单页面应用)

类似这种,左边导航,右边展示,全程画面不抖动,不跳转。

点击导航,路径(网址)发生变化,路由器捕获,卸载当前组件,挂载新的组件,这些组件都是一个一个Vue文件写的页面。

一、路由基础实践——流程梳理

我们先安装路由 npm i vue-router,再在src下创建router文件夹。

1.index.ts

我们在router中创建index.ts,这个文件的意义在于创建一个路由器,并将之暴露出来。

import { createRouter } from "vue-router"
import home from "@/components/home.vue";
import dog from "@/components/dog.vue";
import cc from "@/components/cc.vue";
//创建路由器
const router = createRouter({//管理路由routes:[  //一个一个的路由规则{//路径path:'/home',//组件绑定component:home},{//路径path:'/dog',//组件绑定component:dog},{//路径path:'/test',//组件绑定component:cc}]
})export default router

请仔细查看写在代码旁的注释,这里做一个大致说明,这个地方是要进行一个路由的绑定,我们先在src/components中新建三个文件,这三个文件就是之后我们可以用来切换的页面Vue文件

然后按照如上语法绑定至此,我们的路由器就建立好了。

可能遇到的报错

如果遇到这个问题,是因为你没有设置路由模式(这个在本文后面会讲)
你要引入设置路由模式的组件

//引入路由器模式
import { createWebHistory } from "vue-router";

然后在const中加入 history:createWebHistory(),

这样报错就消失了。

2.三个页面组件的vue

我们绑定完成之后,必须要在相应组件中加入内容,不然会报错。我们测试的时候可以随便写,我以下给出三个样例,你可以直接复制。
dog.vue:

<template><div class = "style_test">    <button @click="add_border_collie">添加一只边牧!</button>   <hr><img v-for="(bc,index) in border_collie" :src="bc" :key="index" class="sizee"></div><div class = "style_test">   <button @click="add_dog">随机添加一只狗</button>   <hr><img v-for="(bc,index) in dog" :src="bc" :key="index" class="sizee"></div>
</template><script lang="ts">export default {name : 'dog'//组件名}
</script><script lang="ts" setup>import {reactive, ref} from 'vue'import axios from 'axios';let border_collie=reactive([])let dog=reactive([])async function add_border_collie(){try{let result=await axios.get('https://dog.ceo/api/breed/collie/border/images/random')border_collie.push(result.data.message)} catch(error){alert(error)}}async function add_dog(){try{let result=await axios.get('https://dog.ceo/api/breeds/image/random')dog.push(result.data.message)} catch(error){alert(error)}}</script><style scoped>.style_test{background-color: rgb(208, 223, 40);box-shadow: 0 0 10px;border-radius:10px;  padding: 20px;}.sizee{height: 150px;margin-right: 10px;}
</style>

cc.vue

<template><h1>TTTi9er</h1>
</template><script lang="ts">export default {name : 'test'//组件名}
</script><style></style>

home.vue

<template><h1>Csy</h1>
</template><script lang="ts">export default {name : 'home'//组件名}
</script><style></style>

3.main.ts

这个文件是管理创建网页文件和挂载等的。我们需要在这里声明我们的路由器。

import './assets/main.css'import { createApp } from 'vue'
import App from './App.vue'import router from './router'//创建应用
const app = createApp(App)//使用路由器
app.use(router)
//挂载app
app.mount('#app')

如图,我们需要删掉原来的链式代码,讲createapp生成的对象独立出来,在上面使用路由器。这样,我们就使用了之前export暴露出来的路由器。

4.app.vue

最后一步,我们要在主页上展示出我们的路由。

<template><div class = "app"><h1 class="title">Vue路由</h1><!-- 导航 --><div class="guide"><RouterLink to="/home" active-class="active">首页</RouterLink><RouterLink to="/dog" active-class="active">狗狗</RouterLink><RouterLink to="/test" active-class="active">测试</RouterLink></div><!-- 展示 --><div class="content"><RouterView></RouterView></div> </div>
</template><script>
//路由器调用占位
import { RouterView } from 'vue-router';export default{name : 'app',    //组件名}</script><style>.title{text-align: center;word-spacing: 5px;margin: 30px 0;height: 70px;line-height: 70px;background-image: linear-gradient(45deg,gray,white);border-radius: 10px;box-shadow: 0 0 2px;font-size: 30px;}.guide{display: flex;justify-content: space-around;margin: 0 100px;}.guide a {display: block;text-align: center;width: 90px;height: 40px;line-height: 40px;border-radius: 10px;background-color: gray;text-decoration: none;color: white;font-size: 18px;letter-spacing: 5px;}.guide a.active{background-color: #64967E;color: #ffc268;font-weight: 900;text-shadow: 0 0 1px black;font-family: 微软雅黑;}.content{margin: 0 auto;margin-top: 30px;border-radius: 10px;width: 90%;height: 400px;border: 1px solid;}</style>

注释都写在代码上了,style是样式,抄一下就行,之后会专门写一篇来说怎么写htmlcss样式。html结构看不懂的话可以去看html标志大全链接,是配套这个博客的辅助工具。
此处重要的是我们要引入import { RouterView } from 'vue-router';用来占位来显示我们的页面。

5.自定义路由名

在创建路由器的时候,我们可以多配置一项name,我们可以依次为跳转标识。

至此,我们有三种方法可以跳转,字符串,name和path,以后多用后两种写法,他们更方便传参。

效果展示


点击后会切换网址。


我们可以看到,在点击了RouterLink标签的按钮之后,路径发生了变化,页面组件也发生了变化,这就是路由的一个基本流程。

注:点击切换网页后,路由组件挂载,切换走就卸载了,在使用生命周期函数的时候不要用错了。

二、路由模式

1.history模式

优势: URL美观,不带#,接近传统网站的URL
缺点:项目上线后,需要服务端配合处理路径问题,否则会有刷新404
写法

在文件开头引入

import { createWebHistory } from "vue-router";

在路由器创建中加入配置项

history:createWebHistory(),

2.hash模式

写法:

import { createWebHashHistory } from "vue-router";
history:createWebHushHistory(),

优点:兼容性好,不用服务器额外处理路径
缺点:不美观 ,SEO优化差

3.模式使用推荐

如果你要建立的是面向大众的,比如b站,建议使用history模式。
如果是做专用项目,或者自己留档的,无所谓是否要在搜索引擎上找到你的,建议使用hash模式,对个人开发者更友好,省事。后台管理项目也最好用hash,主打一个稳。
综上,除非你已经做大做强了,不然建议用hash模式。

三、嵌套路由

1.基本嵌套

有时候,一级路由下面还有路由,一个最简单的应用,一级路由让我新闻区,然后二级路由选择哪个新闻
我们需要在创建路由器的时候加入子路由配置。当然,与其他路由页一样,要先import,然后找到其父节点,写以下代码。

注意!子级路由前不需要加 /
结构中写法与以及路由一致。

to中的路径要精确到二级路由,不然Vue自动会去找一级路由,然后找不到,给你呈现一个空页面。

2.路由传参

1.query参数

a)基本写法


?就代表传参,参数与参数之间用&分隔,之后我们在detail中接收数据。

在detail中,我们先要引入路由组件并调用

接下来,我们就可以在结构中调用这些参数了。



以上方法只能传递静态参数,不能传递变量,我们可以用:的方式传递变量,注意请加$

b)对象快速写法


这就是上文说的方便传参。这样写就清晰得多了。
注意,如果你仔细看了上文的三种跳转方式,你就知道还可以用name跳转,如果用name跳转,即使是二级路由,也只需要一个name就可以跳转,非常方便,而且易懂

传递之后,为了方便,我们可以吧query参数结构出来

然后直接调用query.xx就可以了,但是,这样会丢失响应式(结构响应式数据不能继承响应式)。
我们加一个组件来解决这个问题。

这样就好了。

2.params参数

1.基本写法

这是路径传参,我们先要到index.ts,也就是创建路由器的地方,进行占位,如果不占位,Vue会认为这是路径,然后找不到而出错。

然后在路由切换处这么写就能传递参数

在使用处与query类似,也是要先引入useRoute,然后使用即可。

2.快捷写法


使用params只能使用name锁定路由组件,而且传递的参数不能式数组和对象。

总体来说,我个人还是推荐query

3.路由的props配置


如果你用的是params参数, 你可以使用props配置,使用后可以将路由收到的参数转化为一个一个props变量传给组件。
发送处没区别,在接受处要这么接收:

如果你用的是query,想要接收组件看上去干净点,你可以把工作量转移到路由器撞创建处:

按照如上方法可以给query配置props。

四、编程式导航(重要)脚本操作跳转

我们在上文已经学习了如何让用户点击路由,但是,我们又经常遇到需要程序自动跳转的需求(比如5秒自动跳转淘宝bushi),这就要用到编程式导航。
我们先导入useRouter

导入之后,我们直接操作最大的官——路由器了。

我们使用router.push可以直接实现push跳转,如果使用replace,就能实现无痕跳转。
push加上传参,可以按下面这么写,跟link几乎一样。


一个非常典型的需求是,判断用户账号等信息是否正确,如果正确,就跳转。

五、补充

1.replace属性


加入后用户不能使用来回退页面。

2.重定向


我们在路由规则中加入重定向,上面是原路径,下面是重定向路径,这样访问上面直接跳转下面。

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

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

相关文章

数据中台:企业数字化转型的驱动力量_光点科技

在当今数字化快速发展的时代&#xff0c;企业正积极寻求转型升级的新路径。在这个过程中&#xff0c;数据中台以其独特的功能和价值&#xff0c;逐渐成为了企业数字化转型的关键驱动力。本文将深入探讨数据中台的角色、架构及其在企业中的应用&#xff0c;以期为企业的数字化转…

[力扣题解]150. 逆波兰表达式求值

题目&#xff1a;150. 逆波兰表达式求值 思路 建一个栈&#xff0c;遍历算式&#xff0c;遇到数字塞进去&#xff0c;遇到算符&#xff0c;去除栈顶2个元素进行运算&#xff1b; 假设算式是9 3 -&#xff0c;栈里的顺序是9 3&#xff0c;&#xff08;栈顶在右&#xff09;&am…

01-基本概念- 索引,文档和 REST API

# kibana_sample_data_ecommerce 为es 索引#查看索引相关信息 GET kibana_sample_data_ecommerce#查看索引的文档总数 GET kibana_sample_data_ecommerce/_count#查看前10条文档&#xff0c;了解文档格式 POST kibana_sample_data_ecommerce/_search { }#_cat indices API #查看…

flask 模拟简单的登录功能(2)

通过设置 app.secret_key 进行用户登录验证 通过使用app.secret_key&#xff0c;可以对会话数据进行加密和解密&#xff0c;以确保会话数据的安全性。会话数据包括用户的登录状态、表单数据等敏感信息&#xff0c;通过设置 app.secret_key&#xff0c;可以防止会话被恶意篡改或…

论文查重率高,有什么办法降重吗?

现在大部分学校已经进入到论文查重降重的阶段了。如果查重率居高不下&#xff0c;延毕的威胁可能就在眼前。对于即将告别校园的学子们&#xff0c;这无疑是个噩梦。四年磨一剑&#xff0c;谁也不想在最后关头功亏一篑。 查重率过高&#xff0c;无非以下两种原因。要么是作为“…

CRM(客户关系管理系统)

商机流程 为什么选择简道云CRM&#xff1f; 行业痛点 很多客户有复杂的订单成本计算方式&#xff0c;复杂多变的审批流程&#xff0c;个性化/流程化的数据结构&#xff0c;没有自定义能力就很难满足。 解决方案 在CRM套件的基础上自定义编辑/搭建了适合公司业务的CRMERP 两…

PCIE协议-2-事务层规范

1.事务层概述 从高层次上看&#xff0c;事务层的关键方面包括&#xff1a; 一个流水线化的全分割事务协议用于区分事务层数据包&#xff08;TLPs&#xff09;的排序和处理要求的机制基于信用量的流控制可选支持数据中毒和端到端数据完整性检测 事务层包含以下内容&#xff1…

dummy_worker C++ 预占用部分比例cpu资源,人为创造cpu资源紧张

背景 有时候为了C测试程序在cpu资源紧张情况下是否正常&#xff0c;需要人为创造cpu资源紧张 编译方法 g -o dummp_worker dummp_worker.cpp -stdc11 -pthread 使用方法 ./dummp_worker 4 0.2 占用4个cpu核的20%比例的cpu资源 源码 // dummp_worker.cpp #include <c…

Axure RP 9:卓越的交互式产品原型设计工具

Axure RP 9&#xff0c;作为一款备受欢迎的交互式产品原型设计工具&#xff0c;已经在全球范围内赢得了众多设计师和开发者的青睐。这款软件凭借其强大的功能和出色的用户体验&#xff0c;成为了产品原型设计领域的佼佼者。 Axure RP 9支持Mac和Windows两大操作系统&#xff0…

Java并发编程:面经总结

1、描述Synchronized和reentrantlock的底层实现和重入的底层原理 2、描述锁的四种状态和升级过程 3、CAS是什么及ABA问题如何解决 4、请谈一下AQS&#xff0c;为什么AQS的底层是CAS volatile 5、DCL单例为什么要加volatile 6、聊聊你对as-if-serial和happens-before语义的…

Ubuntu22安装docker

安装步骤 1. 更新软件包索引 首先&#xff0c;打开终端并更新你的软件包列表以确保访问到最新的软件包版本&#xff1a; sudo apt-get update 2. 安装必要的依赖项 安装几个必需的软件包&#xff0c;这些软件包让apt能够通过HTTPS使用仓库&#xff1a; bash sudo apt-ge…

茅台申购,多平台签到与通知 | 使用极空间NAS部署一个神级脚本『DailyCheckIn』

茅台申购&#xff0c;多平台签到与通知 | 使用极空间NAS部署一个神级脚本『DailyCheckIn』 哈喽小伙伴们好&#xff0c;我是Stark-C~&#xff0c;今天为大家分享一个极空间上非常实用且好玩的项目。 小伙伴们都知道&#xff0c;目前很多平台为了促进用户的活跃度和黏性&#…

LeetCode--所有质数、质数对

1.0 Q: 输出 100 以内所有质数 1.1 /* 第一层循环控制检查到哪个数* 第二层通过遍历除以每个比他小的数的方式,检查每个数是不是质数* 由于要遍历检查,设置一个标记,只要任意一次循环可以整除,我们就设置该标记为不是质数 */boolean isPrime true;for (int i 2; i < 100…

如何彻底将CAD或者Cadence卸载干净

最近因为升级软件需要先彻底删除这两个软件&#xff0c;发现无论如何都不能卸载干净&#xff0c;于是乎找到这样一个软件帮助卸载或查找剩余的软件残留&#xff1a; 官网&#xff1a;https://geekuninstaller.com 支持软件和 UWP 应用的卸载&#xff0c;查看软件注册表和安装目…

[leetcode] 68. 文本左右对齐

文章目录 题目描述解题方法贪心java代码复杂度分析 题目描述 给定一个单词数组 words 和一个长度 maxWidth &#xff0c;重新排版单词&#xff0c;使其成为每行恰好有 maxWidth 个字符&#xff0c;且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词&#xff…

Unity 状态机

文章目录 前言一、状态机二、应用1、场景切换2、人物行为切换3、宝箱、机关切换4、AI 三、人物行为总结 前言 提到Unity状态机&#xff0c;接触不久的开发者会想到Unity的动画状态机&#xff0c;而对于老油条来说&#xff0c;可能会回忆起自己实现的动画状态机。当然&#xff…

The 2024 International Collegiate Programming Contest in Hubei Province, China

目录 H. Genshin Impact Startup Forbidden III K. Points on the Number Axis B 估计还会补D&#xff0c;I H. Genshin Impact Startup Forbidden III 对于一个有鱼的池塘&#xff0c;有周围与自己本身五个关键位置可以捕获当前位位置的鱼。把这些位置存储到 map中。用四进制…

深入理解京东商品搜索API(jd.item_search)返回值结构

京东商品搜索API&#xff08;jd.item_search&#xff09;的返回值结构通常是一个复杂的JSON对象&#xff0c;它包含了关于搜索结果的详细信息。为了深入理解这个返回值结构&#xff0c;我们可以将其大致分解为几个主要部分。 status: code: 响应状态码&#xff0c;通常200表示成…

数据治理实施方案大纲

一、引言 背景介绍 阐述数据治理的重要性和必要性回顾公司或组织在数据管理方面的发展历程指出当前数据管理面临的挑战和机遇 目标和愿景 明确数据治理的总体目标和愿景设定短期和长期的数据治理目标 范围和限制 定义数据治理项目的范围和边界识别可能影响项目成功的限制因素 …

新品 | 功率放大器高压放大测试器HAP-4001

400V功率放大器是一台非常实用的讯号放大器&#xff0c;它具有体积小、重量轻及操作方便&#xff0c;较高的电压输出(400Vp-p)以及较大的输出电流&#xff08;2.8Ap-p&#xff09;等优点。 HAP-4001连续输出直流电流量最大值达到0.5 A&#xff0c;电压放大增益40倍&#xff0c…