vue-router提供的导航守卫主要用来通过跳转或取消的方式守卫导航。简单来说,导航守卫就是路由跳转前、中、后过程中的一些钩子函数,可以在跳转过程中处理一些事情。
导航守卫分为三种分别是全局守卫、路由独享守卫、组件内部守卫。
全局守卫(两个钩子beforeEach,afterEach)
指路由实例上直接操作的钩子函数,特点是所有配置路由的组件都会触发。
const router = new VueRouter({ ... })router.beforeEach((to, from, next) => {// ...})
beforeEach是在路由跳转前触发,包括to,from,next三个参数,这个钩子作用主要是用于登录验证。
afterEach是在路由跳转完后触发,包括to,from两个参数。
路由独享守卫(一个钩子beforeEnter)
加载页面前所执行的钩子函数。
export default new Router({routes: [{name:"Test",path:"/test",component:Test,beforeEnter(to,from,next){if(to.path==="/test"){alert("请登录");next(false); // 禁止跳转}else{next()}}},],})
beforeEnter与全局的beforeEach完全相同,包括to、from、next三个参数。
组件内部守卫(三个钩子beforeRouterEnter,beforeRouterUpdate,beforeRouterLeave)
指在组件内部执行的钩子函数,和Vue的生命周期函数相识。export default{data(){//...},beforeRouteEnter (to, from, next) {//...
},beforeRouteUpdate (to, from, next) {//...},beforeRouteLeave (to, from, next) {//...}}
beforeRouteEnter
beforeRouteEnter钩子中next((vm)=>{})内接收的回调函数参数为当前组件的实例vm,这个回调函数是在生命周期mounted之后调用,他是所有导航守卫和生命周期函数最后执行的那个钩子。
beforeRouteEnter(to, from, next) {next(vm => {vm.$router.replace(from.path);})}
beforeRouteEnter是在路由进入组件之前调用,包括to,from,next三个参数。该钩子在全局守卫beforeEach和独享守卫beforeEnter之后,全局beforeResolve和全局afterEach之前调用,要注意的是该守卫内访问不到组件的实例this,是在beforeCreate生命周期前触发。
beforeRouteUpdate是在路由改变时调用,如果某组件被复用时调用,可以通过this访问实例。包括to,from,next三个参数。
beforeRouteLeave是在导航离开时调用,可以访问组件实例this,包括to,from,next三个参数。