Vue-Router 是 Vue.js 官方的路由管理插件,是应用在单页面中的路由,通过对url的配置,实现url和组件的对应关系,
注: 单页面应用的意思是: 一个系统只加载一次资源,之后的操作交互、数据交互是通过路由、ajax来进行,页面并没有刷新。
vue-router 和传统页面跳转的区别是:
实现原理是:
SPA(single page application):单一页面应用程序,只有一个完整的页面;当它在加载页面的时候,不会加载整个页面的 内容,而只更新某个指定的容器中内容。单页面应用(SPA)的核心之一是更新视图而不重新请求页面.
目前在浏览器环境 中这一功能的实现主要有两种方式::Hash模式、History模式
一共有以下四种方式来实现:
<router-link to="需要跳转到页面的路径"> 浏览器在解析时,会解析成类似于a标签
this.$router.push( ) 跳转到指定的 url,并在 history 中添加记录,点击回退按钮返回到上一个页面
this.$router.replace( ) 跳转到指定的 url,但是 history 中不会添加记录, 点击回退按钮返回到上个页面 上个记录不存在
this.$touter.go(n) 向前或者后跳转 n 个页面,n 可以是正数也可以是负数
在 Vue 中配置路由共分为 5 个步骤,分别是:
1, 使用npm安装 vue-router 插件
2, 引用路由
import Router from 'Vue-Router'
3, 配置路由文件
进行路由映射配置,且在Vue实例中挂载创建的路由实例
var router = new Router({
routes:[
{
path:"/hello",
component:HelloWorld
},
{
path:"/wen",
component:HelloWen
]
})
new Vue({
el: '#app',
components: { App },
router,
template: '<App/>'
})
4, 视图加载的位置 ( 使用路由 )
默认 App.Vue 文件中加 <router-view></router-view>
5,跳转导航 helloword
<router-link to="/hello">helloword</router-link>(渲染出来的是 a 标签)
vue-router 共有四个,分别是:
全局守卫 router. beforeEach 进入路由之前执行
路由独享守卫 router.beforeEnter 如果你不想全局配置守卫的话,你可以为某些路由单独配置守卫
全局后置守卫 router.afterEach 和 beforeEach() 相比,这个router方法是在路由进入之后触发,并且少了一个参数next(),进入路由之后执行
全局解析守卫:router.beforeResolve 和 router.beforeEach 类似,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用。
Vue-Router 中的钩子函数主要分为 3 类:
1)全局钩子函数要包含 beforeEach ,afterEach,beforeResolve
beforeEach 函数有三个参数,分别是:
to: router 即将进入的路由对象
from: 当前导航即将离开的路由
next: 继续执行下一步
注意:next 方法必须要调用,否则钩子函数无法 resolved
2)单独路由独享钩子函数 beforeEnter,
使用方法与全局守卫相同 不同的是:全局守卫可以作用于全局,路由独享守卫只作用于被设置守卫的路由
3)组件内钩子
beforeRouterEnter,
beforeRouterUpdate,
beforeRouterLeave
beforeRouteEnter 进入路由之前执行的函数,写在组件里可根据路由进行页面判断或传值。
beforeRouteUpdate 在当前路由改变,但是依然渲染该组件是调用就是 当一个组件有二级导航的时候,点击二级导航的时候导航路径更新了,会触发路由钩子函数beforeRouteUpdate。
beforeRouteLeave 离开路由之前执行的函数,可用于页面的反向传值,页面跳转。
Vue-Router 传参可以分为两大类,分别是编程式的导航 router.push 和声明式 的导航<router-link>,
编程式导航和声明式导航都有两种类型字符串类型和对象类型
1)编程式的导航 router.push
编程式导航传递参数有两种类型:字符串、对象。
this.$router.push("home")
对象: 想要传递参数主要就是以对象的方式来写,分为两种方式:命名路由、查询参数,下面分别说明两种方式的用法和注意事项。
命名路由 : 使用name 命名路由这种方式传递的参数,但如果在目标页面刷新是会出错的
this.$router.push({name:" news",params:{userId:123})
注意: 和 name 配对的式 params,和 path 配对的是 query
this.$router.push({path:" /news',query:{uersId:123})
接收参数 this.$route.query
2)声明式导航 <router-link>
字符串: 声明式的导航和编程式是一样的
<router-link to="news">click to news page</router-link>
命名路由 :
<router-link :to:"{name:'news',params:{userid:1111}}">click to news page</route-link>
查 询 参 数:
<router-link :to="{ path: '/news', query: { userId: 1111}}">click to news page</router-link>
把某个模式匹配到的所有路由,全都映射到同一个组件,并使用这个组件来进行渲染.
动态路径参数,使用 “冒号” 开头,路径参数使用冒号标记,当匹配到一个路由时,参数会被设置到this.$router.params 中,并且可以在每个组件中使用.
区别有以下三点:
区别是: $route是获取路由信息的一个对象, $router 的作用是进行路由跳转的
具体点说就是
$route 是“路由信息对象”,包括 path,params,hash,query,fullPath, matched,name 等路由信息参数。
$route是获取路由信息的一个对象,废话!说具体点!
这个东西它既然是获取路由信息滴,那么什么是路由信息,怎么获取,又为什么要获取呢?
举个栗子:
在实际项目中,我们经常会用到路由信息,比如:
$route.path
字符串,等于当前路由对象的路径,会被解析为绝对路径,如 “/shops/goods” 。
$route.params
对象,包含路由中的动态片段和全匹配片段的键值对 。
$route.query
对象,包含路由中查询参数的键值对。例如,对于 /home/news/detail/01?favorite=yes ,会得到$route.query.favorite == ‘yes’ 。
$route.router
路由规则所属的路由器(以及其所属的组件)。
$route.matched
数组,包含当前匹配的路径中所包含的所有片段所对应的配置参数对象。
$route.name
当前路径的名字,如果没有使用具名路径,则名字为空。
所以我们可以通过$route.来获取到路由里的这些信息为自己所用。这就是 $route!
$router 为 VueRouter 的实例,相当于一个全局的路由器对象,里面含有很 多 属 性 和 子 对 象 , 例 如 history 对 象 , 经 常 用 的 跳 转 链 接 就 可 以 用 this.router.push 会往 history 栈中添加一个新的记录。返回上一个 history 也是使用$router.go 方法
active-class是 vue-router模块中 router-link 组件中的属性,主要作用是用来实现选中
样式的切换。
在 vue-router 中使用 active-class 有两种方式:
1. 在 router-link 中写入 active-class
active-class 选择样式时根据路由中的路径(to=“/home”)去匹配,然后显示
<router-link to="/home" class="menu-home" active-class="active">首页</router-link>
2. 直接在路由 js 文件中配置 linkActiveClass
export default new Router({
linkActiveClass: 'active',
})
<div class="menu-btn">
<router-link to="/" class="menu-home" active-class="active">首页</router-link>
</div>
<div class="menu-btn">
<router-link to="/my" class="menu-my" active-class="active">我的</router-link>
</div>
因为 to="/" 引起的,active-class 选择样式时根据路由中的路径去匹配,然后显示。
例如在 my 页面中,路由为 localhost:8081/#/my,那么 to="/”和 to="/my"都可以匹配到,所以
都会激活选中样式
1. 在 router-link 中写入 exact
<router-link to="/" class="menu-home" active-class="active" exact>首页</router-link>
2. 在路由中加入重定向
<router-link to="/" class="menu-home" active-class="active" exact>首页</router-link>
{path: '/', redirect: '/home' }
vue-router有两种模式,hash模式和history模式,它们各自的优缺点是:
hash模式优缺点:
优点
只需要前端配置路由表, 不需要后端的参与
兼容性好, 浏览器都能支持
hash值改变不会向后端发送请求, 完全属于前端路由
缺点
hash值前面需要加#, 不符合url规范,也不美观
history 模式:
优点:
提供了两个新方法: pushState(), replaceState()可以对浏览器历史记录栈进行修改,以 及 popState 事件的监听到状态变更
缺点:
兼容性不如 hash,且需要服务端支持重定向,否则一刷新页面就404了
兼容性比较差, 利用了 HTML5 History对象中新增的 pushState() 和 replaceState() 方法,需要特定浏览器的支持.
路由常用的配置属性有以下六种:
path:跳转路径
component:路径相对于的组件
name:命名路由
children:子路由的配置参数(路由嵌套)
props:路由解耦
redirect:重定向路由