ToB企服应用市场:ToB评测及商务社交产业平台

标题: 一文彻底学会Vue3路由:全面讲解路由流程、路由模式、传参等——全栈开辟之 [打印本页]

作者: 美丽的神话    时间: 2024-6-29 22:46
标题: 一文彻底学会Vue3路由:全面讲解路由流程、路由模式、传参等——全栈开辟之
全栈开辟一条龙——前端篇
第一篇:框架确定、ide设置与项目创建
第二篇:先容项目文件意义、组件结构与导入以及setup的引入。
第三篇:setup语法,设置响应式数据。
第四篇:数据绑定、盘算属性和watch监视
第五篇 : 组件间通信及知识补充
第六篇:生命周期和自定义hooks
本文将带你从头到尾将Vue3中的路由学透,学完之后所有的跳转需求都可以实现。


  

路由

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

雷同这种,左边导航,右边展示,全程画面不抖动,不跳转。
点击导航,路径(网址)发生变化,路由器捕获,卸载当前组件,挂载新的组件,这些组件都是一个一个Vue文件写的页面。
一、路由底子实践——流程梳理

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

我们在router中创建index.ts,这个文件的意义在于创建一个路由器,并将之暴露出来。
  1. import { createRouter } from "vue-router"
  2. import home from "@/components/home.vue";
  3. import dog from "@/components/dog.vue";
  4. import cc from "@/components/cc.vue";
  5. //创建路由器
  6. const router = createRouter({
  7.     //管理路由
  8.      routes:[  //一个一个的路由规则
  9.        {
  10.          //路径
  11.           path:'/home',
  12.         //组件绑定
  13.           component:home
  14.        },
  15.        {
  16.         //路径
  17.          path:'/dog',
  18.        //组件绑定
  19.          component:dog
  20.       },
  21.       {
  22.         //路径
  23.          path:'/test',
  24.        //组件绑定
  25.          component:cc
  26.       }
  27.      ]
  28. })
  29. export default router
复制代码
请细致检察写在代码旁的解释,这里做一个大致阐明,这个地方是要举行一个路由的绑定,我们先在src/components中新建三个文件,这三个文件就是之后我们可以用来切换的页面Vue文件

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

如果碰到这个问题,是由于你没有设置路由模式(这个在本文后面会讲)
你要引入设置路由模式的组件
  1. //引入路由器模式
  2. import { createWebHistory } from "vue-router";
复制代码
然后在const中加入 history:createWebHistory(),


这样报错就消失了。
2.三个页面组件的vue

我们绑定完成之后,必须要在相应组件中加入内容,不然会报错。我们测试的时候可以随便写,我以下给出三个样例,你可以直接复制。
dog.vue:
  1. <template>
  2.     <div class = "style_test">   
  3.         <button @click="add_border_collie">添加一只边牧!</button>   
  4.     <hr>
  5.    <img v-for="(bc,index) in border_collie" :src="bc" :key="index" class="sizee">
  6.    </div>
  7.    <div class = "style_test">   
  8.     <button @click="add_dog">随机添加一只狗</button>   
  9.     <hr>
  10.    <img v-for="(bc,index) in dog" :src="bc" :key="index" class="sizee">
  11.    
  12.    </div>
  13. </template>
  14. <script lang="ts">
  15.     export default {
  16.         name : 'dog'//组件名
  17.     }
  18. </script>
  19. <script lang="ts" setup>
  20.      import {reactive, ref} from 'vue'
  21.      import axios from 'axios';
  22.      let border_collie=reactive([])
  23.      let dog=reactive([])
  24.      async function add_border_collie(){
  25.         try{
  26.        let result=await axios.get('https://dog.ceo/api/breed/collie/border/images/random')
  27.        border_collie.push(result.data.message)
  28.           } catch(error){alert(error)}
  29.             
  30.     }
  31.     async function add_dog(){
  32.         try{
  33.        let result=await axios.get('https://dog.ceo/api/breeds/image/random')
  34.        dog.push(result.data.message)
  35.           } catch(error){alert(error)}
  36.             
  37.     }
  38.      
  39. </script>
  40. <style scoped>
  41.   .style_test{
  42.        background-color: rgb(208, 223, 40);
  43.        box-shadow: 0 0 10px;
  44.        border-radius:10px;  
  45.        padding: 20px;
  46.   }
  47.   .sizee{
  48.       height: 150px;
  49.       margin-right: 10px;
  50.   }
  51. </style>
复制代码
cc.vue
  1. <template>
  2.     <h1>TTTi9er</h1>
  3. </template>
  4. <script lang="ts">
  5.     export default {
  6.         name : 'test'//组件名
  7.     }
  8. </script>
  9. <style>
  10. </style>
复制代码
home.vue
  1. <template>
  2.     <h1>Csy</h1>
  3. </template>
  4. <script lang="ts">
  5.     export default {
  6.         name : 'home'//组件名
  7.     }
  8. </script>
  9. <style>
  10. </style>
复制代码
3.main.ts

这个文件是管理创建网页文件和挂载等的。我们必要在这里声明我们的路由器。
  1. import './assets/main.css'
  2. import { createApp } from 'vue'
  3. import App from './App.vue'
  4. import router from './router'
  5. //创建应用
  6. const app = createApp(App)
  7. //使用路由器
  8. app.use(router)
  9. //挂载app
  10. app.mount('#app')
复制代码
如图,我们必要删掉原来的链式代码,讲createapp天生的对象独立出来,在上面使用路由器。这样,我们就使用了之前export暴露出来的路由器。
4.app.vue

末了一步,我们要在主页上展示出我们的路由。
  1. <template>
  2.     <div class = "app">
  3.      <h1 class="title">Vue路由</h1>
  4.      <!-- 导航 -->
  5.      <div class="guide">
  6.       <RouterLink to="/home" active-class="active">首页</RouterLink>
  7.       <RouterLink to="/dog" active-class="active">狗狗</RouterLink>
  8.       <RouterLink to="/test" active-class="active">测试</RouterLink>
  9.     </div>
  10.     <!-- 展示 -->
  11.       <div class="content">
  12.         <RouterView></RouterView>
  13.       </div>
  14.   </div>
  15. </template>
  16. <script>
  17. //路由器调用占位
  18. import { RouterView } from 'vue-router';
  19.   export default{
  20.     name : 'app',    //组件名
  21.   }
  22. </script>
  23. <style>
  24.      .title{
  25.         text-align: center;
  26.         word-spacing: 5px;
  27.         margin: 30px 0;
  28.         height: 70px;
  29.         line-height: 70px;
  30.         background-image: linear-gradient(45deg,gray,white);
  31.         border-radius: 10px;
  32.         box-shadow: 0 0 2px;
  33.         font-size: 30px;
  34.      }
  35.      
  36.      .guide{
  37.         display: flex;
  38.         justify-content: space-around;
  39.         margin: 0 100px;
  40.      }
  41.     .guide a {
  42.          display: block;
  43.          text-align: center;
  44.          width: 90px;
  45.          height: 40px;
  46.          line-height: 40px;
  47.          border-radius: 10px;
  48.          background-color: gray;
  49.          text-decoration: none;
  50.          color: white;
  51.          font-size: 18px;
  52.          letter-spacing: 5px;
  53.     }
  54.     .guide a.active{
  55.       background-color: #64967E;
  56.       color: #ffc268;
  57.       font-weight: 900;
  58.       text-shadow: 0 0 1px black;
  59.       font-family: 微软雅黑;
  60.     }
  61.     .content{
  62.        margin: 0 auto;
  63.        margin-top: 30px;
  64.        border-radius: 10px;
  65.        width: 90%;
  66.        height: 400px;
  67.        border: 1px solid;
  68.     }
  69.      
  70. </style>
复制代码
解释都写在代码上了,style是样式,抄一下就行,之后会专门写一篇来说怎么写htmlcss样式。html结构看不懂的话可以去看html标记大全链接,是配套这个博客的辅助工具。
此处重要的是我们要引入import { RouterView } from 'vue-router';用来占位来显示我们的页面。
5.自定义路由名

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

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

效果展示


点击后会切换网址。


我们可以看到,在点击了RouterLink标签的按钮之后,路径发生了变化,页面组件也发生了变化,这就是路由的一个基本流程。
注:点击切换网页后,路由组件挂载,切换走就卸载了,在使用生命周期函数的时候不要用错了。
二、路由模式

1.history模式

优势: URL美观,不带#,靠近传统网站的URL
缺点:项目上线后,必要服务端共同处理路径问题,否则会有刷新404
写法
在文件开头引入
  1. import { createWebHistory } from "vue-router";
复制代码
在路由器创建中加入设置项
  1. history:createWebHistory(),
复制代码
2.hash模式

写法:
  1. import { createWebHashHistory } from "vue-router";
  2. 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.重定向


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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4