Vue-Router
# Vue-Router
# 路由的hash
和history
区别特别重要
默认是hash
hash
:他的url
带着#
www.crucial.cn/#/xiaosong, hash
值为#/xiaosong
特点:hash
只出现在url
里面,不会出现在http
请求中,改变hash
值不会重新加载页面,但是浏览器不会自主地记录前后的路径变换,低版本IE
支持这种模式
原理:针对上面的浏览器不会自主记录前进和后退的路由,可以通过onhashchange
来监听
window.onhashchange = function(event){
console.log(event.oldURL, event.newURL);
let hash = location.hash.slice(1);
}
2
3
4
这样可以无须通过后端请求就可以监听事件变化从而来加载相应的代码,实现页面的前进和后退
history
:传统的路由分发模式,即用户输入一个url
,服务器接收url
并解析,然后处理逻辑,这样就是没有#
更好看一点,但是需要后台配置支持,否则出现404
API:
- 修改状态:
pushState
和replaceState
这两个API
也是当路径变化的时候不会访问后端 - 切换状态:
history.forward()
back
go
分别是前进后退跳转操作
对比
调用history.pushState
相比hash
的优势有
pushState
设置的url
可以是当前URL
同源的任意URL
,而hash
只可修改#
后面的部分,只能设置当前url
同文档的url
pushState
可以设置与当前相同的url
,可以将记录添加进栈中,而hash
设置的新值必须与原来的不一样才能入栈pushState
通过stateObject
参数可以添加任意类型的数据进记录中,而hash
只能添加短字符串pushState
可以额外设置title
属性hash
情况下后台没有对路由全覆盖也不会返回404
,而history
必须跟后端的url
一致才不会报404
# 如何获取hash
变化
监听
$route
// 监听,当路由发生变化的时候执行
watch: {
$route: {
handler: function(val, oldVal){
console.log(val);
},
// 深度观察监听
deep: true
}
},
2
3
4
5
6
7
8
9
10
window.location.hash
读取#
值,可读可写,写入是可以在不重载网页的前提下添加一条历史访问记录
# $route
和$router
的区别
$route
是“路由信息对象”,包括path
,params
,hash
,query
,fullPath
,matched
,name
等路由信息参数$router
是“路由实例”对象包括了路由的跳转方法,钩子函数等。
# Vue-router
路由钩子在生命周期的体现
全局钩子
router.beforeEach
全局前置守卫,进入路由之前(判断是否登录,没登录就重定向到登录页)router.beforeResovle
在beforeRouterEnter
调用之后调用router.afterEach
全局后置钩子,进入路由之后(一般用于跳转后滚动条回到顶部)
单个路由独享
- 不想全局配置守卫,可以为某些路由单独配置
export default [
{
path: '/',
name: 'login',
component: login,
beforeEnter: (to, from, next) => {
console.log('即将进入登录页面')
next()
}
}
]
2
3
4
5
6
7
8
9
10
11
组件内钩子
beforeRouteEnter
进入组件前触发- 注意点,
beforeRouteEnter
组件内还访问不到this
,因为该守卫执行前组件实例还没有被创建,需要传一个回调给next
来访问
- 注意点,
beforeRouteEnter(to, from, next) {
next(target => {
if (from.path == '/classProcess') {
target.isFromProcess = true
}
})
}
2
3
4
5
6
7
beforeRouteUpdate
当前地址改变且复用当前组件时触发,例如/foo/1 -> /foo/2
beforeRouteLeave
离开组件前触发
# params
和query
的区别
query
用this.$route.query.name
引入params
用this.$route.params.name
url
显示query
更像get
传参,params
类似post
query
在刷新时不会丢失参数,params
在刷新时会丢失参数
# Vue-router
跳转和location.href
有什么区别
使用 location.href= /url
来跳转,简单方便,但是刷新了页面;
使用 history.pushState( /url )
,无刷新页面,静态跳转;
引进 router
,然后使用 router.push( /url )
来跳转,使用了 diff
算法,实现了按需加载,减少了 dom
的消耗。
其实使用 router
跳转和使用 history.pushState()
没什么差别的,因为 vue-router
就是用了 history.pushState()
,尤其是在 history
模式下。