Vue 路由 详细总结_vue $route-程序员宅基地

技术标签: router  路由器  Vue  前端  vue.js  javascript  

路由

路由: 是指从源到目的地时,决定端到端路径的决策过程。 对于VueRouter而言,路由就是根据一个请求路径选中一个组件进行渲染的决策过程。

一个路由(route)就是一组 映射关系(key - value),多个路由需要 路由器(router) 进行管理。

前端路由:key是路径,value是组件

Vue Router :是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。

  • route:首先它是个单数,译为路由,可以理解为单个路由或者某一个路由;例如Home按钮 => home内容, 这是一条route,about按钮 => about 内容, 这是另一条路由。
  • routes:它是个复数,表示多个的集合才能为复数;可以理解为多个路由的集合,官方定义routes是一个数组;所以routes 表示多个路由(route)的集合
  • router:译为路由器,上面都是路由,这个是路由器,可以理解为一个容器包含上述两个或者说它是一个管理者,负责管理上述两个;举个常见的场景的例子:当用户在页面上点击按钮的时候,这个时候router就会去routes中去查找route,就是说路由器会去路由集合中找对应的路由

VueRouter包括三个主要组成部分 —— VueRouter、router-view和 router-link

  • VueRouter :路由器类,根据路由请求在路由视图中动态渲染选中的组件
  • router-link:路由链接组件,声明用以提交路由请求的用户接口
  • router-view:路由视图组件,负责动态渲染路由选中的组件

在这里插入图片描述

基本使用

在这里插入图片描述

1. 安装vue-router,命令:npm i vue-router

2. 应用插件:Vue.use(VueRouter)

3. 创建路由器实例:编写router配置项

路由器完全依赖于路由表来分发路由请求,因此创建路由器实例时,需要使用 routes配置项 来声明 请求路径(path)和组件(component) 的对应关系 —— 记录这一映射关系的对象,在VueRouter中被称为路由记录(RouteRecord)。 路由器将根据routes路由记录数组来构造路由表。

//引入VueRouter
import VueRouter from 'vue-router'
//引入Luyou 组件
import About from '../components/About'
import Home from '../components/Home'

//创建router实例对象,去管理一组一组的路由规则
const router = new VueRouter({
    
	routes:[
		{
    
			path:'/about',
			component:About
		},
		{
    
			path:'/home',
			component:Home
		}
	]
})

//暴露router
export default router

4. 将路由器注入Vue实例

如果在一个Vue实例的模板中需要使用 router-linkrouter-view 组件,需要首先向这个Vue实例注入路由器对象,因为这两个组件都依赖于路由器对象:

在这里插入图片描述
在创建Vue实例时,使用router配置项将路由器对象注入Vue实例的$router属性,例如:

const myrouter = new VueRouter({
    ...})
const vm = new Vue({
     router: myrouter })

5. 声明路由请求接口:

路由链接组件(router-link) 为用户提供了提交路由请求的交互接口。 使用 to属性 来声明链接组件的目标路径。当用户点击链接组件时,组件 向路由器提交向目标路径的路由请求。在模板中,使用 标签声明路由链接元素。

实现切换(active-class可配置高亮样式):

<router-link active-class="active" to="/about">About</router-link>

6. 声明路由出口:

路由视图组件(router-view) 为路由器($router)提供了所选中组件的渲染出口。在模板中,使用标签<router-view>声明路由视图元素。

<router-view></router-view>

注意点:

  1. 路由组件通常存放在pages文件夹,一般组件通常存放在components文件夹。
  2. 通过切换,“ 隐藏 ” 了的路由组件,默认是被销毁掉的,需要的时候再去挂载。
  3. 每个组件都有自己的$route属性,里面存储着自己的路由信息。
  4. 整个应用只有一个router,可以通过组件的$router属性获取到。

多级路由

  1. 配置路由规则,使用 children配置项

    routes:[
    	{
          
    		path:'/about',
    		component:About,
    	},
    	{
          
    		path:'/home',
    		component:Home,
    		children:[ //通过children配置子级路由
    			{
          
    				path:'news', //此处一定不要写:/news
    				component:News
    			},
    			{
          
    				path:'message',//此处一定不要写:/message
    				component:Message
    			}
    		]
    	}
    ]
    
  2. 跳转(要写 完整路径):

    <router-link to="/home/news">News</router-link>
    

命名路由

作用:可以简化路由的跳转

使用:

  1. 给路由命名:

    {
          
    	path:'/demo',
    	component:Demo,
    	children:[
    		{
          
    			path:'test',
    			component:Test,
    			children:[
    				{
          
                        name:'hello' //给路由命名
    					path:'welcome',
    					component:Hello,
    				}
    			]
    		}
    	]
    }
    
  2. 简化跳转:

    <!--简化前,需要写完整的路径 -->
    <router-link to="/demo/test/welcome">跳转</router-link>
    
    <!--简化后,直接通过名字跳转 -->
    <router-link :to="{name:'hello'}">跳转</router-link>
    
    <!--简化写法配合传递参数 -->
    <router-link 
    	:to="{
    		name:'hello',
    		query:{
    		   id:666,
               title:'你好'
    		}
    	}"
    >跳转</router-link>
    

路由参数

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. 接收参数:

$route.query.id

$route.query.title

props配置:

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

{
    
	name:'xiangqing',
	path:'detail/:id',
	component:Detail,

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

	//第二种写法:props值为布尔值,布尔值为true,则把路由收到的所有params参数通过props传给Detail组件
	// props:true
	
	//第三种写法:props值为函数,该函数返回的对象中每一组key-value都会通过props传给Detail组件
	props(route){
    
		return {
    
			id:route.query.id,
			title:route.query.title
		}
	}
}

params参数

1. 配置路由,声明接收params参数

{
    
	path:'/home',
	component:Home,
	children:[
		{
    
			path:'news',
			component:News
		},
		{
    
			component:Message,
			children:[
				{
    
					name:'xiangqing',
					path:'detail/:id/:title', //使用占位符声明接收params参数
					component:Detail
				}
			]
		}
	]
}

2. 传递参数

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

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

3. 接收参数:

$route.params.id

$route.params.title

路由导航


标签导航

标签导航<router-link><router-link>是通过转义为<a></a>标签进行跳转,其中router-link标签中的to属性会被转义为a标签中的href属性

1、不带参数

<router-link :to="{name:'home'}"> 
<router-link :to="{path:'/home'}"> //name,path都行, 建议用name 

注意:router-link中链接如果是 ‘/’ 开始就是从根路由开始,如果开始不带 ‘/’ ,则从当前路由开始

2、带参数

1)params传参数 (类似post)

<router-link :to="{name:'home', params: {id:1}}"> 
  • 路由配置 path: “/home/:id” 或者 path: “/home:id”
  • 不配置path ,第一次可请求,刷新页面id会消失
  • 配置path,刷新页面id会保留
  • html 取参 $route.params.id
  • script 取参 this.$route.params.id

2)query传参数 (类似get,url后面会显示参数)

<router-link :to="{name:'home', query: {id:1}}"> 
  • 路由可不配置
  • html 取参 $route.query.id
  • script 取参this.$route.query.id

<router-link>的replace属性:

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

浏览器的历史记录有两种写入方式:

  • push追加 历史记录
  • replace替换 当前记录

路由跳转时候默认为push方式,开启replace方式:<router-link replace .......>News</router-link>


编程式导航

作用:不借助<router-link>实现路由跳转,让路由跳转更加灵活

this.$router 表示全局路由器对象,项目中通过router路由参数注入路由之后,在任何一个页面都可以通过此属性获取到路由器对象,并调用其push()、go()等方法。

通过this.$router.push()这个方法来实现编程式导航,也可以实现参数传递,这种编程式导航一般是用于按钮点击之后跳转

1、不带参数

this.$router.push('/home')
this.$router.push({
    name:'home'})
this.$router.push({
    path:'/home'})

2、带参数

1) query传参 (get请求)

this.$router.push({
    name:'home',query: {
    id:'1'}})
this.$router.push({
    path:'/home',query: {
    id:'1'}})
  • html 取参 $route.query.id
  • script 取参 this.$route.query.id

2)params传参

this.$router.push({
    name:'home',params: {
    id:'1'}}) // 只能用 name
  • 路由配置 path: “/home/:id” 或者 path: “/home:id”
  • 不配置path,第一次可请求,刷新页面id会消失
  • 配置path,刷新页面id会保留
  • html 取参 $route.params.id
  • script 取参 this.$route.params.id

其它用法:

  • 前进:this.$router.forward()
  • 后退:this.$router.back()
  • 可前进也可后退:this.$router.go(n)

路由守卫

作用:对路由进行权限控制

分类:全局守卫、独享守卫、组件内守卫

1、全局守卫:

//全局前置守卫:初始化时执行、每次路由切换前执行
router.beforeEach((to,from,next)=>{
    
	console.log('beforeEach',to,from)
	if(to.meta.isAuth){
     //判断当前路由是否需要进行权限控制
		if(localStorage.getItem('school') === 'xiyou'){
     //权限控制的具体规则
			next() //放行
		}else{
    
			alert('暂无权限查看')
		}
	}else{
    
		next() //放行
	}
})

//全局后置守卫:初始化时执行、每次路由切换后执行
router.afterEach((to,from)=>{
    
	console.log('afterEach',to,from)
	if(to.meta.title){
     
		document.title = to.meta.title //修改网页的title
	}else{
    
		document.title = 'vue_test'
	}
})

2、独享守卫:

beforeEnter(to,from,next){
    
	console.log('beforeEnter',to,from)
	if(to.meta.isAuth){
     //判断当前路由是否需要进行权限控制
		if(localStorage.getItem('school') === 'xiyou'){
    
			next()
		}else{
    
			alert('暂无权限查看')
		}
	}else{
    
		next()
	}
}

3、组件内守卫:

//进入守卫:通过路由规则,进入该组件时被调用
beforeRouteEnter (to, from, next) {
    

},
//离开守卫:通过路由规则,离开该组件时被调用
beforeRouteLeave (to, from, next) {
    

}

路由的实现模式

  1. 对于一个url来说,什么是hash值?—— #及其后面的内容就是hash值。
  2. hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器。

在这里插入图片描述

Vue 中,它是通过 mode 这一参数控制路由的实现模式:

const router=new VueRouter({
    
    mode:'history',
    routes:[...]
})

mode 参数:

  • 默认 hash
  • history。如果浏览器不支持 history 新特性,则采用 hash
  • 如果不在浏览器环境下,就采用 abstract(Node环境下)

hash模式:

  1. 地址中永远带着#号,不美观 。
  2. 若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法。
  3. 兼容性较好。
mode:"hash"  多了 “#”  --- 默认的

http://localhost:8080/#/login

history模式:

  1. 地址干净,美观 。
  2. 兼容性和hash模式相比略差。
  3. 应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题。
mode:"history" 

http://localhost:8080/login

扩展知识:


1、缓存路由组件:

作用:让不展示的路由组件保持挂载,不被销毁。

具体编码:

<keep-alive include="News"> 
    <router-view></router-view>
</keep-alive>

2、两个新的生命周期钩子:

作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。

具体分为:

  1. activated路由组件 被激活 时触发
  2. deactivated路由组件 失活 时触发
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45654582/article/details/122147403

智能推荐

星露谷联机-蒲公英组网_贝锐蒲公英 星露谷-程序员宅基地

文章浏览阅读628次,点赞7次,收藏9次。通过贝锐账号和密码登录蒲公英访问端,登录成功后将会为当前设备自动分配一个UID。当多个设备登录同一账号后将自动组网,无需进行组网设置。(只需要把贝锐账号共享给游戏好友登录客户端即可完成组网):打开蒲公英,进入星露谷打开游戏—合作—加入—加入局域网游戏,输入农场主的局域网地址,耐心等待一会,就可以快乐地开始游戏啦!:打开蒲公英,进入星露谷打开游戏—合作—加载,打开联机农场。注意:一定要从“合作”进入,否则是单机模式,好友无法进入。_贝锐蒲公英 星露谷

袋鼠云数栈开发平台使用问题汇总--持续更新_has failed the maximum allowable number of times-程序员宅基地

文章浏览阅读903次。数据同步任务报错:Server returned HTTP response code:401 for url查看easymanager,发现zkfc的2个节点挂掉,使用滚动重启后恢复健康状态,但是再次执行任务还是报错。分析发现是从服务器拉取日志报错,实际后台任务已经执行完成,数据量也能对上。错误1:Could not establish connection to jdbc:hive...Read time out 或者 后台接口调用异常,状态码:402,说明信息:无法调用接口问题排._has failed the maximum allowable number of times

《编程珠玑(第2版•修订版)》—附录A 算法分类-程序员宅基地

文章浏览阅读123次。本节书摘来自异步社区《编程珠玑(第2版•修订版)》一书中的附录A 算法分类,作者【美】Jon Bentley,更多章节内容可以访问云栖社区“异步社区”公众号查看。附录A 算法分类编程珠玑(第2版•修订版)本书涵盖了大学算法课中的许多内容,但侧重点不同——我们更强调应用和编码,而不强调数学分析。本附录将有关内容组织成更标准的提纲形式。A.1 排序问题定..._编程珠玑(第2版 修订版)

安装VMware和安装linux_vmware9安装教程-程序员宅基地

文章浏览阅读525次。安装VMware和安装linux_vmware9安装教程

【python】OSError: Unable to open file (file signature not found)-程序员宅基地

文章浏览阅读1.4k次。保存了SVM的模型,其实本来最开始保存的是.gz格式,然后换成了.h5。从上面这个链接得知大概就是因为h5文件并不是完整的。然后就又改成了保存.gz格式,用load导入模型。_oserror: unable to open file (file signature not found)

Godot3游戏引擎入门之六:制作TileMap瓦片地图_godot3 tilemap-程序员宅基地

文章浏览阅读4.3k次,点赞13次,收藏24次。一、前言收到一个高兴的消息: 2018 年 Github 最新统计出炉, Godot 是所有项目里增长速度最快的第三位!所以,我还是非常看好它的,哈哈!链接在此: Fastest growing open source projects ,截图如下:吹逼结束,本着承上启下的精神,本篇一起来学习并打造一个“美丽壮观”的游戏世界。使用的工具是 Godot 中的 TileMap 瓦片..._godot3 tilemap

随便推点

转载一些文章_基础知识cyc2018-程序员宅基地

文章浏览阅读543次。收藏公众号CyC2018每日一更,都是面试常见问题 大家可以自行关注微信公众号 CyC2018 作者很棒03-06 非递归实现树的前中后序遍历_基础知识cyc2018

ffmpeg avcodec_send_packet 返回值 -1094995529 错误信息 Invalid data found when processing input-程序员宅基地

文章浏览阅读1.6k次。ffmpeg avcodec_send_packet 返回值 -1094995529 错误信息 Invalid data found when processing input

2023年终总结-程序员宅基地

文章浏览阅读1.5k次,点赞46次,收藏37次。2023年终总结

linux sftp命令连接数,linux记录sftp命令-程序员宅基地

文章浏览阅读1.5k次。使用以下配置方法不需要配置chroot。编辑sshd_config文件vi /etc/ssh/sshd_config增加:Subsystem sftp /usr/libexec/openssh/sftp-server -l VERBOSE然后重启sshdservice sshd restart对应的sftp命令会被记录在/var/log/messages如果不想记录到messages文件..._subsystem sftp /usr/libexec/openssh/sftp-server -l info -f auth

wcopy nfc pro智能读卡工具软件_手机NFC复制小区用的门禁卡-程序员宅基地

文章浏览阅读3.9k次。我们说一说目前的门禁卡到底有哪些类型呢?门禁卡一般分为:ID卡和IC卡。而EM卡、M1卡、CPU卡等等,都是这两种卡的细分。它们能够开门,都是基于RFID感应的原理来实现开门的。我们看一张图,在这张图中,能够看到一个数据名词,频率:ID卡的工作频率为125KHz频率,而IC卡的工作频率为13.56MHz,显然因为IC卡的频率高,所以,它的安全性比较高。小区基本上选择IC卡的概率会更高一..._wcopynfcpro教程

洞悉物联网发展1000问之智能汽车会成为下一代移动智能终端吗?-程序员宅基地

文章浏览阅读1.2k次。当智能手机走向巅峰状态,不仅仅体现在对于社会经济的颠覆性改变,更是让我们发现原来某个智能产品居然有如此神奇而巨大的威力!那么物联网时代,类智能手机这样的智能硬件将越来越多,哪一项会带来更加颠覆的效果呢?目前我们一致认为智能汽车会是这样的产品!不妨研究下当前车联网发展的真实状况如何?车联网将汽车组成数据互动网络,通过搭设大量的传感器和先进的通信技术,对包括车辆、公路、人、环境等..._车联网使汽车成为下一代移动智能终端

推荐文章

热门文章

相关标签