假设用户登录,在地址栏输入了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. 使用 OpenFunction 在任何基础设施上运行 Serverless 工作负载

    作者: 霍秉杰:KubeSphere 可观测性.边缘计算和 Serverless 团队负责人,Fluent Operator 和 OpenFunction 项目的创始人,还是多个可观测性开源项目包括 ...

  2. 云原生周刊:12 个容易忽略的 Kubernetes 安装错误

    文章推荐 12 个容易忽略的 Kubernetes 安装错误 这篇文章总结了 12 个在 Kubernetes 安装过程中容易忽略但却必须注意的错误.这些错误包括: 没有正确安装 kubectl. 没 ...

  3. 如何使用Ida Pro和Core Dump文件定位崩溃位置(Linux下无调试符号的进程专享)

    我们在嵌入式Linux开发过程中经常会遇到一个问题,就是程序崩溃后不知道具体位置.因为我们发布到生产环境的一般是没有调试符号的(使用strip或编译时加-s参数,CMake生成的编译指令中的-O3也会 ...

  4. 关于C++当中全局变量的释放问题

    一.由来 主要是在修改公司的一个MFC项目的时候遇到的问题,我在MFC页面的析构函数当中对一个全局图像变量进行了释放,具体如下: ai_engine_OCR::~ai_engine_OCR() { / ...

  5. Redis中常见的数据类型及其应用场景

    五种常见数据类型 Redis中的数据类型指的是 value存储的数据类型,key都是以String类型存储的,value根据场景需要,可以以String.List等类型进行存储. 各数据类型介绍: R ...

  6. php xattr操作文件扩展属性

    观摩了这篇文章后https://www.cnblogs.com/zyblog-coder/p/15013804.html 学到了php还有操作文件扩展属性的扩展 快速安装了一下 sudo apt-ge ...

  7. Ocelot集成Consul实现api网关与服务发现

    前言 没看dotnet微服务之API网关Ocelot的请先看,这篇文章接上面文章 安装consul #自定义网络,自定义网络可以指定容器IP,这样服务器重启consul集群也可以正常运行. docke ...

  8. 原生鸿蒙中的RN日志系统

    一.创作背景 在上一篇博客中,我分享了在原生鸿蒙中,进行RN的热加载,以达到修改RN代码后不需要重新打包,即可实时调试的效果. 本次我将分享一下RN的日志系统,以及对js中线上bug的监听,希望能对大 ...

  9. ECharts 引入中国地图和区域地图

    一,引入中国地图   <div  id="chinaMap"></div> import china from 'echarts/map/js/china. ...

  10. Java GC 调试手记

    摘要 本文记录GC调试的一次实验过程和结果. GC知识要点回顾 问题1:为什么要调试GC参数?在32核处理器的系统上,10%的GC时间导致75%的吞吐量损失.所以在大型系统上,调试GC是以小博大的不错 ...