vue路由的介绍和使用(包括前端导航、导航守卫)

news2024/11/26 16:57:24

文章目录

  • 路由基本使用
    • 实现简易的前端路由
    • 安装和配置vue-router路由
        • 安装vue-router包
        • 创建路由模块
        • 导入并挂载路由模块
        • 声明路由链接和占位符
    • 使用router-link替代a连接
    • redirect重定向
  • 嵌套路由
        • 声明子级路由链接和占位符
        • 声明嵌套路由的规则
  • 动态路由
        • 动态路由匹配(基本用法)
        • 需求:在Movie 组件中,希望根据id的值,展示对应电影的详情信息
            • 第一种方式
            • 第二种方式
  • 拓展query和fullPath
  • 声明式导航和编程式导航
    • vue-router 中的编程式导航API
  • 导航守卫
    • 全局前置守卫
            • next函数的3种调用方式

路由基本使用

什么是路由??
就是对应关系(例如拨打10086会有不同的按键对应不同的服务,这种按键与服务对应的关系就是路由)
通俗易懂的概念: Hash地址与组件之间的对应关系。
前端路由工作方式
1.用户点击了页面上的路由链接
2.导致了URL地址栏中的Hash值发生了变化
3.前端路由监听了到Hash地址的变化
4.前端路由把当前Hash地址对应的组件渲染都浏览器中
在这里插入图片描述

实现简易的前端路由

根组件创建对应路由的a标签,再使用component进行组件占位,通过is指定要显示的组件
在这里插入图片描述
可以发现此时组件绑定死了,因此应该动态绑定components的is属性值指向的组件,动态绑定
在这里插入图片描述

onhashchange事件监听组件的hash值的改变,当hash值被改变就会触发这个事件,通过location.hash可以获取当前的hash值,data里面定义的是默认的指向的组件
在这里插入图片描述

在这里插入图片描述
上面写完,然后点击不同的链接,component就显示不同的组件内容,这就是一个简单的前端路由
在实际开发中,路由不会这么简易,但也不需要自己写,下面就开始学习第三方库vue-router的使用了

安装和配置vue-router路由

什么是vue-router???
vue-router是vue.js官方给出的路由解决方案。它只能结合vue项目进行使用,能够轻松的管理SPA项目中组件的切换。
vue-router的官方文档地址: https://router.vuejs.org/zh/

安装vue-router包

在vue2项目中,安装vue-router的命令如下

npm i vue-router@3.5.2 -S

创建路由模块

在src源代码目录下,新建router/index.js路由模块,并初始化如下的代码
在这里插入图片描述
在index.js里面添加如下代码进行配置

//1.导入vue和vuerouter的包
import Vue from 'vue'
import VueRouter from 'vue-router'

//2.调用Vue.use()函数,把VueRouter安装为Vue的插件
//vue.use()函数的作用,就是来安装插件的
Vue.use(VueRouter)

//3.创建路由的实例对象
const router = new VueRouter()

//4.向外共享路由的实例对象
export default router

导入并挂载路由模块

上面配置完后,需要让路由的js模块与main.js模块关联,因此需要到main.js里面配置如下代码:

//1.导入路由模块
//import routerjs from '@/router/index.js'
//import routerjs from '@/router/'
import routerjs from '@/router'
//以上三种方式均可以引入/router/index.js
//在模块化导入时,如果给定的不是具体的文件,而是文件夹,则默认导入这个文件夹下名为index.js的文件,文件名不是index.js是需要指定完整路径

//vue的实例对象
new Vue({
  render: h => h(App),
  //在Vue项目中,要想把路由用起来,必须把路由实例对象,通过下面的方式进行挂载
  router:routerjs//路由的实例对象
}).$mount('#app')

声明路由链接和占位符

先在父组件声明路由的连接和占位符

<template>
  <div class="app-container">
    <h1>App2 组件</h1>
    <a href="#/home">首页</a>
    <a href="#/movie">电影</a>
    <a href="#/about">关于</a>
    <hr />
    <!-- 只要在项目中安装和配置了vue-router,就可以使用router-view这个组件了 -->
    <!-- 它的作用很单纯:占位符,和之前的component组件一样的作用 -->
    <router-view></router-view>
  </div>
</template>

点击上面每个链接,显示对应的组件
在这里插入图片描述
上面指明了路由链接和router-view后,需要在router/index.js,里面去配置对应的路由

//1.导入vue和vuerouter的包
import Vue from 'vue'
import VueRouter from 'vue-router'

//导入需要的路由组件模块
import home from '@/components/Home.vue'
import movie from '@/components/Movie.vue'
import about from '@/components/About.vue'

//2.调用Vue.use()函数,把VueRouter安装为Vue的插件
Vue.use(VueRouter)

//3.创建路由的实例对象
//在路由实例上配置对应的路由模块
const router = new VueRouter({
    //routes是一个数组,作用:定义'hash地址'与'组件'之间的对应关系
    routes:[
        //在前面我们配置的路由带'#',但是在这里指定路由时不需要,带上'#'反而报错了
        {path:'/home',component:home},
        {path:'/movie',component:movie},
        {path:'/about',component:about}
    ]
})

//4.向外共享路由的实例对象
export default router

最后,效果实现了:
在这里插入图片描述
此时已经可以点击每个链接进行组件的切换了

使用router-link替代a连接

 <!-- 只要在项目中安装和配置了vue-router,就可以使用router-link来替代普通的a链接了 -->
    <!-- 里面有个to属性和a标签的herf属性一致,有个优点就是不需要再写'#'了,直接写hash值就可以,例如下面 -->
    <router-link to="/home">首页</router-link>
    <a href="#/home">首页</a>
   上面两种都是可以绑定指定路由的,但更推荐使用router-link
   router-link本质就是a链接,可以查看控制台源代码
    <a href="#/movie">电影</a>
    <a href="#/about">关于</a>

redirect重定向

作用,路由是点击某个链接跳转的地址,当直接访问页面时候,由于没有点击操作,则页面无元素,使用重定向使页面访问时直接跳转到我们想要的页面

路由重定向指的是:用户在访问地址A的时候,强制用户跳转到地址C,从而展示特定的组件页面。通过路由规则的redirect属性,指定一个新的路由地址,可以很方便地设置路由的重定向:

只需要在路由的配置文件index.js里面的routes里面加一行代码,代码如下:

    //routes是一个数组,作用:定义'hash地址'与'组件'之间的对应关系
    routes:[
        //path代表'/'路由地址,当访问这个地址时会重定向到'/home'路由地址
        {path:'/',redirect:"/home"},
    ]
})

嵌套路由

声明子级路由链接和占位符

通过路由实现组件的嵌套展示,叫做嵌套路由。
在这里插入图片描述
在这里插入图片描述
在About.vue文件中设置好路由关系,这个文件相对于App.vue来说是父子关系,因此这个路由也是App.vue的子级路由,template代码如下,父级的模板代码参考上面的()即可

<template>
  <div class="about-container">
    <h3>About 组件</h3>
    <!-- 子级路由链接,前面都要有共同的路由,后面各写各的 -->
    <router-link to="/about/tab1">tab1</router-link>
    <router-link to="/about/tab2">tab2</router-link>
    <hr>
    <!-- 子级路由占位符 -->
    <router-view></router-view>
  </div>
</template>

声明嵌套路由的规则

通过children属性声明子路由规则
在 src/router/index.js路由模块中,导入需要的组件,并使用children属性声明子路由规则:
在index.js里面的代码配置如下

//导入子路由组件模块
import tab1 from '@/components/tabs/Tab1.vue'
import tab2 from '@/components/tabs/Tab2.vue'
//在路由实例上配置对应的路由模块
const router = new VueRouter({
    //routes是一个数组,作用:定义'hash地址'与'组件'之间的对应关系
    routes:[
    //相当于给了第三个参数children,里面存放子级路由,最前面的path为共同的路由名,后面为自己的路由,子路由的path里面不用写'/'
		{
			path:'/about',
			component:about,
			children:[
				{path:'tab1',component:tab1},
				{path:'tab2',component:tab2}
		]}
  	]
})

配置完以后子级路由就能正常去切换了
在这里插入图片描述
设置默认显示的子路由方法(还是重定向,加个单词即可)
在index.js里面的代码配置如下

//导入子路由组件模块
import tab1 from '@/components/tabs/Tab1.vue'
import tab2 from '@/components/tabs/Tab2.vue'
//在路由实例上配置对应的路由模块
const router = new VueRouter({
    //routes是一个数组,作用:定义'hash地址'与'组件'之间的对应关系
    routes:[
    //相当于给了第三个参数children,里面存放子级路由,最前面的path为共同的路由名,后面为自己的路由,子路由的path里面不用写'/'
		{
			path:'/about',
			component:about,
			//redirect:'/about/tab1'//默认显示的子路由的第一种方法
			children:[
			//默认子路由:如果children数组中,某个路由规则的 path值为空字符串,则这条路由规则,叫做“默认子路由”
			
				//默认显示的子路由的第二种方法
				{path:'',component:tab1},
				{path:'tab1',component:tab1},
				{path:'tab2',component:tab2}
		]}
  	]
})

动态路由

动态路由匹配(基本用法)

在这里插入图片描述
缺点:路由规则的复用性差。
动态路由指的是:把 Hash地址中可变的部分定义为参数项,从而提高路由规则的复用性。
在vue-router中使用英文的冒号(:)来定义路由的参数项。示例代码如下:

//路由中的动态参数以︰进行声明,冒号后面的是动态参数的名称
{path:'/movie/:id',component:Movie}

//将以下3个路由规则,合并成了一个,提高了路由规则的复用性
{path:'/movie/1',component:Movie}
{path:'/movie/2',component:Movie}
{path:'/movie/3',component:Movie}

路由链接代码为

    <router-link to="/movie/1">洛基</router-link>
    <router-link to="/movie/2">雷神</router-link>
    <router-link to="/movie/3">复联</router-link>

效果图
在这里插入图片描述
点击谁显示谁的路由地址

需求:在Movie 组件中,希望根据id的值,展示对应电影的详情信息

第一种方式

在Movie.vue组件中打印一下this
在这里插入图片描述
点击展开route(不带r的,最短的这个)
展开结果如图:
在这里插入图片描述
this $route是路由的“参数对象”
this. $router 是路由的“导航对象”

这个params里面的对象就是我们的路由携带的动态参数,获取的话通过 ----this.$route.params.动态参数----来获取(其中最前面的this.可加可不加,不加的话也没影响)

第二种方式

为路由规则开启props传参
在router/index.js里面配置如下(完整的往上翻,这里就简单写最重要的一行)

//props:true代表为当前路由规则开启props传参,从而很方便地拿到动态参数的值
//没有动态参数的不建议加props,因为无意义,没什么用
{path:'/movie/:id',component:Movie,props:true}//id为动态参数

在movie.vue的导出里面定义props自定义属性,代码如下:

<script>
	export default {
		props:['id']//这个id值为路由的动态参数,需要和路由的动态参数保持一致
	}
</script>

此时已经拿到数据了,可以使用了,查看方式如下:

<template>
	<div>
		{{ id }}//此时就可以展示我们动态绑定的参数值
	</div>
</template>

拓展query和fullPath

注意:在 hash地址中,/后面的参数项,叫做“路径参数"
在路由“参数对象”中,需要使用this. $route. params来访问路径参数
注意2:在 hash地址中,'?'后面的参数项,叫做“查询参数”

在路由“参数对象”中,需要使用this.$route. query来访问查询参数

注意3:在 this.$route中,path只是路径部分;fullPath是完整的地址

    <router-link to="/movie/1">洛基</router-link>
    <router-link to="/movie/2?username=zs&age=20">雷神</router-link>
    <router-link to="/movie/3">复联</router-link>

打印this结果如下
在这里插入图片描述

声明式导航和编程式导航

在浏览器中,点击链接实现导航的方式,叫做声明式导航。例如:
普通网页中点击< a >链接、vue项目中点击< router-link >都属于声明式导航

在浏览器中,调用API方法实现导航的方式,叫做编程式导航。例如:普通网页中调用location.href 跳转到新页面的方式,属于编程式导航

vue-router 中的编程式导航API

vue-router提供了许多编程式导航的API,其中最常用的导航API分别是:

this.$router.push(‘hash地址’)
跳转到指定hash地址,并增加一条历史记录

	methods:{
		dianjitiaozhuan(){
			this.$router.push('/movie/1')//按钮绑定这个方法,当点击按钮就跳转到/movie/1这个(名为洛基的)路由组件了
			//这种跳转方式会存在历史记录,可以通过浏览器左上角的前进后退按钮回到任意页面
		}
	}

this.$router.replace(‘hash 地址’)
跳转到指定hash地址,并替换当前的历史记录(简单来说就是没有历史记录)

	methods:{
		dianjitiaozhuan(){
			this.$router.replace('/movie/1')//按钮绑定这个方法,当点击按钮就跳转到/movie/1这个(名为洛基的)路由组件了
			//这种跳转方式不会存在历史记录
		}
	}

this.$router.go(数值n)
在浏览历史中可以前进和后退

	methods:{
		dianjitiaozhuan(){
			//this.$router.go(-1)//历史记录后退一位
			//this.$router.go(-2)//历史记录后退两位
			//如果后退的层数超过上限,则原地不动
			//this.$router.go(1)//历史记录前进一位
			//this.$router.go(2)//历史记录前进两位
		}
	}

在实际开发中,一般只会前进和后退一层页面。因此vue-router提供了如下两个便捷方法:

$router.back()
	在历史记录中,后退到上一个页面
$router.forward()
	在历史记录中,前进到下一个页面

//下面方法切记不要加this.,不然报错
<button @click="$router.back()">back后退</button>
<button eclick="$router.forward()">forward 前进</button>

导航守卫

导航守卫可以控制路由的访问权限。示意图如下:

在这里插入图片描述

全局前置守卫

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

在rooter/index.js下进行配置,如下:

//下面代码必须在router的new的实例对象下面配置,否则不生效

const router = new VueRouter({//router的实例对象
})
//在router实例对象下面进行如下配置
//调用路由实例对象的beforeEach方法,即可声明“全局前置守卫”
//每次发生路由导航跳转的时候,都会自动触发fn这个“回调函数”
router.beforeEach((to,from,next)=>{
	//全局前置守卫的回调函数中接收3个形参
	//to:是将要访问路由的信息对象
	//from 是将要离开路由的信息对象
	//next 是一个函数,调用 next()表示放行,允许这次路由导航
})
next函数的3种调用方式

当前用户拥有后台主页的访问权限,直接放行: next()
当前用户没有后台主页的访问权限,强制其跳转到登录页面: next(‘/login’)
当前用户没有后台主页的访问权限,不允许跳转到后台主页:next(false)

控制后台主页的访问权限
在这里插入图片描述

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

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

相关文章

Java源码篇之容器类——HashMap

以下是基于jdk17 Java源码篇之容器类——HashMapconstructorput()hash()putVal()resize()treeifyBin()treeify()tieBreakOrder()balanceInsertion()moveRootToFront()checkInvariants()constructor // 无参构造 public HashMap() {this.loadFactor DEFAULT_LOAD_FACTOR; // a…

多线程并发检测触发器触发算法优化,附详细代码 - 定时执行专家

目录 ◆ V6.5版之前的并行检测方案 ◆ V6.5版之前的并行检测方案存在的问题 ◆ V6.5版本的并行检测方案 ◆ 定时执行专家 - 简介 ◆ 定时执行专家 - 最新版下载 一些用户说任务数量可能达到200个&#xff0c;让我比较惊讶&#xff0c;这个软件的设计之初并没有考虑这么多的…

MySQL调优-SQL底层执行原理

目录 MySQL调优-SQL底层执行原理 MySQL内部组件结构 Server层 Store层 连接器 客户端连接mysql数据库 创建新用户并且修改用户密码&#xff1a; show processlist 查看用户状态 客户端自动断开时间 长连接和短连接 查询缓存 常见的一些命令操作 大多数情况查询缓存…

Linux使用gdb定位Qt程序崩溃位置(systemd-coredump)

Linux提供了systemd-coredump服务&#xff0c;可以配合gdb来定位到程序崩溃位置&#xff0c;下面介绍它们的用法。 1. systemd-coredump systemd-coredump的简单介绍&#xff1a; systemd-coredump能从操作系统内核中获取内存转储&#xff0c;并能对获取到的数据进行各种处理…

Polygon zkEVM测试集——创建合约交易

1. 引言 可通过https://www.evm.codes/playground&#xff0c;来深入理解EVM各opcode中stack、memory、storage之间的关系&#xff0c;可输入任意的opcode来观察变化。 很赞的资料集&#xff1a; 深入理解合约升级(2) - Solidity 内存布局深入理解 EVM&#xff08;一&#xf…

力扣:两数之和与n数之和的(Map)与(排序+双指针)解法 【三刷终于明白HashMap求和的去重问题】

啃一本算法书啃了快一年了&#xff0c;用嘴想一想都该只剩渣了&#xff0c;脑子是怎么想的&#xff1f;&#xff1f;&#xff1f; 真希望有一天“爷啃完了&#xff0c;爷不要你了&#xff0c;爷换一本啃”&#xff0c;&#xff0c;欸欸欸&#xff1f;&#xff1f;罪过罪过&…

Python基础(一)

Python 的种类 CpythonPython的官方版本&#xff0c;使用C语言实现&#xff0c;使用最为广泛&#xff0c;CPython实现会将源文件&#xff08;py文件&#xff09;转换成字节码文件&#xff08;pyc文件&#xff09;&#xff0c;然后运行在Python虚拟机上。 JyhtonPython的Java实…

IDEA初始化git+代码提交

IDEA初始化git 当你在代码仓库如&#xff1a;github or gitee 上建立好了仓库&#xff0c;我们在idea中该如何初始化你的git又怎么样把你的代码push到代码仓库上呢&#xff1f; 第一步&#xff1a;初始化idea中的git 在idea中的setting中搜索git&#xff0c;将你的git.exe路…

JVM垃圾回收器-评估GC的性能指标

文章目录学习资料垃圾回收器概述评估GC的性能指标吞吐量&#xff08;throughput&#xff09;暂停时间&#xff08;pause time&#xff09;吞吐量VS暂停时间学习资料 【尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟机&#xff09;】 【阿里巴巴Java开发手册】https://www.…

机器学习 加利福尼亚房价预测

学习目标&#xff1a; 提示&#xff1a;导入包 例如&#xff1a; import pandas as pd import numpy as npfrom sklearn.datasets import fetch_california_housing from sklearn.model_selection import KFold, train_test_split from sklearn.metrics import mean_squared…

【阶段二】Python数据分析Pandas工具使用02篇:数据读取:文本文件读取、电子表格读取与数据预处理:数据概览与清洗

本篇的思维导图: 数据读取:文本文件读取 对于csv后缀的文本文件,可以使用pandas模块中的read_csv函数进行读取。 所需要的数据文件如下百度云盘链接: 链接:https://pan.baidu.com/s/1Zj-uTt_wdRcmDt3aumZ2nA 提取码:z2e8 代码

CSRF攻防基础讲解

CSRF攻击 Cross-site request forgery跨站请求伪造 场景模拟 在用户登录某个网站后&#xff0c;看到某篇文章高兴之余&#xff0c;挥手打字&#xff0c;突然有人发来一个链接&#xff0c;登录者打开链接后什么都没有操作或者只是好奇的点击了某个按钮&#xff0c;在原登录网…

猿客栈后台管理系统日志记录

目录 一、用户权限设置 前端逻辑 后端逻辑 二、登录界面逻辑 1、账号密码登录实现 前端逻辑 在Cookie中存储token的方法 在Cookie中存储和获取的token方法 后端逻辑 生成token工具类 2、手机号登录 前台逻辑 后台逻辑 补充&#xff1a;实现点击发送验证码120s倒计…

ThinkPHP 之 SQLI审计分析(二)

说明 该文章来源于同事lu2ker转载至此处&#xff0c;更多文章可参考&#xff1a;https://github.com/lu2ker/ 文章目录说明0x00 测试代码做了什么&#xff1f;0x01 分析调用0x02 漏洞点的发现、构造、利用0x03 总结Time&#xff1a;9-3影响版本&#xff1a;ThinkPHP5.0.10 Pa…

详细介绍chrony服务器

chrony服务器 硬件时间&#xff1a;BIOS里面&#xff1b;关机后依然运行&#xff0c;主板电池为它供电&#xff1b;RTC时钟 系统时间&#xff1a;开机后&#xff0c;软件启动读取硬件时钟&#xff0c;之后独立运行 Chrony 的配置文件是/etc/chrony.conf chronyd服务器端 ch…

【目标检测】Mask rcnn代码实现Pytorch版,适用30系列显卡!(测试版)

目录&#xff1a;Mask rcnn代码实现Pytorch版一、环境二、mmdetection环境搭建三、测试四、结果展示为什么选择使用Pytorch版本&#xff1f;因为本人换电脑了&#xff0c;显卡升级为30系列&#xff0c;而30系列显卡的 CUDA 版本要求是 11.x。一、环境 cudatoolkit …

MYSQL之两阶段提交和组提交(数据一致性)

我们在MySQL 的日志中详细的介绍了undo log、redo log、binlog这三个日志和所用到的一些缓存知识&#xff0c;那么下面我们分析一下更新语句执行过程&#xff0c;它们是怎么变化的呢&#xff1f;下面我们直接给答案吧。假如我们修改一行主键索引&#xff08;id&#xff09;为1的…

电力系统激励型需求响应+自适应多群体优化算法(Python实现)

目录 ​编辑 0 前言 1 激励型DR和价格型DR 2 激励型DR模型 3 Python代码实现 4 自适应多群体优化算法&#xff08;AMPO&#xff09; 5 Python代码实现 0 前言 风、光等清洁能源因具有环保、资源丰富等优点而受到电力行业的重视,电力行业开始大力发展清洁能源发电。同时…

MySQL详解,库和表的基础操作

目录 前言 一、预备知识 1、服务器&#xff0c;数据库&#xff0c;表关系 2、SQL分类 3、连接服务器 二、库的操作 1、创建数据库 2、查看字符集和校验规则 2.1 查看系统默认字符集以及校验规则 2.2 查看数据库支持的字符集和字符集校验规则 3、操纵数据库 3.1查看…

ros tf坐标

参考&#xff1a; 讲解&#xff1a;https://www.bilibili.com/video/BV1zt411G7Vn/?p18&vd_source3a1ad336af3eaae4fcced56c75d309d1ROS程序&#xff1a;https://gitee.com/guyuehome/ros_21_tutorials/tree/master/learning_tfROS2程序&#xff1a;https://gitee.com/gu…