导航守卫的使用记录和beforeEach( )死循环的问题

前置导航守卫beforeEach的使用

js 复制代码
import Vue from 'vue'
import VueRouter from 'vue-router'
// 进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

Vue.use(VueRouter)

// 路由表
const routes = [
  {
    path: "/",
    redirect: "/home",
  },
  {
    path: '/home',
    name: 'Home',
    component: () => import('../views/Home.vue')
  },
  {
    path: '/login',
    name: 'Login',
    component: () => import('../views/Login.vue')
  },

]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

// 前置导航守卫
router.beforeEach((to,from,next) => {
  // 开启进度条
  NProgress.start()
  
  if ( localStorage.getItem('Token') ) { // 如果已经登录,就直接放行
    next()
  }else{ // 如果没有登录,需要判断要跳转的页面是否是登录页,如果是就直接放行,如果不是就跳到登录页
    if( to.path == '/login' ) {
      next()
    }else {
      next('/login')
    }
  }
})

export default router

在进行拦截之前要在登录成功后把用户token存储到localStorage中

js 复制代码
    login() {  
      this.$refs.loginForm.validate(async valid => {  
        if (valid) { 
          let { password,username,key } = this.loginForm;
          let res = await PassWordlogin({
            'password': Encrypt(password),//密码(需要使用AES加密)
            'username': Encrypt(username),//用户名(需要使用AES加密)
            'key': this.captcha.key,//图形验证码中随机UUID
            'captcha': key
          })
          if( res.code != '200' ) return
          // 登录成功后存储localStorage,并且跳转路由
          localStorage.setItem('Token',res.data);
          this.$router.push('/')

        } else {  
          console.log('表单验证失败!');  
          return false;  
        }  
      });  
    },

当时在做这一部分时遇到一个问题,就是beforeEach出现了死循环,导致死循环的代码如下

javascript 复制代码
router.beforeEach((to, from, next) => {
  if (localStorage.getItem('token') === null) {
    console.log('出现死循环了');
    // 重定向到登录页面去
    next({
      path: '/login'
    });
  } else {
    next();
  }
});

router.beforeEach( )死循环的问题

上面代码会导致页面是空白的,猜测是因为当我们刷新 http://localhost:8080/ 后先会执行 router.beforeEach( ) 该方法,因为我们还没有登录,所以获取到本地存储的token为null,会重定向到 /login 登录页面去,重定向到这个页面就会再次执行beforeEach( )方法,造成死循环。把它改成下面这种就可以了

javascript 复制代码
router.beforeEach((to, from, next) => {
  if ( localStorage.getItem('Token') ) { // 如果已经登录,就直接放行
    next()
  }else{ // 如果没有登录,需要判断要跳转的页面是否是登录页,如果是就直接放行,如果不是就跳到登录页
    if( to.path == '/login' ) {
      next()
    }else {
      next('/login')
    }
  }
});
相关推荐
橘子编程9 分钟前
JavaScript与TypeScript终极指南
javascript·ubuntu·typescript
王夏奇15 分钟前
python中的__all__ 具体用法
java·前端·python
叫我一声阿雷吧1 小时前
JS 入门通关手册(45):浏览器渲染原理与重绘重排(性能优化核心,面试必考
javascript·前端面试·前端性能优化·浏览器渲染·浏览器渲染原理,重排重绘·reflow·repaint
大家的林语冰1 小时前
《前端周刊》尤大开源 Vite+ 全家桶,前端工业革命启动;尤大爆料 Void 云服务新产品,Vite 进军全栈开发;ECMA 源码映射规范......
前端·javascript·vue.js
jiayong231 小时前
第 8 课:开始引入组合式函数
前端·javascript·学习
田八1 小时前
聊聊AI的发展史,AI的爆发并不是偶然
前端·人工智能·程序员
zhanghongbin011 小时前
AI 采集器:Claude Code、OpenAI、LiteLLM 监控
java·前端·人工智能
IT_陈寒2 小时前
Python的列表推导式里藏了个坑,差点让我加班到凌晨
前端·人工智能·后端
吴声子夜歌2 小时前
ES6——正则的扩展详解
前端·mysql·es6
天若有情6732 小时前
【C++原创开源】formort.h:一行头文件,实现比JS模板字符串更爽的链式拼接+响应式变量
开发语言·javascript·c++·git·github·开源项目·模版字符串