Vue的router学习

news2024/9/19 14:12:44

,前端路由的核心是什么呢?改变URL,但是页面不进行整体的刷新。

vue-router是基于路由和组件的
 路由用于设定访问路径, 将路径和组件映射起来;
 在vue-router的单页面应用中, 页面的路径的改变就是组件的切换;

使用router需要

1.在router文件夹内书写整个index.js文件

2.在View文件夹内书写具体的router文件内容

3.在App.vue文件夹想要替换内容的地方,写上路由占位符

4.main.js文件内import router from "./router",并且在mount app前app.use(router)

路由的使用步骤

◼ 使用vue-router的步骤:
 第一步:创建路由需要映射的组件(打算显示的页面);
 第二步:通过createRouter创建路由对象,并且传入routes和history模式;
✓ 配置路由映射: 组件和路径映射关系的routes数组;
✓ 创建基于hash或者history的模式;
 第三步:使用app注册路由对象(use方法);
 第四步:路由使用: 通过<router-link>和<router-view>;

 0.报错:无法正常渲染router

报错1:

必须把use router写在mount前 

报错2:

 要么是router-link没写to的路径,要么是  history:createWebHistory,这里没写()

1.简单使用

router文件夹index.js

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

import Home from "../Views/Home.vue"
import About from "../Views/About.vue"


const router = createRouter({
	//指定采用的模式:hash
	history:createWebHashHistory(),
	//映射关系
	routes:[
		{path:"/home",component:Home},
		{path:"/about",component:About},
	]
})

export default router

Views文件夹下About与Home.vue文件

<template>
	<h2>about</h2>
</template>
<template>
	<h2>home</h2>
</template>

App.vue

<template>
<div class="app">
	<router-view></router-view>
	<h2>App content</h2>
</div>
</template>
 
<script setup>
  
 
</script>
 
<style lang="less" scoped>

</style>

main.js

import { createApp } from 'vue'
// import "./assets/reset.css"
import router from "./router"
 
import App from './App.vue'
 
const app = createApp(App)
 
// 全局注册

app.use(router)

app.mount('#app')

2.如果希望点击某个区域进行跳转:router-link

<template>
<div class="app">
	<h2>App content</h2>
	<div class="nav">
			<router-link to="/home">首页</router-link>
			<router-link to="/about">关于</router-link>
	</div>
	<router-view></router-view>
</div>
</template>
 
<script setup>
  
 
</script>
 
<style lang="less" scoped>

</style>

 3.路由的默认路径

 默认情况下, 进入网站的首页, 我们希望<router-view>渲染首页的内容;
 但是我们的实现中, 默认没有显示首页组件, 必须让用户点击才可以;
◼ 如何可以让路径默认跳到到首页, 并且<router-view>渲染首页组件呢?
◼ 我们在routes中又配置了一个映射:
 path配置的是根路径: /
 redirect是重定向, 也就是我们将根路径重定向到/home的路径下, 这样就可以得到我们想要的结果了.

const router = createRouter({
	//指定采用的模式:hash
	history:createWebHashHistory(),
	//映射关系
	routes:[
		{path:"/",redirect:"/home"},
		{path:"/home",component:Home},
		{path:"/about",component:About},
	]
})

4.history模式

使用WebHashHistory哈希模式,域名跳转时会有#,如果切成history则是日常的域名模式

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

import Home from "../Views/Home.vue"
import About from "../Views/About.vue"


const router = createRouter({
	//指定采用的模式:hash
	// history:createWebHashHistory(),
	history:createWebHistory(),
	//映射关系
	routes:[
		{path:"/",redirect:"/home"},
		{path:"/home",component:Home},
		{path:"/about",component:About},
	]
})

export default router

5.router-link的属性:to/replace/active/name

◼ router-link事实上有很多属性可以配置:
◼ to属性:
 是一个字符串,或者是一个对象

对象写法,记得:to,几乎不在to内使用对象写法

			<router-link :to="{path:'/about'}">关于</router-link>

◼ replace属性:
 设置 replace 属性的话,当点击时,会调用 router.replace(),而不是 router.push();

	<div class="nav">
			<router-link to="/home" replace>首页</router-link>
			<router-link to="/about" replace>关于</router-link>
	</div>

如果使用了replace属性,比如从百度进入8080页面,默认进入首页,此时点击进入关于界面,再点击返回,此时返回的不再是首页,而是百度页面

因为相当于百度→首页,关于页面替换了首页,此时百度→关于,所以点击返回按钮,返回百度界面

◼ active-class属性:
 设置激活a元素后自动应用的class,默认是router-link-active


◼ exact-active-class属性:
 链接精准激活时,应用于渲染的 <a> 的 class,默认是router-link-exact-active;

 通过自动绑定的active类,可以对其进行样式操作

.router-link-active 
{
	color: red;
}

◼ name属性:路由记录独一无二的名称;
◼ meta属性:自定义的数据 

6.路由懒加载

◼ 当打包构建应用时,JavaScript 包会变得非常大,影响页面加载:
 如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就会更加高效;
 也可以提高首屏的渲染效率;


◼ 其实这里还是我们前面讲到过的webpack的分包知识,而Vue Router默认就支持动态来导入组件:
 这是因为component可以传入一个组件,也可以接收一个函数,该函数 需要放回一个Promise;
 而import函数就是返回一个Promise;

默认 npm run build不分包(此写法几乎被摒弃

import Home from "../Views/Home.vue"
import About from "../Views/About.vue"

 如果想要分包:

const Home=()=>import ("../Views/About.vue")
const About=()=>import ("../Views/Home.vue")

如果希望知道到底每个包对应的内容 

使用webpack的魔法注释,webpack从3.x开始支持对分包进行命名(chunk name)

const Home=()=>import (/* webpackChunkName: 'home' */"../Views/About.vue")
const About=()=>import (/* webpackChunkName: 'about' */"../Views/Home.vue")

 但是现在最广泛的写法是:

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

// import Home from "../Views/Home.vue"
// import About from "../Views/About.vue"
// const Home=()=>import (/* webpackChunkName: 'home' */"../Views/About.vue")
// const About=()=>import (/* webpackChunkName: 'about' */"../Views/Home.vue")


const router = createRouter({
	//指定采用的模式:hash
	// history:createWebHashHistory(),
	history:createWebHistory(),
	//映射关系
	routes:[
		{path:"/",
		redirect:"/home"
	},
		{path:"/home",
		component:()=>import ("../Views/Home.vue")
	},
		{path:"/about",
		component:()=>import ("../Views/About.vue")
	},
	]
})

export default router

7.动态路由基本匹配


◼ 很多时候我们需要将给定匹配模式的路由映射到同一个组件:
 例如,我们可能有一个 User 组件,它应该对所有用户进行渲染,但是用户的ID是不同的;
 在Vue Router中,我们可以在路径中使用一个动态字段来实现,我们称之为 路径参数;

如果进入user页面,一般user界面会跟着id,但是我们默认的时user,此时无法匹配,无法进入user页面

    {path:"/user/:id", 

const router = createRouter({
	history:createWebHistory(),
	//映射关系
	routes:[
		{path:"/",
		redirect:"/home"
	},
		{path:"/home",
		component:()=>import ("../Views/Home.vue")
	},
		{path:"/about",
		component:()=>import ("../Views/About.vue")
	},
	{path:"/user/:id",
	component:()=>import ("../Views/User.vue")
	},
	]
})

export default router

<template>
<div class="app">
	<h2>App content</h2>
	<div class="nav">
			<router-link to="/home">首页</router-link>
			<router-link to="/about">关于</router-link>
			<router-link to="/user">用户</router-link>

			<router-link to="/user/321">用户321</router-link>
			<router-link to="/user/123">用户123</router-link>
	</div>
	<router-view></router-view>
</div>
</template>

 8.获取动态路由的值

◼ 那么在User中如何获取到对应的值呢?
 在template中,直接通过 $route.params获取值;
✓ 在created中,通过 this.$route.params获取值;
✓ 在setup中,我们要使用 vue-router库给我们提供的一个hook useRoute;
➢ 该Hook会返回一个Route对象,对象中保存着当前路由相关的值;

法一:在template中,直接通过 $route.params获取值;

<template>
	<h2 class="user">User:{{$route.params}}</h2>
</template>
	{path:"/user/:id",
	component:()=>import ("../Views/User.vue")
	},

<template>
	<h2 class="user">User:{{$route.params.id}}</h2>
</template>

法二:在setup中,我们要使用 vue-router库给我们提供的一个hook useRoute;

<template>
	<h2 class="user">User:{{$route.params.id}}</h2>
</template>

<script setup>
	import {useRoute} from 'vue-router'
	const route =useRoute()
	console.log(route.params.id)
</script>

 但是这种写法在

			<router-link to="/user/321">用户321</router-link>
			<router-link to="/user/123">用户123</router-link>

切换时不会控制台输出

如果想要改变:(很少用到)

<template>
	<h2 class="user">User:{{$route.params.id}}</h2>
</template>

<script setup>
  import { useRoute, onBeforeRouteUpdate } from 'vue-router'
 
  const route = useRoute()
  console.log(route.params.id)
 
  // 获取route跳转id
  onBeforeRouteUpdate((to, from) => {
    console.log("from:", from.params.id)
    console.log("to:", to.params.id)
  })
 
</script>

 法三:


 9.notfound

对于哪些没有匹配到的路由,我们通常会匹配到固定的某个页面
 比如NotFound的错误页面中,这个时候我们可编写一个动态路由用于匹配所有的页面;

 这里path:"/:patMatch(.*)"意味着匹配到所有路径

但是home/user/about这种还是会正常跳转的

	{
		path:"/:patMatch(.*)",
		component:()=>import ("../Views/NotFound.vue")
	}
<template>
	<div class="not-found">
		<h2>NotFound:您当前的路径不正确</h2>
	</div>
</template>

<script setup>

</script>

<style scoped>
</style>

获得具体不正确的路径 

<template>
	<div class="not-found">
		<h2>NotFound:您当前的路径不正确{{$route.params.patMatch}}</h2>
	</div>
</template>

10.编程式路由跳转 

使用费router-link跳转需要用到编程式

使用push的特点是压入一个新的页面,那么在用户点击返回时,上一个页面还可以回退,但是如果我们希望当前页面是一个替换操作,那么可以使用replace: 

<template>
<div class="app">
	<h2>App content</h2>
	<div class="nav">
			<span @click="homeSpanClick">首页</span>
			<button @click="aboutBtnClick">关于</button>
		</div>
	<router-view></router-view>
</div>
</template>
 
<script setup>
		import {useRouter} from 'vue-router'
		const router=useRouter()

		function homeSpanClick(){
			router.push("/home")
		}
		function aboutBtnClick()
		{
			router.push("/about")
		}
</script>
 
		import {useRouter} from 'vue-router'
		const router=useRouter()

		function homeSpanClick(){
			router.push("/home")
		}

获取当前正在使用的router 

		function homeSpanClick(){
			router.push({
				path:"/home"
			})
		}

这样写可以写更多参数

 11.页面的前进后退

<template>
	<h2 class="about">about</h2>
	<button @click="backBtnClick">返回</button>
</template>

<script setup>
	import {useRouter} from 'vue-router'

	const router=useRouter()
	function backBtnClick()
	{
		router.back()
	}
</script>

12.动态添加路由

◼ 某些情况下我们可能需要动态的来添加路由:
 比如根据用户不同的权限,注册不同的路由;
 这个时候我们可以使用一个方法 addRoute;

let isAdmin=true
if(isAdmin)
{
	router.addRoute(	{path:"/admin",
	component:()=>import ("../Views/Admin.vue")
	},)
}

export default router

//动态管理路由
let isAdmin=true
if(isAdmin)
{
	router.addRoute(	
		{path:"/admin",
		component:()=>import ("../Views/Admin.vue")
	},)
	//添加vip页面
	router.addRoute(
		{path: "/home/vip",
		component: () => import("../Views/HomeVip.vue")
	});
}

动态添加二级路由 

 13.删除路由

name必须是唯一的

 14.路由导航守卫

比如在首页点击order按钮,需要进行拦截,如果已经登录则放行,否则跳转到登录页面

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

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

相关文章

QT 使用串口

目录 1.1.1 添加库&#xff0c;添加类 1.1.2 定义串口 1.1.3 搜索串口 1.1.4 设置和打开串口 1.1.5 读取数据 1.1.6 发送数据 1.1.7 关闭串口 1.1.1 添加库&#xff0c;添加类 首先&#xff0c;QT5 是自带 QSerialPort(Qt5 封装的串口类)这个类的&#xff0c;使用时…

单相锁相环原理与代码实战解释

单相锁相环程序原理如下图所示 单相锁相环原理 锁相环&#xff08;PLL&#xff09;是一种常用于同步、解调和信号处理等领域的电路或数字算法&#xff0c;其主要作用是将一个输入信号的相位与频率与参考信号进行精确的匹配。这里我们来简单解释一下单相锁相环的原理和分析。 …

自媒体行业下滑的5个标志

我是卢松松&#xff0c;洞察草根行业趋势&#xff01;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 未来大量的自媒体人将面临失业&#xff0c;80%的自媒体人收益没办法养活自己。前两天卢克文说自媒体的发展其实已经到达巅峰期&#xff0c;慢慢开始走下坡路了。我认…

Java集合框架的全面分析和性能增强

Java集合框架的全面分析和性能增强 &#x1f497;摘要&#xff1a;&#x1f497; 1. Java集合框架概述&#x1f497;1.1 Collection接口1.1.1 List接口1.1.2 Set接口1.1.3 Queue接口 &#x1f497;1.2 Map接口 &#x1f497;2. Java集合框架性能优化&#x1f497;2.1 选择合适的…

vue新学习 02 vue命令v-model,数据代理(作用域和作用域链),事件,监听,条件渲染,计算属性(也就是把操作属性的语句放到vue实例中)

双向绑定用命令v-model&#xff1a; v-bind的命令是单项去绑定data中的相关属性&#xff0c;此时的data是真正的data&#xff0c;并没有用变量声明的方式去接收vue实例对象&#xff0c;也就是例如用const vm new Vue({})。而是直接就采用了new Vue&#xff08;{}&#xff09;这…

戴琼海院士——人工智能正深刻地改变这个时代

原创 | 文 BFT机器人 2023世界人工智能大会将继续发挥“科技风向标、应用展示台、产业加速器、治理议事厅”的重要作用&#xff0c;打造“会议论坛、展览展示、评奖赛事、应用体验”四大核心内容&#xff0c;汇聚世界顶级科学家、企业家、政府官员、专家学者、国际组织、投资人…

Ssm+Mysql实现的Java Web酒店管理项目源码附带视频指导运行教程及需求文档

由ssmmysql实现的一款酒店管理系统&#xff0c;该系统实现了酒店客房预订管理的基本功能&#xff0c;还增加了图表显示统计结果的功能有需要的可以联系我分享给大家&#xff0c;下面是运行后的一些截图&#xff1a;

【密码学】四、SM4分组密码算法

SM4分组密码算法 1、概述1.1初始变量算法1.2密钥扩展算法1.3轮函数F1.3.1合成置换T1.3.2S盒 2、算法设计原理2.1非平衡Feistel网络2.2T变换2.2.1非线性变换τ2.2.2线性变换L2.2.3基础置换 2.3密钥扩展算法的设计 1、概述 SM4分组密码算法是一种迭代分组密码算法&#xff0c;采…

使用requests库发送http请求

1. get请求 # 导入requests库 import requests# 此处使用的接口地址为zrlog系统后台登录首页的地址 url "http://172.16.171.129/admin/login"# 通过requests库发送get请求 r requests.get(url url)# 以文本的方式返回响应内容 print(r.text)# 返回HTTP协议状态码…

qssh使用

到官网下载qssh的源码QSsh-botan-1&#xff0c;使用qtcreator打开后&#xff0c;直接编译&#xff0c;即可得到qssh的库 头文件将QSsh-botan-1\src\libs\ssh目录下的.h文件拷到include文件夹下&#xff0c;即为库头文件。 qssh有个问题&#xff0c;如果你将qssh的类放在子线程…

定时发朋友圈怎么设置?

目前微信作为最大的社交平台之一&#xff0c;吸引了众多使用者。你是否听过有些朋友感叹这么多微信号&#xff0c;需要每天手动发布朋友圈&#xff0c;任务很繁琐呢&#xff1f;是否希望可以事先设置好定时发送的功能&#xff0c;让朋友圈自动更新&#xff0c;省去手动发送的麻…

sqlserver row _number函数的运用

sql语句&#xff1a; select dept_id,stcd,row_number() over (partition by dept_id ORDER BY STCD) as 排序 from tb_station_config 这段代码是使用ROW_NUMBER()函数结合窗口函数的语法&#xff0c;用于给结果集中的每一行分配一个唯一的序号。 具体解释如下&#xff1a; R…

uniapp 小程序实时且持续获取定位信息(全局设置一次)(单页面监听定位改变)(不采用定时器)

本篇文章实现了uniapp 微信小程序实时获取定位信息,小程序打开即可持续获取定位信息, 位置更新也会触发相关自定义事件 优点 只设置一次不采用定时器的方式无需多个页面调用单独页面若想获取当前位置是否变化 可单独设置监听,并调用不同逻辑事件 原理: 采用uniapp推出的: un…

基于深度强化学习的DQN模型实现自动玩俄罗斯方块游戏(附详细代码讲解)

一、DQN&#xff08;Deep Q-Network&#xff09;方法概述 DQN&#xff08;Deep Q-Network&#xff09;是一种强化学习方法&#xff0c;通过结合Q-learning算法和深度神经网络来解决强化学习问题。它是深度强化学习的里程碑之一&#xff0c;由DeepMind在2013年提出&#xff0c;被…

【SQL Server】DBCC CHECKDB只是一个数据库维护命令吗?

日期&#xff1a;2023年7月27日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

【数据仓库】Apache Hive初体验

为什么使用Hive&#xff1f; 使用Hadoop MapReduce直接处理数据所面临的问题&#xff1a; 人员学习成本太高需要掌握ava语言MapReduce实现&#xff0c;复杂查询逻辑开发难度太大&#xff01; 1&#xff0c;使用Hive处理数据的好处操作接口采用类SQL语法&#xff0c;提供快速开发…

MUR2080CT- ASEMI二极管的特性和应用

编辑-Z 本文将详细介绍MUR2080CT二极管的特性和应用。首先&#xff0c;将介绍MUR2080CT二极管的基本结构和工作原理。然后&#xff0c;将探讨MUR2080CT二极管的特性&#xff0c;包括正向电压降、反向漏电流和反向恢复时间等。接下来&#xff0c;将介绍MUR2080CT二极管在电源、…

linux环境安装mysql数据库

一&#xff1a;查看是否自带mariadb数据库 命令&#xff1a;rpm -qa | grep mariadb 如果自带数据库则卸载掉重新安装 命令&#xff1a;yum remove mariadb-connector-c-3.1.11-2.el8_3.x86_64 二&#xff1a;将压缩文件上传到/user/local/mysql文件夹 或者直接下载 命令&a…

18款iPad绘画软件推荐!iPad必备生产力工具

每当提起iPad&#xff0c;少不了会听到坊间流传已久的那句话&#xff0c;「买前生产力&#xff0c;买后爱奇艺」&#xff0c;确实有不少奔着生产力入手iPad的人&#xff0c;最终让iPad沦为煲剧神器或泡面盖&#xff0c;但我们没必要因噎废食&#xff0c;因为总有人能克服iPad上…

互联网医院系统源码实现:打造现代化医疗服务平台

摘要 本文将介绍一个基于Python的简化版互联网医院系统的源码实现&#xff0c;主要包含用户注册与登录、医生信息管理、在线预约挂号、在线问诊与咨询、电子病历管理、在线支付与结算等功能。该源码实现仅为示例&#xff0c;实际开发中需要考虑更多的业务逻辑和安全性。 1. …