【vue2】对路由的理解

2023-2-20    蓝蓝设计的小编

目录

 一、vue路由概念

1.概念:

2.初体验:

二、路由基础

1.路由模式        

2.路由写法

总结手动自动配置区别:

三、路由重定向与二级路

1.路由重定向

2.二级路由

 四、路由跳转传参

1.声明式导航:

2.编程式导航


 一、vue路由概念

1.概念:

确保我们在vue中实现页面跳转到我们所想的页面

2.初体验:

88f51af6257443c5aeb88fa4b47a805a.gif

 可以看到当我们点击不同的组件的时候我们实现了路由的功能:在vue中实现页面的跳转

注意看,当我点击的时候上面地址栏中加载了不同的网页。下面我们来学习下路由的写法

二、路由基础

1.路由模式

路由两种模式

路由书写写法:

在index.js中的router对象中书写


  1. const router = new VueRouter({
  2. mode: 'history',//默认是hash模式
  3. })

hash模式:

路由例如: http://localhost:8080/#/home

history模式:

路由例如: http://localhost:8080/home


两种模式的区别:

  1. 外观:hash的url有个#符号,history没有,history外观更好看。
  2. 刷新:hash刷新会加载到地址栏对应的页面,history刷新浏览器会重新发起请求,如果服务端没有匹配当前的url,就会出现404页面。
  3. history模式以后上线需要服务器端支持, 否则找的是文件夹

 2.路由写法

 起步 | Vue RouterVue Router3官网介绍: 起步 | Vue Router

①手动配置(较少使用)

  1. 下载与导入vue-router
  2. 导入组件
  3. 创建routes路由规则(路径和页面一一对应)
  4. 创建路由对象
  5. 把路由对象挂载到App.vue
  6. 在页面写路由导航router-link (生成a标签)
  7. 在页面写路由出口router-view (生成占位盒子,用于显示页面内容)

下面开始我们相关文件的创建

1.创建我们的脚手架(此时没有选择Router):

1d386e264033404e9d2e678b516ac38f.png

 2.准备我们的App.vue文件:


  1. <template>
  2. <div>
  3. <!-- 顶部导航栏 -->
  4. <div class="footer_wrap">
  5. <a href="#/find">发现音乐</a>
  6. <a href="#/my">我的音乐</a>
  7. <a href="#/friend">朋友</a>
  8. </div>
  9. <!-- 下面内容 -->
  10. <div class="top"></div>
  11. </div>
  12. </template>
  13. <script>
  14. export default {
  15. methods: {}
  16. }
  17. </script>
  18. <style scoped>
  19. body,
  20. html {
  21. margin: 0;
  22. padding: 0;
  23. }
  24. .footer_wrap {
  25. position: fixed;
  26. left: 0;
  27. top: 0;
  28. display: flex;
  29. width: 100%;
  30. text-align: center;
  31. background-color: #333;
  32. color: #ccc;
  33. }
  34. .footer_wrap a,
  35. span {
  36. cursor: pointer;
  37. flex: 1;
  38. text-decoration: none;
  39. padding: 20px 0;
  40. line-height: 20px;
  41. background-color: #333;
  42. color: #ccc;
  43. border: 1px solid black;
  44. }
  45. .footer_wrap a:hover,
  46. span:hover {
  47. background-color: #555;
  48. }
  49. .top {
  50. padding-top: 62px;
  51. }
  52. .footer_wrap .router-link-active {
  53. background-color: #000;
  54. }
  55. </style>

3.在src下面新建views文件夹并创建我们需要的.vue文件

88e582b6196e48c0a1c697bfc26d9869.png

3.1 find.vue


  1. <template>
  2. <div>
  3. <div class="nav_main">
  4. <router-link to="/Ranking">排行</router-link>
  5. <router-link to="/Recommend">推荐</router-link>
  6. <router-link to="/SongList">歌单</router-link>
  7. </div>
  8. <div style="1px solid red;">
  9. <router-view></router-view>
  10. </div>
  11. </div>
  12. </template>
  13. <script>
  14. export default {
  15. name: 'find',
  16. }
  17. </script>
  18. <style scoped>
  19. .nav_main {
  20. background-color: red;
  21. color: white;
  22. padding: 10px 0;
  23. }
  24. .nav_main a {
  25. text-align: center;
  26. text-decoration: none;
  27. color: white;
  28. font-size: 12px;
  29. margin: 7px 17px 0;
  30. padding: 0px 15px 2px 15px;
  31. height: 20px;
  32. display: inline-block;
  33. line-height: 20px;
  34. border-radius: 20px;
  35. }
  36. .nav_main a:hover {
  37. background-color: brown;
  38. }
  39. .nav_main .router-link-active{
  40. background-color: brown;
  41. }
  42. </style>

 3.2 my.vue


  1. <template>
  2. <div>
  3. <img src="../assets/my.png" alt="" width="100%">
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. name: 'my',
  9. };
  10. </script>
  11. <style scoped>
  12. </style>

3.3 friend.vue


  1. <template>
  2. <div>
  3. <ul>
  4. <li>这是当前页面 query 接收到的参数:
  5. <span>姓名:{{ $route.query.name }}</span> --
  6. <span>年龄:{{$route.query.age}}</span>
  7. </li>
  8. <li>这是当前页面 params 接收到的参数:
  9. <!-- <span>姓名:{{ $route.params.name }}</span> --
  10. <span>年龄:{{ $route.params.age }}</span> -->
  11. </li>
  12. </ul>
  13. </div>
  14. </template>
  15. <script>
  16. export default {
  17. name: 'friend',
  18. };
  19. </script>
  20. <style scoped>
  21. </style>

3.4 notfound.vue


  1. <template>
  2. <div class="box">
  3. <h1>这是一个 404 页面</h1>
  4. <img src="../assets/404.png" alt="">
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'notfound',
  10. data() {
  11. return {
  12. };
  13. },
  14. };
  15. </script>
  16. <style scoped>
  17. .box {
  18. display: flex;
  19. flex-direction: column;
  20. justify-content: center;
  21. align-items: center;
  22. }
  23. </style>

 4.准备图片素材(所有素材可私信博主获取)

3febf3f9755241a3b8bafccedb0f646e.gif

 5.所有准备工作做完现在开始我们的文件配置

 1.下载与导入vue-router

  • npm i vue-router@3.6.5

  • 导入vue-router (在main.js中)


  1. //main.js中导入
  2. // 0.导入路由
  3. import VueRouter from 'vue-router'
  4. // 使用vue的插件,都需要调用Vue.use()
  5. Vue.use(VueRouter)

2.导入组件

@符号代表 /src 文件夹的绝对路径,在脚手架中文件比较多的时候,使用这个@符号会更加的方便

 在main.js中导入


  1. // 导入组件
  2. import find from '@/views/find.vue'
  3. import friend from '@/views/friend.vue'
  4. import my from '@/views/my.vue'
  5. import notfound from '@/views/notfound.vue'

3.创建路由规则

路由规则作用: 设置 url 和 组件 对应的规则

 在main.js中写入


  1. // 路由规则
  2. const routes = [
  3. { path: '/find', component: find },
  4. { path: '/friend', name: 'friend', component: friend },
  5. { path: '/my', component: my },
  6. { path: '/notfound', component: notfound },
  7. ]

4.创建路由对象

路由对象: 帮你管理这些路由规则

 在main.js中写入


  1. // 创建路由对象
  2. const router = new VueRouter({
  3. routes// (缩写) 相当于 routes: routes
  4. })

 5.挂载路由到根组件

挂载到根组件作用:让你的整个应用都有路由功能

 在main.js中写入


  1. // 挂载路由到根组件
  2. new Vue({
  3. router,
  4. render: h => h(App)
  5. }).$mount('#app')

6.在页面写路由导航router-link

作用与a标签一样实现跳转,好处:当点击链接的时候自带一个专属类名 

在App.vue中我们将传统的a标签进行替换:

4970109a68ec4481b7b4ce6d015fb05e.png

替换a标签原因:便于我们做专属效果 

 我们选中点击的超链接做触发效果:

457bf5ab19d14e1196aae8ebe7fbb272.png

 7在页面写路由出口router-view

占位盒子,用于渲染路由匹配到的组件

(<router-view> : 是vue内置的一个组件,会自动替换成路由匹配的组件 )

0487e6a9e90f47259742157cc9bf927f.png

好了一个最最最基本的路由就被我们制作完成啦!下面我们来看看效果:

b90436a4b4b043e0972a686ec5d6c7b9.gif

上述的操作有些许麻烦,下面我们来使用我们开发中常用的自动配置方法

②自动配置(推荐使用)

创建脚手架方式与手动配置类似,唯一不同是此处必须选择Router

8da9a6240ba34b7d8231d7e3d1329023.png

对比手动模式:

b4e1986802914f9682f82f40bd819859.png

 此刻:脚手架已经帮我们创建好了Router路由不需要我们下载与导入vue-router了

只需要写:

  1. 导入组件
  2. 配置路由规则
  3. 路由导航
  4. 路由出口

并且为了进一步的封装我们的配置信息,我们的配置代码将写在router/index.js下,不再是全部写在main.js下。

1.导入组件(index.js中)


  1. import find from '@/views/find.vue'
  2. import friend from '@/views/friend.vue'
  3. import my from '@/views/my.vue'
  4. import notfound from '@/views/notfound.vue'

2.配置路由规则(index.js中)


  1. { path: '/find', component: find },
  2. { path: '/friend', name: 'friend', component: friend },
  3. { path: '/my', component: my },
  4. { path: '/notfound', component: notfound }

 3.路由导航(直接cv我们之前的App.vue文件)


  1.       <router-link to="/find">发现音乐</router-link>
  2.       <router-link to="/my">我的音乐</router-link>
  3.       <router-link to="/friend">朋友</router-link>

 4.路由出口(App.vue中


  1. <div class="top">
  2. <router-view></router-view>
  3. </div>

效果查看:

a0b3530b690c4a9ca6249c14b002d6b0.gif


总结手动自动配置区别:

自动配置省去了一些固定不变的操作,我们不需要写繁琐且固定的代码,只需要写不同的代码。且代码书写的位置都给我们设置好了,我们直接遵守该规范书写代码即可


三、路由重定向与二级路由

1.路由重定向

路由重定向官方文档:重定向和别名 | Vue Router

  • 重定向应用场景: 页面输入根路径/ , 自动跳转到首页

  • 注意点 : 重定向只是修改路径, 还需要单独去设置路由匹配规则

重定向命令:


  1. {
  2. path: '/',
  3. /*
  4. (1)重定向只是修改页面路径。 输入 / 会重定向到 /路径
  5. (2)只有component才会让vue去寻找路由匹配页面。所以设置了重定向,还需要单独设置匹配规则
  6. */
  7. redirect: "路径"
  8. },

1. 就拿我们刚才创建的举例:

bef58f0f03f0422bad9ff7ff552333ca.png

 实现效果:当我在浏览器中打开的时候我没有输入任何路径,vue自动帮我们跳转到了 my.vue这个页面组件

fc6d192e015f4d028f6d8e601a9ab2a1.png

 2.也可以利用重定向来设置当我们路径错误提示404页面:

ec7212bfaf874c898e43147ff21dcb43.png

实现效果:当我任意输入没有匹配的路径,自动帮我们跳转到了notfound.vue这个组件

4544b2c521bc475998d8f3220f43f714.gif

2.二级路由

实现页面中存在第二级的跳转

写法(拿我们上述的案例实操,需要素材可私信博主喔):

①在index.js中引入


  1. // 导入二级路由
  2. import Ranking from '@/views/second/Ranking.vue'
  3. import Recommend from '@/views/second/Recommend.vue'
  4. import SongList from '@/views/second/SongList.vue'

②在需要引用的组件中使用:


  1. //格式:
  2. {
  3. path: '路径', component: 组件名, children: [
  4. //此处填写二级路由的路径信息
  5. ]
  6. }

  1. {
  2. path: '/find', component: find, children: [
  3. {path:'/',redirect:'/SongList'},
  4. { path: '/Ranking', component: Ranking },
  5. { path: '/Recommend', component: Recommend },
  6. { path: '/SongList', component: SongList }
  7. ]
  8. }

③写路由导航与出口

bde6628a95f54fb2b73ef7ea54cb05f3.png

 查看效果:

fae7f2b60cab46599c9d7a4b142de98a.gif

 可以看到:当我们点击一级路由之后,我们还可以点击二级路由到我们的专属页面中


 四、路由跳转传参

有两种跳转传参方式:

  • 声明式导航
  • 编程式导航

1.声明式导航:

①query写法:

在路径中加参数信息即可

      <router-link to="/路径?参数名=参数值&参数名=参数值</router-link>

接收信息:

在触发的组件中书写{{ $route.query.属性名}}接收

 举个例子:

026595d1cedd4c02ab86a4f99188edd8.png

②params写法:

在index.jsx文件中写:参数名。在需要传递的路由路径中写参数值

47aaff039df84bc990dd7f3f2ad9b74b.png

接收信息:

在触发的组件中书写{{ $route.params.属性名}}接收

 6da470911546454488c229af441d7d78.png

 实现效果:

c2acf124d4cf44fb96dbc98e71d804c1.png


2.编程式导航

①query写法:

结构:


  1. this.$router.push({
  2. path: '/路径',
  3. query: { 属性名: '属性值'}
  4. })

接收信息:

在触发的组件中书写{{ $route.query.属性名}}接收

举个例子:

c55bce2fbbaf4910812fa99a15ef760b.png

 ②params写法

结构:


  1. this.$router.push({
  2. name: '我们注册路径的组件名',//写path获取不到值!!!
  3. query: { 属性名: '属性值'}
  4. })

 注意点:写path获取不到值,需要用name

接收信息:

在触发的组件中书写{{ $route.params.属性名}}接收

5fa2f0cd7c87446aadd377efaabe0784.png



蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请加蓝小助,微信号:ben_lanlan,报下信息,蓝小助会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系01063334945。


分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。


蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务UI设计公司、界面设计公司、UI设计服务公司、数据可视化设计公司、UI交互设计公司、高端网站设计公司、UI咨询、用户体验公司、软件界面设计公司

日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档