Vue 路由 详细总结

Posted YuLong~W

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue 路由 详细总结相关的知识,希望对你有一定的参考价值。

路由

路由: 是指从源到目的地时,决定端到端路径的决策过程。 对于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路由组件 失活 时触发

以上是关于Vue 路由 详细总结的主要内容,如果未能解决你的问题,请参考以下文章

Vue 路由 详细总结

vue 如何获取路由详细内容信息

前端面试题总结

vue学习指南:第十一篇(详细) - Vue的 路由 第一篇 ( router )

Vue中实现路由跳转的三种方式详细分解

vue学习指南:第十二篇(详细) - Vue的 路由 第二篇 ( 路由按需加载(懒加载))