全局前置守御
运用router.beforeEach注册一个全局前置守御。
const router = new VueRouter({...})
router.beforeEach((to,from,next)=>{
//...
})
当一个导航触发时,全局前置守御根据建立顺序挪用。守御是异步剖析实行,此时导航在所有守御resolve完之前一向处于等待中。
每一个守御要领吸收三个参数:
*to:Route行将要进入的目的路由对象。
*from:Route当前导航正要脱离的路由。
*next:Function一定要挪用该要领来resolve这个钩子。实行结果依靠next要领的挪用参数。
next():举行管道中的下一个钩子。假如悉数钩子实行完了,则导航的状况就是confirmed(确认的)。
next(false):中缀当前的导航。假如浏览器的URL转变了(多是用户手动或许浏览器退却按钮),那末URL地点会重置到from路由对应的地点。
next('/')或许({path:'/'}):跳转到一个差别的地点。当前的导航被中缀,然后举行一个新的导航。你能够向next通报恣意位置对象,且许可设置诸如replace:true、name:'home'之类的选项以及任何用在router-link的to prop或router.push中的选项。
next(error):假如传入next的参数是一个Error实例,则导航会被停止且该毛病会被通报给router.onError()注册过的回调。
确保要挪用next要领,不然钩子就不会被resolved。
全局剖析首位
2.5.0新增:你能够用router.beforeResolve注册一个全局守御。这和router.beforeEach相似,区别是在导航被确认之前,同时在所有组件内守御和异步路由组件被剖析以后,剖析守御就被挪用。
全局后置钩子
和守御差别的是,这些钩子不会接收 next 函数也不会转变导航本。
router.afterEach((to,from)=>{
//...
})
路由独享的守御
你能够在路由设置上直接定义beforeEnter守御:
const router = new VueRouter({
routes:[
path:'/foo',
component:Foo,
beforeEnter:(to,from,next)=>{
//...
}
]
})
//这些守御与全局前置守御的要领参数是一样的。
组建内的守御
末了,能够在路由组件内直接定义以下路由导航守御:
*beforeRouterEnter
*beforeRouterUpdate
*beforeRouterLeave
const Foo = {
template:`...`,
beforeRouteEnter(to,from,next){
//在衬着组件的对应路由被confirm前挪用。
//不能猎取组件实例this
//因为当守御实行前,组件实例还没被建立。
},
beforeRouteUpdate(to,from,next){
//在当前路由转变,然则该组件被复用时挪用。
//举例来讲,关于一个带有动态参数途径/foo/:id,在/foo/1和/foo/2之间跳转的时刻。
//因为会衬着一样的Foo组件,因而组件实例会被复用。而这个钩子就会在这个情况下被挪用。
//能够接见组件实例this
},
beforeRouteLeave(to,from,next){
//导航脱离该组件的对应路由时挪用。
//能够接见组件实例this
}
}
beforeRouteEnter守御不能接见this,因为守御在导航确认前被挪用,因而行将上台的新组件还没被建立。不过能够经由过程传一个回调函数next来接见组建实例。在导航被确认的时刻实行回调,而且把组件实例作为回调要领的参数。
beforeRouteEnter(to,from,next){
next(vm=>{
//经由过程vm接见组件实例。
})
}
注重beforeRouteEnter是支撑next通报回调的唯一守御。关于beforeRouteEnter和beforeRouteLeave来讲,this已可用了,所以不支撑通报回调,因为没有必要了。
beforeRouteUpdate(to,from,next){
this.name = to.params.name;
next();
}
这个脱离守御一般用来制止用户在还未保留修正前倏忽脱离。该导航能够经由过程next(false)来作废。
beforeRouteLeave (to, from , next) {
const answer = window.confirm('Do you really want to leave? you have unsaved changes!')
if (answer) {
next()
} else {
next(false)
}
}
完全的导航剖析流程
1.导航被触发。
2.在失活的组件里挪用脱离守御。
3.挪用全局的 beforeEach 守御。
4.在重用的组件里挪用 beforeRouteUpdate 守御 (2.2+)。
5.在路由设置里挪用 beforeEnter。
6.剖析异步路由组件。
7.在被激活的组件里挪用 beforeRouteEnter。
8.挪用全局的 beforeResolve 守御 (2.5+)。
9.导航被确认。
10.挪用全局的 afterEach 钩子。
11.触发 DOM 更新。
12.用建立好的实例挪用 beforeRouteEnter 守御中传给 next 的回调函数。**