Vue-router---导航钩子(导航守卫)

ps:“导航”表示路由正在发生改变。

全局守卫

你可以使用 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('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: truename: 'home' 之类的选项以及任何用在 router-linkto proprouter.push 中的选项。

    • next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。

确保要调用 next 方法,否则钩子就不会被 resolved


全局后置钩子

你也可以注册全局后置钩子,然而和守卫不同的是,这些钩子不会接受 next 函数也不会改变导航本身:

router.afterEach((to, from) => {
  // ...
})

路由独享的守卫

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

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})

html代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <div id="app">
        <router-link to="/">首页</router-link>
        <router-link to="/login">登录</router-link>
        <router-link to="/manage">管理界面</router-link>
        <div>
            <router-view></router-view>
        </div>
    </div>
    <script src="js/vue.js"></script>
    <script src="js/vue-router.js"></script>
    <script src="js/gouzi.js"></script>
</body>
</html>


配置路由js代码:

/**
 * Created by luoxy on 2018/5/31.
 */
var routes = [
    {
        path:'/',
        component:{
            template:'<div><h4>首页</h4></div>'
        }
    },
    {
        path:'/login',
        component:{
            template:'<div><h4>登录</h4></div>'
        }
    },
    {
        path:'/manage',
        component:{
            template:'<div><h4>管理界面</h4></div>'
        }
    }
];

var router = new VueRouter({
   routes:routes
});

router.beforeEach(function(to,from,next){
    var logged_in =false;
    if(!logged_in && to.path=="/manage"){
        next('/login');
    }else{
        next();
    }
});
new Vue({
    el:'#app',
    router:router
});

猜你喜欢

转载自blog.csdn.net/qq_39111062/article/details/80521151