07
2020
04

vue路由钩子函数:

路由的钩子函数总结有6个


全局的路由钩子函数:beforeEach、afterEach


单个的路由钩子函数:beforeEnter


组件内的路由钩子函数:beforeRouteEnter、beforeRouteLeave、beforeRouteUpdate


 


模块一:全局导航钩子函数


1、vue router.beforeEach(全局前置守卫)


beforeEach的钩子函数,它是一个全局的before 钩子函数,


(beforeEach)意思是在 每次每一个路由改变的时候都得执行一遍。


它的三个参数:


to: (Route路由对象) 即将要进入的目标 路由对象 to对象下面的属性: path params query hash fullPath matched name meta(在matched下,但是本例可以直接用)


from: (Route路由对象) 当前导航正要离开的路由


next: (Function函数) 一定要调用该方法来 resolve 这个钩子。 调用方法:next(参数或者空) ***必须调用


next(无参数的时候): 进行管道中的下一个钩子,如果走到最后一个钩子函数,那么 导航的状态就是 confirmed (确认的)


next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。


应用场景:可进行一些页面跳转前处理,例如判断需要登录的页面进行拦截,做登录跳转!!


router.beforeEach((to, from, next) => {

    if (to.meta.requireAuth) {

        //判断该路由是否需要登录权限

        if (cookies('token')) {

            //通过封装好的cookies读取token,如果存在,name接下一步如果不存在,那跳转回登录页

            next()//不要在next里面加"path:/",会陷入死循环

        }

        else {

            next({

                path: '/login',

                query: {redirect: to.fullPath}//将跳转的路由path作为参数,登录成功后跳转到该路由

            })

        }

    }

    else {

        next()

    }

})

 

 


2、vue router.afterEach(全局后置守卫)


router.beforeEach 是页面加载之前,相反router.afterEach是页面加载之后


模块二:路由独享的守卫(路由内钩子)


你可以在路由配置上直接定义 beforeEnter 守卫:


 


const router = new VueRouter({

  routes: [

    {

      path: '/foo',

      component: Foo,

      beforeEnter: (to, from, next) => {

        // ...

      }

    }

  ]

 

这些守卫与全局前置守卫的方法参数是一样的。


模块三:组件内的守卫(组件内钩子)


1、beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave


 


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`

 

  }

 

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。