1)全局钩子函数
        定义在全局的路由对象中,主要如下:
        beforeEach  在路由切换开始时调用
        afterEach     在每次路由切换成功进入激活阶段时调用
2)单独路由独享的钩子
      可以在路由配置上直接定义beforeEnter钩子
3)组件的钩子函数:
           定义在组件的router选项中
           beforeRouteEnter   
           beforeRouteUpdate
           beforeRouteLeave
 
前置钩子
// to :是要去的那个页面 路由相关的参数 (表示 将要访问的那个路由对象)
// from :从哪个页面即将离开 (从哪个路由对象,跳转而来)
// next :next 是一个函数,就相当于 Node 里面 express 中的 next 函数 (代表放行)
       // next() 表示放行 next('/login') 表示强制跳转到login页
// 注意: 这里的 router 就是 new VueRouter 得到的 路由对象
router.beforeEach((to, from, next) => {
    if (to.matched.some(item => item.meta.may)) {
        let id = window.localStorage.getItem("id")
        if (id) {
            next()
        } else {
            next({ name: "login" })
        }
    } else {
        next()
    }
})
这三个参数 to 、from 、next 分别的作用:
to: Route,代表要进入的目标,它是一个路由对象
from: Route,代表当前正要离开的路由,同样也是一个路由对象
next: Function,这是一个必须需要调用的方法,而具体的执行效果则依赖 next 方法调用的参数
  next():进入管道中的下一个钩子,如果全部的钩子执行完了,则导航的状态就是 confirmed(确认的)
  next(false):这代表中断掉当前的导航,即 to 代表的路由对象不会进入,被中断,此时该表 URL 地址会被重置到 from 路由对应的地址
  next(‘/’) 和 next({path: ‘/’}):在中断掉当前导航的同时,跳转到一个不同的地址
  next(error):如果传入参数是一个 Error 实例,那么导航被终止的同时会将错误传递给 router.onError() 注册过的回调
 
注意:next 方法必须要调用,否则钩子函数无法 resolved
 
后置钩子
router.afterEach((to,from) => {
    if(to.meta && to.meta.title){
        document.title = to.meta.title
    }else{
        document.title = "666"
    }
})
 
单独路由钩子
{
    path: '/home',
    name: 'home',
    component: Home,
    beforeEnter(to, from, next) {
        if (window.localStorage.getItem("id")) {
            next()
        } else {
            next({ name: "login" })
        }
    }
}
 
组件内的钩子 (注意: 想在vue项目中是用这几个钩子函数时, 必须是路由发生变化时才会生效)
beforeRouteEnter(to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
},
beforeRouteUpdate(to, from, next) {
    // 在当前路由改变,但是依然渲染该组件是调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
},
beforeRouteLeave(to, from ,next) {
    // 导航离开该组件的对应路由时被调用
    // 可以访问组件实例 `this`
}
 
 
每个守卫方法接收三个参数:
to: Route: 即将要进入的目标 路由对象
from: Route: 当前导航正要离开的路由
next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: true、name: 'home' 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项。
next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。

 

 
 
 
 
 
 
 
 
 
 
 
vue-router钩子