Vue-router进阶:导航守御

全局前置守御

运用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 的回调函数。**

    原文作者:Lessong
    原文地址: https://segmentfault.com/a/1190000018224393
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞