10-09-vue-router守卫难点代码

全局导航守卫

router文件夹中的index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import Index from "../views/Index"
Vue.use(VueRouter)

let router = new VueRouter({
  routes:[
    {path:"/",component:Index,name:"index"},
    {path:"/account",component:()=>import('../views/Account'),name: "account"},
    {path:"/order",component:()=>import('../views/Order'),name: "order"},
    {path:"/login",component:()=>import('../views/Login'),name: "login"},
    {path:"*",component:()=>import('../views/NotFound'),name: "notfound"},
  ]
})
// 在router对象上有一个方法,叫beforeEach(to,from,next)
// 全局导航守卫
router.beforeEach((to,from,next)=>{
  let isLogin = true;  // isLogin代表有没有登录  true代表登录  false代表没有登录
  // 在这里面就可以判断哪些路由可以放行,哪些路由不能放行
  // 配置一个名单
  let authRoutes = ["account","order"];
  if(authRoutes.indexOf(to.name) >=0 ){
    // 你要跳转的路由在名单中  需要判断你有没有登录
    if(!isLogin){
      // 没有登录
      next("/login");
    }else{
      // 登录了
      next();
    }
  }else if(to.name == "login"){  // 你直接访问登录有两种情况:1)登录时访问登录  2)没有登录时访问登录
    if(isLogin){
      // 登录后双访问登录
      next("/")
    }else{
      // 没有登录访问登录
      next();
    }
  }else{
    next();
  }
})

export default router;

单个路由守卫

router文件夹中的index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import Index from "../views/Index"
Vue.use(VueRouter)
let isLogin = true;
let router = new VueRouter({
  routes:[
    {path:"/",component:Index,name:"index"},
    {path:"/account",component:()=>import('../views/Account'),name: "account"},
    {path:"/order",component:()=>import('../views/Order'),name: "order"},
    {
      path:"/login",
      component:()=>import('../views/Login'),name: "login",
      beforeEnter(to,from,next){  // 这是一个单个路由的守卫
        // 可以单独地守卫这个/login
        if(isLogin){
          // 登录了   你登录了,你又访问登录路由
          next("/")
        }else{
          next();
        }
      },
    },
    {path:"*",component:()=>import('../views/NotFound'),name: "notfound"},
  ]
})

export default router;

组件中内的钩子(钩子中放代码)

router文件夹中的index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import Index from "../views/Index"
Vue.use(VueRouter)
let router = new VueRouter({
  routes:[
    {path:"/index",component:Index,name:"index"},
    {path:"/account/:userName",component:()=>import('../views/Account'),name: "account"},
    {path:"*",component:()=>import('../views/NotFound'),name: "notfound"},
  ]
})

export default router;

Account.vue文件
组件导航守卫:

  • beforeRouteEnter(to,from,next):当前页面被进入之前调用。里面的的方法只会执行一次。和mouted一样)如果多个路由对应此组件 ,此钩也是执行一次。在next中可以使用数据。
  • beforeRouteUpdate(fo,from,next):当前页面被复用了,参数改变了,会调用这个函数。
  • beforeRouteLeave(fo,from,next):当前页面即将离开了,会调用这个。即当前组件离开这个坑。
<template>
    <div>
        {{$route.params.userName}}个人账户
    </div>
</template>
<script>
    export default {
        name:"Account",
        data(){
            return{
                name:"lalala"
            }
        },
        // vue的生命周期的钩子函数
        mounted() {  // mounted钩子只执行一次  两个路由都对应了Account组件  此组件在vue会有复用机制
            // console.log(this.$route.params.userName)
        },
        // vue-router的生命周期的钩子函数  如果多个路由对应此组件  此钩也是执行一次
        beforeRouteEnter(to,from,next){ // 当进入到组件中就调用此钩子
            /*console.log("to:",to)
            console.log("from:",from)*/

            // console.log("beforeRouteEnter")
            console.log(to.params.userName)

            /*在这个钩子,如何得到data中的数据*/
            // console.log(this.name); // 此钩子中,this并不是当前组件对象
            next(vm=>{
                // console.log(vm.name)
            });

            // 这两个钩子,可以写守卫代码
        },
        beforeRouteUpdate(to,from,next){  // 不管多少个路由对应此组件,只有路由变化了,这个钩子必定执行
            // console.log("beforeRouteUpdate")
            console.log(to.params.userName)
            next();

            // 这两个钩子,可以写守卫代码
        },
        beforeRouteLeave(to,from,next){
            let flag = window.confirm("你确定要离开这个坑吗?");
            if(flag){
                next(); // 确定离开
            }
        }
    }
</script>

路由的元信息实现守卫

import Vue from 'vue'
import VueRouter from 'vue-router'
import Index from "../views/Index"
Vue.use(VueRouter)
let router = new VueRouter({
  routes:[
    {path:"/index",component:Index,name:"index",meta:{needLogin: false}},
    {path:"/profile",component:()=>import('../views/Profile'),name: "profile",meta:{needLogin:true}},
    {path:"/login",component:()=>import('../views/Login'),name: "login"},
    {path:"*",component:()=>import('../views/NotFound'),name: "notfound"},
  ]
})
let isLogin = true;   // 代表你当前有没有登录
// 全局导航守卫中可以得到上面路由配置的元信息
router.beforeEach((to,from,next)=>{
  console.log(to.meta.needLogin)
  if(!isLogin && to.meta.needLogin){
    // 需要登录: 1)登录了    2)没有登录
    // 你没有登录,但是此路由需要登录
    next("/login")
  }else{
    // 不需要登录
    next();
  }
})

export default router;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值