由于路由权限题目,简朴的看了一下vue-router。整理了一下router的一个简朴历程
beforeEach
->canReuse
->canDeactivate
->canActivate
->deactivate
->afterEach
->activate
个中canDeactivate
| canActivate
| deactivate
| activate
这几个钩子触及组件复用的题目,所以有能够不会被挪用,然则当canReuse
返回false时,就肯定会被挪用了
一、vue-router构成
vue-router组件有三个部份
1.link:即v-link
2.view:元素指令,即<router-view></router-view>
3.router:中心部份
二、vue-router简朴的一个流程
1.url 变化
2.history监听(onChange事宜)
# 比方:
window.addEventListener(‘hashchange’, () => {})
3.挪用路由婚配( this._match)
# 会保留老的transition和新的transition
4.走一遍beforeEach
5.走startTransition最先进入transition的撕逼周期(也算是vue-router的中心地点)
# 这里会触及组件复用的题目
1).canReuse:挪用canReuse钩子
看当前的<vue-router>和将要跳转的<vue-router>之间有无可重用的组件
a/b/c
a/b/d => 可复用[a,b],须要烧毁[c],须要天生[d]
2).canDeactivate(c):挪用canDeactivate钩子
route: {
canDeactivate() {}
}
3).canActivate(d):挪用canActivate钩子
4).deactivate(c):挪用deactivate钩子
5)._afterEachHooks(c):挪用afterEach钩子
6).reuse([a,b]):挪用data钩子
7).activate(d) :挪用activate | data钩子
6.若activate(d),则挪用vue中的build要领,新天生component
三、两个运用场景
1.组件复用(a/b/:id)
此次遇到了相似(a/b/:id)如许的路由,这类路由一向都只是(:id)在变化,<vue-router>一向是被复用的,所以不会走canDeactive | canActivate | deactivate | activate,只会走_beforeEachHooks,_afterEachHooks、canReuse和reuse,也就是挪用router.beforeEach
,canReuse
,router.afterEach
和this.data
。所以data、canReuse、beforeEach和afterEach是vue-router总是会走的四个要领
固然没有被transition.abort()的前提下
new VueRouter().beforeEach(function (transition) {
if (transition.to.path === '/forbidden') {
transition.abort()
} else {
transition.next()
}
})
new VueRouter().afterEach(function (transition) {
console.log('胜利阅读到: ' + transition.to.path)
})
route: {
canReuse() {
return true
},
data() {
// TODO 没有被transition.abort()的时刻,会被挪用
}
}
2.路由切换
有一种场景是组件a切换到组件b时,想要先停留在a,等b获取了数据才举行切换,想做到这个能够运用waitForData(这个好像在文档中是没提到的,在activate要领顶用到了),在b组件作以下操纵:
route: {
data() {
// TODO 数据要求加载
},
waitForData: true //数据加载完在切换
}