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

news2024/9/21 0:45:16

全栈开发一条龙——前端篇
第一篇:框架确定、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.coloradmin.cn/o/1923447.html

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

相关文章

pytorch-pytorch之LSTM

目录 1. nn.LSTM2. nn.LSTMCell 1. nn.LSTM 初始化函数输入参数与RNN相同&#xff0c;分别是input_size&#xff0c;hidden_size和num_layer foward函数也与RNN类似&#xff0c;只不过返回值除了out外&#xff0c;ht变为(ht,ct) 代码见下图&#xff1a; 2. nn.LSTMCell 初…

SQL优化-索引

什么是索引&#xff1f; 索引&#xff08; index &#xff09;是帮助 MySQL 高效获取数据的数据结构 ( 有序 ) 。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c; 这…

这是我见过最棒的大模型干货!!!

大模型技术的发展和迭代2024年已经可以按天来计算了&#xff0c;几乎每天都有新的大模型和技术登场。 从基座模型Mamba2&#xff0c;Jamaba&#xff0c;到Dora&#xff0c;LoftQ&#xff0c;GaLore等最新的微调技术&#xff1b;KTO&#xff0c;IPO&#xff0c;SimPO等微调技术…

STM32实战篇:按键(外部输入信号)触发中断

功能要求 将两个按键分别与引脚PA0、PA1相连接&#xff0c;通过按键按下&#xff0c;能够触发中断响应程序&#xff08;不需明确功能&#xff09;。 代码流程如下&#xff1a; 实现代码 #include "stm32f10x.h" // Device headerint main() {//开…

ZGC的流程图

GC标记过程 1、初始标记 扫描所有线程栈的根节点&#xff0c;然后再扫描根节点直接引用的对象并进行标记。这个阶段需要停顿所有的应用线程&#xff08;STW&#xff09;&#xff0c;但由于只扫描根对象直接引用的对象&#xff0c;所以停顿时间很短。停顿时间高度依赖根节点的数…

鸿蒙HarmonyOS应用开发为何选择ArkTS不是Java?

前言 随着智能设备的快速发展&#xff0c;操作系统的需求也变得越来越多样化。为了满足不同设备的需求&#xff0c;华为推出了鸿蒙HarmonyOS。 与传统的操作系统不同&#xff0c;HarmonyOS采用了一种新的开发语言——ArkTS。 但是&#xff0c;刚推出鸿蒙系统的时候&#xff0…

uni-app 保存号码到通讯录

1、 添加模块 2、添加权限 3、添加策略 Android&#xff1a; "permissionExternalStorage" : {"request" : "none","prompt" : "应用保存运行状态等信息&#xff0c;需要获取读写手机存储&#xff08;系统提示为访问设备上的照片…

Prometheus + alermanager + webhook-dingtalk 告警

添加钉钉机器人 1. 部署 alermanager 1.1 下载软件包 wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz 网址 &#xff1a;Releases prometheus/alertmanager (github.com) 1.2 解压软件包 mkdir -pv …

用 Kotlin 编写四则运算计算器:从零开始的简单教程

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

电-气阀门定位器YT-1000系列产品说明

电-气阀门定位器YT-1000系列 使用注意事项 • 搬运安装或使用中对产品过大的震动或撞击会成为产品故障的原因。 • 超过规定参数范围使用也会成为产品故陷的原因。 • 不使用的气路接口要用堵塞堵住。 • 不使用产品而长时间放悝在室外时,要盖上产品外壳以免雨水进入产品…

八款主流电脑监控软件推荐|2024年最佳电脑监控软件排行榜

在现代社会中&#xff0c;电脑监控软件已经成为企业和家庭不可或缺的工具。无论是为了确保员工的工作效率&#xff0c;还是保护孩子在互联网上的安全&#xff0c;这些软件都能提供有力的支持。本文将为大家介绍2024年最受欢迎的八款电脑监控软件。 1. 固信软件 固信软件是一款综…

服务重启时容器未自动启动

1、容器重启策略 通过设置容器的重启策略&#xff0c;‌可以决定在容器退出时Docker守护进程是否重启该容器。‌常见的重启策略包括&#xff1a;‌ no&#xff1a;‌不重启容器&#xff0c;‌默认策略。‌always&#xff1a;‌无论容器是如何退出的&#xff0c;‌总是重启容器…

2024年公共文化与社会服务国际会议(ICPCSS 2024)

2024年公共文化与社会服务国际会议 2024 International Conference on Public Culture and Social Services 【1】会议简介 2024年公共文化与社会服务国际会议是一个集学术性、实践性和国际性于一体的盛会。我们期待与您共同探讨公共文化与社会服务的未来发展方向&#xff0c;为…

【公益案例展】华为云X《无尽攀登》——攀登不停,向上而行

‍ 华为云公益案例 本项目案例由华为云投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2024中国数据智能产业最具社会责任感企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 夏伯渝&#xff0c;中国无腿登珠峰第一人&#xff0c;一生43年…

基于GIS矿产勘查靶区优选技术

定义&#xff1a; 找矿远景区(ore-finding prospect)&#xff1a; 一般将中小比例尺&#xff08;小于等于1&#xff1a;10万&#xff09;成矿预测所圈定的找矿有利地段&#xff08;preferable ore-finding area&#xff09;成为找矿远景区 找矿靶区&#xff08;ore-finding t…

IPD流程学习笔记

一、前言 互联网行业讲究的是快速试错&#xff0c;所以IPD流程的应用并不多&#xff0c;但是传统企业数字化转型中&#xff0c;怎么确保项目投入可以切合市场需求&#xff0c;有较好的ROI及落地性&#xff0c;轻量级的IPD还是很有必要了解下的&#xff0c;特别是重资产类的业务…

LAMP万字详解(概念、构建步骤)

目录 LAMP Apache 起源 主要特点 软件版本 编译安装httpd服务器 编译安装的优点 操作步骤 准备工作 编译 安装 优化执行路径 添加服务 守护进程 配置httpd 查看 Web 站点的访问情况 虚拟主机 类型 部署基于域名的虚拟主机 为虚拟主机提供域名解析&#xff…

原料药合成偶联反应中钯残留去除

摘要&#xff1a;海普开发的HP214 是一种具有螯合硫脲基团的大孔树脂&#xff0c;专为选择性去除汞、铂族贵金属、金和银而设计。同时还特别适用于从有机工艺流程中回收钯催化剂。 #原料药合成偶联反应中钯残留去除 在有机合成中&#xff0c;以过渡金属络合物催化进行高选择性…

博士论文 | 神经网络的结构与表示 147页

由于神经网络在人工智能领域占据主导地位&#xff0c;一个试图了解其内部工作原理的研究分支领域应运而生。这个子领域的一个标准方法是将神经网络主要理解为代表人类可理解的特征。另一种探索较少的可能性是将它们理解为多步骤的计算机程序。这样做的一个先决条件似乎是某种形…

中霖教育:税务师和中级会计师哪个难?

税务师和中级会计师是财会专业的两个比较常见的证书&#xff0c;二者之间哪个更难? 税务师考试包含五个不同的科目&#xff1a;包括《税法一》、《税法二》、《涉税服务实务》、《涉税服务相关法律》以及《财务与会计》&#xff0c;考生在连续五个年度内通过即可。 中级会计…