Vue中的导航守卫

全局守卫: 大门口的保安 router.beforeEach((to,from,next)=>{}) //所有路由进来之前 登录拦截 router.afterEach((to,from)=>{}) //所有路由进来之后 : 了解 路由独享守卫:各个楼(每一个公司:前台) 每一个路径就是可以定义一个路由的独享守卫: 角色的判断( A座是网易,B座是360 ) beforeEnter(to,from,next){} //守卫path 组件内部守卫:秘书 beforeRouteEnter(to,from,next){} //路由进来之前 无this beforeRouteUpdate(to,from,next){} //路由更新之前 beforeRouteLeave(to,from,next){} //路由离开之前 : 了解

  1. 全局守卫

//1. 全局前置守卫 ,进来之前进行一个拦截判断
router.beforeEach((to, from, next) => { //和后端的中间件非常类似
  // console.log('已经拦截,页面实例是不会创建的')
  /*
    to:到哪去(要访问哪个页面)
    from:来自哪
  */
  // console.log(from,'from')
  // console.log(to, 'to')
  if (to.path == '/login') { //如果访问的是login,直接放行 无需验证
    next()
    return
  }
​
​
  //要判断是否登录 ,假设登录标识 username在locastorage中存储了
  if (!localStorage.getItem('username')) { //取反为真代表未登录
    next('/login') //未登录跳转到登录页面
    return
  }
​
  next() //往下走:往下渲染 : 到这就代表已经登录了
})
​
router.afterEach( ()=>{
    console.log('全局后置守卫')
} )

2.路由独享守卫:各个楼(每一个公司:前台)

{
      path: '/list',
      component: list,
      name: 'list11',//为路由起个名称
      meta: {
        // title:'列表',
        time: '2021-11-30'
      },
      //假设 黑钻会员 1、黄钻会员 2 、蓝钻会员 3、普通会员 0
      // beforeEnter:function(){}
      //2. 路由独享守卫 ,只有充钱才可以进
      beforeEnter(to,from,next){ 
          //to,from,next和全局守卫的一样
          if( localStorage.getItem('membertype') == '0' ){
            alert('请充值')
            next('/pay')
            return
          }
          next() //如果到这,代表其实有会员
​
      }
    },

3.组件守卫

  • beforeRouteEnter 进来之前 list.vue

  beforeRouteEnter(to,from,next){
      //console.log('页面级的守卫',this) //比组件的生命周期还早,
      
      next(function(vm){
           console.log(vm,'这是this实例')
           vm.membertype = localStorage.getItem('membertype')
      })
  },
​
  • beforeRouteUpdate 路由更新 detail.vue

    本页面的某个链接,还是跳转到本页面,然后还要拿到路径上的参数,再去请求ajax

<template>
  <div>
    <h4>获取id为:{{$route.params.id}}</h4>
    <h4>商品的type类型为:{{$route.params.type}}</h4>
​
    <hr />
    <h3>猜你喜欢</h3>
    <router-link to="/detail/22/华为">华为mate30</router-link>
    <hr />
    <router-link to="/detail/33/三星">三星</router-link>
  </div>
</template>
​
<script>
export default {
  created() {
    //1.获取到详情页所需要的参数,
    //2. 请求接口拿到具体的详情数据
    console.log(this.$route.params, "created 中触发并发送ajax请求");
  },
  //路由更新,触发此生命周期函数
  beforeRouteUpdate(to,from,next) {
    next()
    // console.log(this.$route.params, "路由更新了");
    console.log(to,'路由更新----')
    //请求接口拿到具体的详情数据
  },
  beforeRouteLeave(to,from,next){//路由离开之前  : 了解
      // console.log('离开本页面')
      next()
  } 
};
</script>
​
<style>
</style>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值