假设用户登录,在地址栏输入了Login,人性化的设计应该自动回到home页面。或者用户输入不存在路由,也应该回到home页面。

这个时候需要用到vue-router的导航守卫功能。

在我们封装的router.js文件下添加router.beforeEach……

const router = createRouter({ ... })
router.beforeEach((to, from,next) => {
// ...
// 返回 false 以取消导航
return false
})

有三个参数,to,from,next。分别代表的意思是

to:要前往的路由

from:当前所在的路由

next:设置接下来要跳转的路由。如果没参数就执行当前的匹配路由,如果有参数相当于要重新跳转的路由

简单来说。就是我要从from跳转到to。所以from一般不怎么需要管,谁在乎你当前页面是啥呢。主要还是判断你要跳转的页面你是否有权限进去。

to,from的参数是一样的,需要关注的参数有 name,path,matched。name和path就是你创建的路由规则里面设置的,我没有设置name,所以我的代码会通过path来判断。matched是判断你要跳转的路由是否可以匹配你的路由规则。再简单点说,我有两个路由配置如下

const routes = [
{ path: '/', component: Home },
{ path: '/Login', component: Login }
]

如果我在地址栏输入http://XXX.com/Login  那么to.matched.length>0。matched是个数组类型。如果可以匹配到你的路由配置那就有值。

如果我在地址栏输入http://XXX.com/nb   可见我的路由配置没有nb这个地址,那么我们就要在导航守卫里判断,让他进入到我们的Home页面。

同理,判断登录状态也是如此,如果我要前往一个页面,但是我的登录状态是false,那就不能跳转过去,就要将其改为Login登录页。

需要用到的是next('/Login')。

下面是我的导航守卫配置

//导航守卫
router.beforeEach((to, from, next) => {
const isLogin = localStorage.getItem('isLogin') ?? false;
if (isLogin) {
// 用户已登录
if (to.path.toLowerCase() === '/login') {
// 如果已登录且要前往登录页,重定向到主页
next('/');
} else {
if (to.matched.length !== 0) {
next();
} else {
next('/');
}
}
} else {
// 用户未登录,重定向到登录页
if (to.path.toLowerCase() !== '/login') {
next('/Login');
}
// 已在登录页,正常导航
next();
}
})

需要注意几点。就是用户如果输入LoGiN。在代码中,是属于!=Login的,所以我在代码中,将其都转为小写了。toLowerCase()。


最新的vue-router中,跳转路由的写法变了。包括vue3也是好多写法都改变了

假设以前我登录成功,跳转路由的写法是:this.$router.push('/Home')。

现在写法稍微不同。需要在你的vue页面导入useRouter。然后push。

直接上代码演示

import { useRouter } from 'vue-router'
//首先在setup中定义
const router = useRouter()
//跳转
router.push(`/Home`)

和原来的写法似乎也差不多,但是新手,比如我,hhh,总归是会踩坑的,所以记录下

vue3 路由-导航守卫的更多相关文章

  1. vue之路由导航守卫-全局前置守卫

    一.使用方式 全局前置守卫用于在路由配置生效之前进行一些动作,可以使用 router.beforeEach 注册一个全局前置守卫: const router = new VueRouter({ ... ...

  2. 【VUE】5.路由导航守卫

    1. 功能需求 1. 当用户登陆成功后,把得到的token存到Session Storage 2. components -> Form.vue , 对预验证进行校验,如果验证不正确就跳出,如果 ...

  3. Vue 路由导航守卫

    Vue 路由导航守卫 一:全局守卫 (1) router.beforeEach beforeEach((to, from, next) => {}) 接收三个参数,在路由切换成功之前调用 to ...

  4. vue2路由导航守卫(钩子函数)

    https://router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%85%A8%E5%B1%80%E5%89%8D%E7%BD% ...

  5. Vue的钩子函数[路由导航守卫、keep-alive、生命周期钩子]

    前言 说到Vue的钩子函数,可能很多人只停留在一些很简单常用的钩子(created,mounted),而且对于里面的区别,什么时候该用什么钩子,并没有仔细的去研究过,且Vue的生命周期在面试中也算是比 ...

  6. vue - 解决页面跳转到外部链接后,ios回退到本页面,生命周期,路由导航守卫钩子都无法触发的问题

    虽然加班,最近心情还是可以的,没多少bug找上门. 乐级生悲,遇到了个奇葩的坑,花了点时间百度才解决...但我离不开的'板砖'是安卓的,对此坑是抗拒的,完全没问题... #此坑描述 ...订单详情某按 ...

  7. vue路由导航守卫及前置后置钩子函数参数详解

    首先构建一个测试demo如下图: 接着来探讨路由配置界面 import Vue from 'vue' import Router from 'vue-router' // import HelloWo ...

  8. 纯小白入手 vue3.0 CLI - 3.3 - 路由的导航守卫

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...

  9. VueJs(12)---vue-router(导航守卫,路由元信息)

    vue-router(导航守卫,路由元信息) 之前泄露两篇有关vue-router博客: VueJs(10)---vue-router(进阶1) VueJs(11)---vue-router(进阶2) ...

  10. Vue的路由动态重定向和导航守卫

    一.重定向 重定向也是通过 routes 配置来完成,下面例子是从 /a 重定向到 /b: const router = new VueRouter({ routes: [ { path: '/a', ...

随机推荐

  1. Kubernetes 备份容灾服务产品体验教程

    作者:尹珉,KubeSphere 社区用户委员会杭州站站长 前言 Kubernetes 集群天生自带自愈功能,但是往往有些意外情况使自愈功能不起作用,比如:公司同事把某个 namespace 删除.存 ...

  2. nodejs redis 小试牛刀

    一.环境安装 书接上文,浅学Redis之后,服务器已经安装Redis了,用 nodejs 链接 redis 之前,先安装 nodejs 环境. 1.安装fnm (1)压缩包fnm-linux.zip搞 ...

  3. Protues中51单片机按键无法复位(已解决)

    前言 昨晚用 Protues 搭建了 51 的最小系统电路,在实物中好用的复位电路,到仿真里不能正常复位了. 51 单片机是高电平复位,所以在运行时 RST 引脚应该是低电平,但在仿真中 RST 引脚 ...

  4. dotnet core微服务框架Jimu ~ 会员授权微服务

    提供授权服务,用户使用会员的用户名和密码获取 token, 带着 token 访问受保护的接口,如浏览和发布新闻. 有 2 个公开的 api: token: 获取 token; GetCurrentM ...

  5. kubectl常用命令(二)

    四.进入容器 # 进入pod容器,但是对权限要求也较多 kubectl exec -it podName sh # 通过bash获得 pod 中某个容器的TTY,相当于登录容器 kubectl exe ...

  6. .NET云原生应用实践(五):使用Blazor WebAssembly实现前端页面

    本章目标 使用Blazor WebAssembly实现管理"贴纸"页面 集成认证与授权机制 如果你对Blazor WebAssembly的使用不感兴趣,可以跳过本章的阅读.你也可以 ...

  7. 2个月搞定计算机二级C语言——真题(9)解析

    1. 前言 本篇我们讲解2个月搞定计算机二级C语言--真题9 2. 程序填空题 2.1 题目要求 2.2 提供的代码 #include <stdio.h> double f1(double ...

  8. 4.7 Linux压缩文件或目录中文件为.bz2格式(bzip2命令)

    bzip2 命令同 gzip 命令类似,只能对文件进行压缩(或解压缩),对于目录只能压缩(或解压缩)该目录及子目录下的所有文件.当执行压缩任务完成后,会生成一个以".bz2"为后缀 ...

  9. 2. jenkins的安装

    Docker方式: 如果在安装社区推荐插件时报错,网络延迟,则建议采用官方yum安装 遇到一个问题:公司局域网openstack虚拟机安装时,修改了镜像仍报错,但是自己电脑vmware虚拟机正常,暂时 ...

  10. AI千恋万花(java调用api实现)附完整项目及注释)重置版)

    感觉博客的第一版质量有点低下了,删了重置一下,希望能给其他人的代码带来一些灵感 前情提要:https://www.cnblogs.com/h4o3/p/18523151 由于是匆忙制作的老婆系统,主界 ...