vue3 路由-导航守卫

vue3,路由,导航,守卫 · 浏览次数 : 34

小编点评

```js import { useRouter } from 'vue-router' router = useRouter() 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() } }) ``` **使用说明:** 1. 在你的vue页面中导入`useRouter`:`import { useRouter } from 'vue-router'` 2. 在`setup`函数中定义一个`router`变量并使用`useRouter`获取路由实例 3. 使用`router.beforeEach`导航守卫函数,并在其回调函数中根据用户的登录状态和目标路由进行导航。 4. `router.beforeEach`接受三个参数:`to`、`from`和`next`。 5. `to`参数表示要导航到的路由对象。 6. `from`参数表示当前所在的路由对象。 7. `next`参数表示要设置的下一个路由对象。 8. 在`if`语句中,根据用户的登录状态和目标路由,进行导航。

正文

假设用户登录,在地址栏输入了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 路由-导航守卫相似的内容:

vue3 路由-导航守卫

假设用户登录,在地址栏输入了Login,人性化的设计应该自动回到home页面。或者用户输入不存在路由,也应该回到home页面。 这个时候需要用到vue-router的导航守卫功能。 在我们封装的router.js文件下添加router.beforeEach…… const router = crea

vue3 路由的使用

添加一个router.js 配置文件 import { createRouter, createWebHistory } from 'vue-router' createRouter:用来创建 路由 createWebHistory :url的格式 不带#。 导入你的.vue页面 即你的页面,如:

介绍vue3的钩子函数activated和deactivated使用场景

activated和deactivated是Vue3中的两个生命周期钩子函数。 activated钩子函数在组件被激活时调用,通常用于恢复组件的状态或执行一些初始化操作。例如,如果一个组件被从路由中激活,你可能需要在该组件被激活时从本地存储中加载一些数据。 下面是一个示例代码:

Vue 3入门指南

title: Vue 3入门指南 date: 2024/5/23 19:37:34 updated: 2024/5/23 19:37:34 categories: 前端开发 tags: 框架对比 环境搭建 基础语法 组件开发 响应式系统 状态管理 路由配置 第1章:Vue 3简介 1.1 Vue.j

Nuxt3页面开发实战探索

摘要:这篇文章是关于Nuxt3页面开发实战探索的。它介绍了Nuxt3的基础入门,安装与配置,项目结构,内置组件与功能,以及页面与路由的相关内容。Nuxt3是基于Vue 3的服务器端渲染框架,旨在简化Vue应用程序的开发流程,提供最佳的性能和开发

Vue3快速上手

好久没上传了,闲来无事把囤积已久的笔记给上传上传 1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n 经历了:4800+次提交、40+个RFC、600+次PR、300+贡献者 官方发版地址:Release v3.0.0 One Piece · vue

【干货】Vue3 组件通信方式详解

毫无疑问,组件通信是Vue中非常重要的技术之一,它的出现能够使我们非常方便的在不同组件之间进行数据的传递,以达到数据交互的效果。所以,学习组件通信技术是非常有必要的,本文将总结Vue中关于组件通信的八种方式,帮助大家在使用Vue的过程中更加得心应手! 如果文中有不对、疑惑的地方,欢迎在评论区留言指正...

vue3.4的更新,保证你看的明明白白

defineModel 同学已经转正 defineModel 在vue3.3中还是一个实验性功能, 但是经过一个学期的努力,该同学已经转正。 defineModel的简单介绍 defineModel() 返回的值是一个 ref。 它可以像其他 ref 一样被访问以及修改。 它能起到在父组件和当前变量

vue3实现模拟地图上,站点名称按需显示的功能

很久很久没有更新博客了,因为实在是太忙了,每天都有公司的事情忙不完....... 最近在做车辆模拟地图,在实现控制站点名称按需显示时,折腾了好一段时间,特此记录一下。最终界面如下图所示: 站点显示需求:首末站必须显示,从第一个站开始,如果站点名称能显示下,则显示,如果站点名称会重叠则隐藏,以此类推。

这个vue3的后台管理系统虽然简洁但不简单

今天介绍一个新的Vue后台管理框架,相比其他后台功能丰富管理系统,这个后台管理系统可以用干净简洁来形容——Nova-admin Nova-admin Nova-admin 是一个基于Vue3、Vite5等最新技术的后台管理平台。用简单的方式实现完整功能,并尽可能的考虑代码规范,易读易理解无过度封装,