一、路由的概要

1.1、什么是路由?

  • 路由就是一组映射关系,根据不同的 url 地址展示不同的内容或页面(key-value);

    • key为路径,value可能是function或component

  • 路由 ( 英文: router ) 就是对应关系

    • 通俗易懂的概念:Hash 地址与组件之间的对应关系
  • SPA与前端路由

    • SPA指的是一个web 网站只有唯一的一个HTML页面所有组件的展示与切换都在这唯一的一个页面内完成。

    • 此时,不同组件之间的切换需要通过前端路由来实现

1.2、SPA应用:

  • 单页Web应用(single page web application,SPA)

  • 整个应用只有一个完整的页面

  • 点击页面中的导航链接不会刷新页面,只会在页面局部更新

  • 数据需要通过ajax请求获取

1.3、路由的分类

1.3.1、后端路由

理解: value是function,用于处理客户提交的请求

工作过程: 浏览器在地址栏切换url时,会向服务器发送请求,服务器响应后,会根据请求路径找到匹配的函数来处理请求,返回响应数据(页面)。

优点: 分担了前端的压力,html和数据的拼接都是由服务器完成。

缺点: 浏览器会刷新页面,且前后端不分离,当项目十分庞大时,加大了服务器端的压力,同时在浏览器端不能输入制定的url路径进行指定模块的访问。另外一个就是如果当前网速过慢,那将会延迟页面的加载,对用户体验不是很友好。

1.3.2、前端路由

理解: value是component,用于展示页面内容

工作过程: 当浏览器的路径改变时,对应的组件就会显示

优点:

  • 用户体验好,和后台网速没有关系,不需要每次都从服务器全部获取,快速展现给用户

  • 可以再浏览器中输入指定想要访问的url路径地址

  • 实现了前后端的分离,方便开发。有很多框架都带有路由功能模块。

缺点:

  • 使用浏览器的前进,后退键的时候会重新发送请求,没有合理地利用缓存

  • 单页面无法记住之前滚动的位置,无法在前进、后退的时候记住滚动的位置

路由操作:

  • ① 用户点击了页面上的路由链接

  • ② 导致了 URL 地址栏中的 Hash 值发生了变化

  • ③ 前端路由监听了到 Hash 地址的变化

  • ④ 前端路由把当前 Hash 地址对应的组件渲染都浏览器中

结论:前端路由,指的是 Hash 地址与组件之间的对应关系

1.4、vue-router 使用方法:

1.4.1、基本路由:

1.安装vue-router,执行命令:npm i vue-router(终端)

2.在 src 源代码目录下,新建router / index.ts 路由模块,并初始化如下的代码:

import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router";

// 自定义的组件文件
import Home from "../views/Home.vue";
import About from "../views/About.vue";
import Movie from "../views/Movie.vue";
// routes 是一个数组,作用:定义 'hash 地址' 与 '组件之间的对应关系'
let routes: RouteRecordRaw[] = [
{ path: "/", component: Home },
{ path: "/movie", component: Movie },
{ path: "/about", component: About },
];
// 创建路由对象
let router = createRouter({
history: createWebHashHistory(), // 指定路由模式
routes,
}); // 向外共享路由的实例对象
export default router;

3.在 src / main.ts 入口文件中,导入并挂载路由模块

import { createApp } from 'vue'
import App from './App.vue'
import router from './router' let app=createApp(App) app.use(router).mount('#app');

4、声明路由链接和占位符

App.vue文件:

<template>
<!-- 当安装了vue-router后,可以使用 router-link 来替代普通的a链接 -->
<router-link to="/">首页</router-link> |
<router-link to="/movie">电影</router-link> |
<router-link to="/about">关于</router-link>
<!-- 只要在项目中安装和配置了 vue-router,就可以使用 router-view 这个组件 -->
<!-- 它的作用很单纯:占位符,相当于一个容器 -->
<router-view></router-view>
</template> <script lang="ts" setup></script>

1.4.2、嵌套路由:

1、创建两个子组件

components/one:

<!-- 案例一 -->
<template lang="">
<div>
<h1>按键事件1</h1>
</div>
</template>
<script>
export default { }
</script>
<style lang=""> </style>

components/two:

<!-- 案例二 -->
<template lang="">
<div>
<h1>按键事件2</h1>
</div>
</template>
<script>
export default { }
</script>
<style lang=""> </style>
2、配置路由规则,使用children配置项:
{
path: '/test16',
component: test16,
redirect: '/test16/one', // 默认路由 默认页面
children: [
// 子路由
{ path: '/test16/one', component: test16_1},
{ path: '/test16/two', component: test16_2},
]
},

3、自定义一个vue文件,跳转(要写完整路径)

       <div>
<!-- 当安装了vue-router后,可以使用 router-link 来替代普通的a链接 -->
<div><router-link to="/test16/one">按键事件1</router-link></div>
<div><router-link to="/test16/two">按键事件2</router-link></div>
</div>
<div>
<!-- 只要在项目中安装和配置了 vue-router,就可以使用 router-view 这个组件 -->
<!-- 它的作用很单纯:占位符,相当于一个容器 -->
<router-view></router-view>
</div>

4、可以在App.vue直接调用自定义的vue文件

<router-link to="/test16">嵌套路由</router-link> |

<router-view/>

5、图片演示

1.4.3、路由的query参数(路由传参)

1.传递参数

//跳转并携带query参数,to的字符串写法
<router-link :to="/home/message/detail?id=666&title=你好">跳转</router-link>
//跳转并携带query参数,to的对象写法
<router-link
  :to="{
path:'/home/message/detail',
       query:{
           id:666,
           title:'你好'
      }
}"
>跳转</router-link>

2.接收参数(.vue文件中)

{{ $route.query.id }}
{{ $route.query.title }}

1.4.4、路由的params参数(路由传参)

1.配置路由,声明接收params参数
{
path:'/home',
   cpmponent:Home,
   children:[
      {
           path:'news',
           component:News
      },
      {  
           path:'message'
           components:Message,
           children:[
              {
                   name:'xuexi',
                   path:'detail/:id/:title',//:xxx是占位符,用来声明接收params参数
                   component:Detail
              }
          ]
      }
  ]
}

2.传递参数

路由携带params参数时,若使用to的对象写法,则不能使用path配置项,必须使用name配置

//Message.vue
//跳转并携带params参数,to的字符串写法
<router-link :to="/home/message/detail/666/你好">跳转</router-link>
//跳转并携带params参数,to的对象写法
<router-link
  :to="{
name:'xuexi',
       params:{
           id:666,
           title:'你好'
      }
}"
>跳转</router-link>

3.接收参数

//Detail.vue
<template>
   <ul>
  <li>消息编号:{{$route.params.id}}</li>
<li>消息标题:{{$route.params.title}}</li>
   </ul>
</template>
<script>
   export default{
name:'Detail',
}
</script>

1.4.5、路由的props配置

作用:让路由组件更方便的收到参数

使用场景:路由组件读取参数时太麻烦

解决方法:在路由的配置文件中找到需要接收参数的路由组件,为其增加props配置项

第一种写法: props值为对象,该对象中所有的key-value的组合最终都会通过props传给Detail组件

//index.js
{
name:'xuexi',
path:'detail/:id',
component:Detail,
//不常用,因为数据是写死的
props:{a:900}
}
//Detail.vue
<template>
   <div>读取a{{a}}</div>
</template>
<script>
   export default{
name:'Detail',
       props:['a'],
}
</script>

第二种写法: props值为布尔值,布尔值为true,则把路由收到的所有params参数通过props传给Detail组件

//index.js
{
name:'xuexi',
path:'detail/:id',
component:Detail,
//不推荐,只能接收params参数
props:true,
}
//Detail.vue
<template>
   <ul>
  <li>消息编号:{{id}}</li>
<li>消息标题:{{title}}</li>
   </ul>
</template>
<script>
   export default{
name:'Detail',
       props:['id','title'],
}
</script>

第三种写法(常用): props值为函数,该函数返回的对象中每一组key-value都会通过props传给Detail组件

//index.js
{
name:'xuexi',
   path:'detail/:id',
   component:Detail,
   props($route){
       return{
           id:$route.query.id,
           title:$route.query.title
      }
  }
}
//Detail.vue
<template>
   <ul>
  <li>消息编号:{{id}}</li>
<li>消息标题:{{title}}</li>
   </ul>
</template>
<script>
   export default{
name:'Detail',
       props:['id','title'],
}
</script>

1.4.6、<router-link>的replace属性

1.作用:控制路由跳转时操作浏览器历史记录的模式

2.浏览器的历史纪录有两种写入方式:分别为pushreplace

  • push是追加历史记录(路由跳转时默认为push
  • replace是替换当前记录

3.开启replace模式:<router-link replace...>News</router-link>

1.4.7、声明式导航 & 编程式导航

1.4.7.1、介绍
  • 在浏览器中,点击链接实现导航的方式,叫做声明式导航。例如:
    • 普通网页中点击 <a> 链接, vue项目中点击 <router-link> 都属于声明式导航
  • 在普通浏览器中,调用API方法实现导航的方式,叫做编程式导航。例如:
    • 普通网页中调用 location.href 跳转到新页面的方式,属于编程式导航
1.4.7.2、vue-router 中的编程式导航API
  vue-router 提供了许多编程式导航的API,其中最常用的导航API分别是:
  • 1.this.$router.push('hash地址')

    • 跳转到指定 hash 地址,并增加一条历史记录    
  • 2.this.$router.replace('hash地址')

    • 跳转到指定的 hash 地址,并替换当前的历史记录
  • 3.this.$router.go(数值)

    • 调用 this.$router.go() 方法,可以在浏览历史中前进或后退。实例代码如下

      function xx(){
      // go(-1) 表示后退一层
      // 如果后退的层数超过上限,则原地不动
      // go(-1) 反之亦然
      this.$router.go(-1)
      }

1.4.8、$router.go 的简化用法

  在实际开发中,一般只会前进或后退一层页面。因此 vue-router 提供了如下两个便捷方法
  • 1.$router.back();

    • 在历史记录中,后退到上一个页面
  • 2.$router.forward();

    • 在历史记录中,前进到下一个页面

1.4.9、导航守卫

  导航守卫可以控制路由的访问记录权限

1.全局前置守卫

每次发生路由的导航跳转的时,都会触发全局前置守卫。因此,在全局前置守卫中,程序员可以对每个路由进行访问权限的控制

 const router = new VueRouter({...})
router.beforEach(fn)

2.守卫方法的3个形参

   router.beforeEach(()=>{
// to 是将要访问的路由的信息对象
// from 是将要离开的路由的信息对象
// next 是一个函数,调用 next () 表示放行,允许这次路由导航
})

3.next函数的3种调用方式

  • 1.当前用户拥有后台主页的访问权限,直接放行:next()

  • 2.当前用户没有后台主页的访问权限,强制其跳转到登陆页面:next('/longin')

  • 3.当前用户没有后台主页的访问权限,不允许跳转到后台页面:next(false)

 
 
 
 
 
 
 
 
 

vue3路由的使用的更多相关文章

  1. vue3路由的使用,保证你有所收获!

    路由变量 有的小伙伴,可能是第一次听见路由变量这个词. 什么是路由变量了,顾名思义就是这个路由地址是动态的,不是固定的. 它的运用场景是哪里呢? 比如说:1.详情页的地址,我们就可以去使用路由变量. ...

  2. 第三十八篇:vue3路由

    好家伙,水博客怎么说 1.0.安装:简简单单的淘宝镜像安装 装一下淘宝镜像(一般都有) npm install -g cnpm --registry=https://registry.npm.taob ...

  3. 手把手教你学Vue-3(路由)

    1.路由的作用 1.当我们有多个页面的时候 ,我们需要使用路由,将组件(components)映射到路由(routes),然后告诉 vue-router 在哪里渲染它们. 简单的路由 const ro ...

  4. Vue3.0网页版聊天|Vue3.x+ElementPlus仿微信/QQ界面|vue3聊天实例

    一.项目简介 基于vue3.x+vuex+vue-router+element-plus+v3layer+v3scroll等技术构建的仿微信web桌面端聊天实战项目Vue3-Webchat.基本上实现 ...

  5. vue-qiankun公司微前端项稳定目落地后的总结(附github仓库demo,将会持续更新)

    ️本文为博客园社区首发文章,未获授权禁止转载 大家好,我是aehyok,一个住在深圳城市的佛系码农‍♀️,如果你喜欢我的文章,可以通过点赞帮我聚集灵力️. 个人github仓库地址: https:gi ...

  6. 纯小白入手 vue3.0 CLI - 3.3 - 路由的导航守卫

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...

  7. 纯小白入手 vue3.0 CLI - 3.2 - 路由的初级使用

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...

  8. 纯小白入手 vue3.0 CLI - 3.1 - 路由 ( router )

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...

  9. vue3.0-如何切换路由-路由模式ts

    如何更换路由模式 vue3版本如何切换路由模式?(注:更改后要重启下项目才能看到效果.) 博主,我搜了大半天的,你是怎么找到的? 如下图可看到

  10. VUE3后台管理系统【路由鉴权】

    前言: 在"VUE3后台管理系统[模板构建]"文章中,详细的介绍了我使用vue3.0和vite2.0构建的后台管理系统,虽然只是简单的一个后台管理系统,其中涉及的技术基本都覆盖了, ...

随机推荐

  1. Linux的NIS配置

    快速命令 # Server和Client设置NIS域名 nisdomainname nis_server echo 'NISDOMAIN=nis_server' >> /etc/sysco ...

  2. 第九十九篇:JS闭包

    好家伙,总是要来的,去面对那些晦涩难懂的原理,它就在那里,等着我去搞定它 首先我要去补充一些最基本的概念, 1.什么是内存? 新华字典永远的神, 但这个解释显然不够   去看看百度百科: 内存: CP ...

  3. KingbaseES R6 主备流复制集群创建级联复制案例

    案例环境: 数据库: test=# select version(); version -------------------------------------------------------- ...

  4. LIKE与等式查询比较

    我们知道 char 是定长类型的数据,如果数据长度小于定义的长度,会在字符串尾部加上空格.而对于空格的处理,对于等式匹配,或length等,会忽略空格.而对于like 或模式匹配,空格不能忽略. 一. ...

  5. Unity2D-Dash && SpeedUp

    ​ Introduction 原理: 角色位置改变时,每隔一段时间记录角色的位置,然后在记录的位置上放置一个图片,在图片出现之后过一段时间就让图片渐渐消失 简述实现步骤: 1.在Unity中Creat ...

  6. 【设计模式】Java设计模式 - 桥接模式

    [设计模式]Java设计模式 - 桥接模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...

  7. Java SE note1

    1.数据类型 基本类型 低------------------------------------------------->高 byte,short,char -> int -> ...

  8. Python数据科学手册-Pandas:层级索引

    一维数据 和 二维数据 分别使用Series 和 DataFrame 对象存储. 多维数据:数据索引 超过一俩个 键. Pandas提供了Panel 和 Panel4D对象 解决三维数据和四维数据. ...

  9. MinIO Python Client SDK 快速入门指南

    官方文档地址:http://docs.minio.org.cn/docs/master/python-client-quickstart-guide MinIO Python Client SDK提供 ...

  10. Elastic:应用程序性能监控/管理(APM)实践

    在今天的文章里,我们将介绍Elastic的一个重要的应用:应用程序性能管理(Application Performance Monitoring/Management),简称APM.那么到底什么是AP ...