Vue中导航守卫

导航守卫有三种:

1. 全局守卫:在router.js中,对router对象进行守卫设置beforeEach函数,router内所有的路径出入都要被守卫盘问

  router.beforeEach((to, from, next) => {
    if(to.path == '/community/academic') { //对全局进行守卫,对所有的路径都进行了盘问
      const answer = window.confirm("你还没哟登录,是否要登录?");
      if(answer){ //用户点击确定,将跳转到personnal路径页面
        next('/community/personal')
      }else {  //否则用户停留原来页面
        next(false);
      }
    }else {
      next()
    }
    
  })
export default router;

2. 路由独享守卫:在某个路由中设置beforeEnter函数,凡是要进入该路由的都会被守卫盘问

        {
          path: '/community/academic',
          name: 'academic',
          component: Academic,
          //路由独享守卫
          beforeEnter (to, from, next) {
            const anwser = confirm("你还没有登录,登录后才可以浏览,确定登录吗?");
            if(anwser){
              next({name: 'personal'}) //用户点击确定,跳转到登录页面
            }else {
              next(false); // 否则还停留在原来页面
            }
          }
        }

3. 组件内守卫:在组件中设置beforeRouteEnter函数,凡是要显示该路由组件的,都要被守卫盘问

 <script>
export default {
  beforeRouteEnter(to, from, next) {
    const anwser = confirm("你还没有登录,登录后才可以浏览,确定登录吗?");
    if (anwser) {
      next({ name: "personal" }); //用户点击确定,跳转到登录页面
    } else {
      next(false); // 否则还停留在原来页面
    }
  },
  data() {
    return {
      questionList: [
        {
          question: "什么时候才能瘦下来啊?",
          id: "001"
        },
        {
          question: "什么时候才能成为前端大佬?",
          id: "002"
        },
        {
          question: "什么时候才会成为大老板?",
          id: "003"
        },
        {
          question: "什么时候才能让狗子叫我一声大哥?",
          id: "004"
        },
        {
          question: "什么时候庞博才能瘦下来?",
          id: "005"
        }
      ]
    };
  }
};
</script>

还有一个beforeRouteLeave函数,当从有该路由组件的页面离开时,会执行该函数

  beforeRouteLeave (to, from, next) {
    const answer = confirm("你确定要离开吗?");
    if(answer) {
      next()
    }else {
      next(false) 
    }
  },

 

注意:beforeRouteEnter函数在data()函数之前,即,调用beforeRouterEnter函数时,组件还没有初始化。此时不能使用this来代表实例组件;

不过,to对象中的matched[0]是路由组件Academic的父路由组件Community;matched[1]是路由组件Academic自己。所以可以通过to.matched[1] 来代替实例。

注意:对于router-link标签而言,该页面的beforeRouterLeave函数在该标签的事件之前触发,准确的说,存在beforeRouterLeave时,该标签事件无效、不会触发。

解决办法:将该标签的事件所要处理的逻辑写在beforeRouterLeave函数之内,在进行调整之前,执行想要提前处理的逻辑

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值