首页 > 其他分享 >vue3 路由-导航守卫

vue3 路由-导航守卫

时间:2023-08-28 19:45:38浏览次数:34  
标签:登录 vue3 next 守卫 跳转 router Login 路由

假设用户登录,在地址栏输入了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,next,守卫,跳转,router,Login,路由
From: https://www.cnblogs.com/zhang-3/p/17663239.html

相关文章

  • Vue3 使用Vuex与Vuex-persistedstate
    Vuex与vuex-persistedstateVuex是什么?Vuex是一个用于Vue.js应用程序的状态管理模式。它使得在应用程序中的所有组件之间共享和访问状态变得非常简单。Vuex将应用程序的状态存储在一个单一的存储库中,并且提供了一组用于更改状态的API。这使得状态管理变得更加可预测和易于调试。......
  • vue3同一页面内重复引用同一操作dom的组件产生的问题
    [2023年8月28日12:39:40]vue3同一页面内标签<component>重复引用同一组件,且该组件内使用css选择器进行dom操作导致页面内相同组件发生变化的问题解决记录组件内进行dom操作,需要通过js方法进行选择器的元素获取,但当vue3全部渲染完毕后,页面内有多个id为test9的相同元素,元素选择将......
  • .NET CORE 终端路由中间件 app.UseEndpoints
    publicvoidConfigureServices(IServiceCollectionservices){services.AddControllers();}publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){app.UseRouting();app.UseAuthorization();app.UseEndpoints......
  • vue3中使用provide/inject
    父组件<template><hello-world/><button@click="changeMessage">按钮</button></template><scriptsetuplang="ts">importHelloWorldfrom"./components/HelloWorld.vue";import{provide,ref......
  • Cisco OSPF注入默认路由
    先配置ip然后ospf在路由器一或者路由器二做默认路由下一跳给外部接口或者ip比如说在路由器一就给g0/0或者192.168.10.1在路由器二就给g0/0或者192.168.20.2然后进ospf做一个defo就可以了查看的时候用其余的路由器查看......
  • vue3探索——组件通信之v-model父子组件数据同步
    背景再很多场景中,我们可能想在子组件中修改父组件的数据,但事实上,vue不推荐我们这么做,因为数据的修改不容易溯源。Vue2写法在vue2中,我们使用.sync修饰符+自定义事件'update:xxx',来使父子组件数据同步。//父组件<template><div><h2>我是父组件,我有{{money}}¥......
  • 【3.0】flask之路由系统
    【一】路由系统基于装饰器fromflaskimportFlaskapp=Flask(__name__)#(1)flask的路由系统基于装饰器#rule:路径#methods:请求方式【列表】#endpoint:别名#@app.route('/detail/<int:nid>',methods=['GET'],endpoint='detail')@app.route('......
  • 网络之路由器交换机的设置
    一、基础知识之(交换机的)虚接口vlan1.端口加入vlan[S1]interfaceGigabitEthernet0/0/1[S1-GigabitEthernet0/0/1]portlink-typeaccess接口模式配置为access模式[S1-GigabitEthernet0/0/1]portdefaultvlan2接口加入vlan2<S1>displayvlan 查看当前配置的vlan ......
  • 路由反射器
    在使用BGP路由协议的网络中,为保证IBGP对等体之间的连通性,需要在IBGP对等体之间建立全连接关系。假设在一个AS内部有n台路由器,那么应该建立的IBGP连接数就为n(n-1)/2.当IBGP对等体数目很多时,对网络资源和CPU资源的消耗都很大。路由反射器的定义利用路由反射可以解决这一问题。在......
  • BGP联盟和路由反射器
    在谈BGP联盟和BGP反射器这两个技术前,我们先来了解一下BGP中存在的路由黑洞问题。什么是路由黑洞呢?我们以下面这个拓扑来详细的介绍一下:这是一个典型的BGP应用组网。图中,有3个AS,AS之间运行BGP协议。AS65008域内运行OSPF协议。R1和R5上只运行BGP协议,R2和R4上运行OSPF和BGP协议,R3......