Vue Router 跳转404,路由守卫及配置(登录篇)

在这个前端技术迭代迅速的时代,单页面应用开发中,路由守卫已经是非常常见也是必备的需求,为了控制使用者在各种状态下的路由页面跳转,例如:是否登录是否有路由权限等等,今天就记录一下在各种登录状态下路由配置和路由守卫。

Vue Router官方文档:https://router.vuejs.org/zh/guide/advanced/navigation-guards.html

页面跳转场景:

各登录状态下跳转场景大概可分为以下几种

  • 跳转非登录页
  • 跳转登录页
  • 跳转根路由
  • 跳转未定义路由
解决方案:
1. 跳转非登录页

router.beforeEach(前置守卫)中判断目标路由是否需要登录,需要登录则重定向到登录页,对于无需登录的如:404注册重置密码 等页面,直接进入 next() 即可,不做处理。

// 路由前置守卫
router.beforeEach((to, from, next) => {
  const { meta, name } = to;
  const { isLogin } = meta;
  // token不存在时跳转非登录页,重定向到登录页
  if (!getToken() && name !== 'Login' && isLogin) next({ path: '/login' });
  // 其他场景
  else next();
});
2. 跳转登录页

router.beforeEach(前置守卫) 中判断,已登录时重定向到首页,未登录时理所应当到登录页,所以不做处理,直接进 next()

// 路由前置守卫
router.beforeEach(({ meta, name }, from, next) => {
  const { title, isLogin } = meta;
  if (title) document.title = title;
  
  // token不存在时跳转非登录页,重定向到登录页
  if (!getToken() && name !== 'Login' && isLogin) next({ path: '/login' });
  // token存在时跳转登录页,重定向到首页
  else if (getToken() && name === 'Login') next({ path: '/home' });
  // 其他场景
  else next();
});
3. 跳转根路由

丢失路由路径的情况很常见,比如得到一个链接 http://localhost:8080/#/如果未定义根路由渲染组件,那么此链接跳转后,会得到异常的空白页面,这要是上了生产,怕是要GG~,但如果你的 / 是像下面这样配置的,虽然不会出现访问根路由空白问题,但也需要兼容未登录时的登录页重定向。

const routes = [
  {
    path: '/',
    name: 'Home',
    meta: {
      title: 'Homepage',
      isLogin: true
    },
    component: () => import('@/views/Home')
  }
];

你还可以通过设置别名的方式来规避根路由空白的问题:
https://next.router.vuejs.org/zh/guide/essentials/redirect-and-alias.html

const routes = [{ path: '/', component: Homepage, alias: '/home' }]

正常情况下访问根路由,要么跳转登录页,要么跳转首页,所以,我们需要进行以下配置:

当你的根路由 / 未进行路由组件配置时,你需要定义访问 / 路径,重定向到 /home 或者 /login 路径,下列代码结合我们第一,第二点配置的路由前置守卫,可以分别适配两种跳转场景,未登录时访问 / 跳转到 /login,已登录时访问 / 跳转到 /home

const routes = [
  {
    path: '/',
    redirect: '/home'
  },
  {
    path: '/home',
    name: 'Home',
    meta: {
      title: 'Homepage',
      isLogin: true
    },
    component: () => import('@/views/Home')
  },
  {
    path: '/login',
    name: 'Login',
    meta: {
      title: 'Login Page'
    },
    component: () => import('@/views/Home')
  }
];
4. 跳转未定义路由

网页链接在Copy N次的过程中,可能出现丢失路径,或者多加了一段路径的情况,比如 http://localhost:8080/#/mmp~ 然后被测试同学或者客户碰巧用上了,他们打开之后就会发现出现空白页面,还有你就会发现你的bug清单上多了一项,出现这种情况的原因很简单,你没有配置对应的路由渲染组件,所以为了规避这种异常状况,通常我们要配置一个 /404 的路由页面,然后使用通配符路由 * 来重定向到 /404/ 页面。

配置方法如下:

const routes = [
  {
    path: '/',
    redirect: '/home'
  },
  {
    path: '/404',
    name: 'NotFound',
    meta: {
      title: 'Page not found',
      isLogin: false
    },
    component: () => import('@/views/NotFound')
  },
  // 所有未定义路由,全部重定向到404页
  {
    path: '*',
    redirect: '/404'
  }
];

所有未定义的路径都将匹配 * 这个路由定义,然后重定向到 /404,例如:

  • http://localhost:8080/#/jjyy => http://localhost:8080/#/404
  • http://localhost:8080/#/mmp => http://localhost:8080/#/404

据说 * 必须放在最后定义,不过我不放在最后好像也能跑?(??手动黑人问号??)

router / index.js 代码:
import Vue from 'vue';
import VueRouter from 'vue-router';

import { getToken } from '@/utils/cookies';

Vue.use(VueRouter);

const routes = [
  {
    path: '/',
    redirect: '/home'
  },
  {
    path: '/home',
    name: 'Home',
    meta: {
      title: 'Home',
      isLogin: true
    },
    component: () => import('@/views/Home')
  },
  {
    path: '/login',
    name: 'Login',
    meta: {
      title: 'Login'
    },
    component: () => import('@/views/Login')
  },
  {
    path: '/404',
    name: 'NotFound',
    meta: {
      title: 'Page not found',
      isLogin: false
    },
    component: () => import('@/views/NotFound')
  },
  // 所有未定义路由,全部重定向到404页,必须放在最后
  {
    path: '*',
    redirect: '/404'
  }
];

const router = new VueRouter({
  mode: 'hash',
  base: process.env.BASE_URL,
  /**
   * 路由跳转后页面滚动到顶部
   * 详见:https://router.vuejs.org/zh/guide/advanced/scroll-behavior.html
   */
  scrollBehavior: () => ({ y: 0 }),
  routes
});

// 路由前置守卫
router.beforeEach(({ meta, name }, _, next) => {
  const { title, isLogin } = meta;
  if (title) document.title = title;

  // token不存在时跳转非登录页,重定向到登录页
  if (!getToken() && name !== 'Login' && isLogin) next({ path: '/login' });
  // token存在时跳转登录页,重定向到首页
  else if (getToken() && name === 'Login') next({ path: '/home' });
  // 其他场景
  else next();
});

export default router;

路由守卫还有很多应用场景,有空会出一个鉴权篇的路由配置,文中有错误或者有可优化的地方欢迎指出,如果觉得写的不错,别忘记点个点赞和收藏哦,你的认可是我坚持的动力~~~ 。◕‿◕。

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,针对你的问题,我来简单介绍一下 Vue 登录跳转路由守卫的实现方法。 首先,在 Vue 项目中使用路由守卫来实现登录跳转比较常见,因为路由守卫可以帮助我们在跳转页面时进行拦截和处理,以实现一些特定的逻辑操作。 下面是一个简单的示例代码: ```javascript // 创建路由实例 const router = new VueRouter({ routes: [ { path: '/login', component: Login }, { path: '/home', component: Home, meta: { requiresAuth: true // 添加 meta 字段,表示需要登录才能访问 } } ] }) // 添加路由守卫 router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requiresAuth)) { // 判断是否需要登录 if (!localStorage.getItem('token')) { // 判断是否已登录 next({ path: '/login', query: { redirect: to.fullPath } // 将跳转的路由path作为参数,登录成功后跳转到该路由 }) } else { next() } } else { next() } }) ``` 以上代码中,我们首先创建了一个 VueRouter 的实例,并定义了两个路由,一个是登录页面,一个是需要登录才能访问的首页。在首页的路由配置中,我们添加了一个 meta 字段,表示需要登录才能访问。 接着,我们使用 `router.beforeEach` 方法添加了一个路由守卫,用来拦截所有路由的跳转。在路由守卫中,我们通过 `to.matched.some` 方法判断当前路由是否需要登录,如果需要登录,则判断用户是否已登录,如果未登录,则跳转登录页面,并将需要跳转的路由作为参数传递给登录页面,在登录成功后再跳转回来。 以上就是一个简单的 Vue 登录跳转路由守卫的实现方法。希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超喜欢你呦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值