【Vue3从零开始-实战】S6:路由守卫实现登录校验功能

简介: 【Vue3从零开始-实战】S6:路由守卫实现登录校验功能

@@DVBVTGC2D7ROIYF4YK_@O.png


前言


实战已经开始了!在前面几篇文章中,我们将首页的各个组件完成了,还将登录页的布局实现了。并且把路由配置完成了。在本篇文章中会使用路由守卫实现基础登录校验功能,为了循序渐进,复杂的方式会在后面的文章中完善。


全局路由守卫beforeEach


beforeEach:表示路由跳转时执行的函数。 🌀 比如我们的项目需要先登录,然后才能看到首页。但是现在我们打开根路由的时候,可以直接看到首页,并不需要登录。那么我们就可以在beforeEach函数中去判断一下。


👉 打开router目录下的index.js文件


()~C8ZV}7FX~9Y9M8_@G(YE.png


👆 在创建路由之后使用beforeEach函数


router.beforeEach((to, from, next) => {
  console.log(to, from)
  next()
})
复制代码


🔆 beforeEach函数中有一个回调函数,回调函数中接收三个参数:to、from、next


  • to:即将要进入的目标路由。


  • from:当前导航正在离开的路由。


  • next:可以理解为一个中间件,表示继续执行的方法。


next是一个函数,也是beforeEach中必须要调用的钩子函数。


85RROA8DH5MJ4@~VHSJN@}7.png


⭕️ 在浏览器控制台中可以看到打印出来的内容里面都是路由配置中写到的:name、path等信息。


校验登录


既然beforeEach函数中可以在路由跳转之前执行,那么我们就可以在函数中判断一下是否有登录,如果有就继续执行跳转,否则就跳转到登录页。


router.beforeEach((to, from, next) => {
  if (isLogin) {
    next()
  } else {
    next({ name: 'Home' })
  }
})
复制代码


  • next函数中接收一个对象,对象里面的name就是路由配置中的name,也是跳转路由的名称。


9X0G{0P@CFMFF62FLG63~{6.png


🚫 当我们访问根路由的时候,好像并没有校验登录,而是在控制台报错了。


⭕️ 这是因为路由守卫在执行过程中发现如果我们直接访问登录页的时候,也会校验isLogin,当它为false的时候,也会去访问登录页,这样就是一个死循环了。一直校验就会一直跳转登录页。


🔥 所以我们在判断是否登录的时候,还要顺便判断一下目标路由是否为登录页。


router.beforeEach((to, from, next) => {
  const isLogin = false
  if (isLogin || to.name === 'Login') {
    next()
  } else {
    next({ name: 'Login' })
  }
})
复制代码


  • 在上面打印 to 的值时,里面也是有一个name,表示路由配置里面的名称。


$SM8`R5T9V2J)Z4`H8F0_$L.png


🔆 现在我们不管怎么操作路由,都会跳转到登录页了。


登录跳转


🌀 进入登录页已经校验成功了,下面就该点击登录跳转到首页去了。


👉 打开Login.vue文件。


1%Y8~ZM4)5XTJW(CT0D%JG6.png


☝️ 在Login.vue中给登录按钮一个点击事件


<div class="wrapper__login-button" @click="handleLogin">登陆</div>
复制代码


✌️ 在js中引入useRouter用于路由跳转


import { useRouter } from 'vue-router'
复制代码


👌 在setup中使用useRouter函数跳转到首页


setup () {
    const router = useRouter()
    const handleLogin = () => {
      router.push({ name: 'Home' })
    }
    return { handleLogin }
}
复制代码


❗️最关键的一步就是要把beforeEach中的登录校验改为true,否则校验不成功就不会跳转的。


router.beforeEach((to, from, next) => {
  const isLogin = true
  if (isLogin || to.name === 'Login') {
    next()
  } else {
    next({ name: 'Login' })
  }
})
复制代码

网络异常,图片无法展示
|

局部路由守卫beforeEnter


beforeEnter:表示加载到当前路由之前需要执行的钩子函数


😲 虽然我们在beforeEach函数中定义了isLogin = true,但是当我们在浏览器地址栏后面加上login路由时,还是会跳转到登录页。


XZJPP~}QS9(TA8O9QD}UCSJ.png


😫 这样登录就没有意义了,所以我们需要将isLogin的值存起来,方便我们后面判断。

  1. 在登录按钮点击事件中,将isLogin存储到localStorage


const handleLogin = () => {
  localStorage.isLogin = true
  router.push({ name: 'Home' })
}
复制代码


  1. 在beforeEach 中通过获取localStorage中的isLogin来校验


router.beforeEach((to, from, next) => {
  const { isLogin } = localStorage
  if (isLogin || to.name === 'Login') {
    next()
  } else {
    next({ name: 'Login' })
  }
})
复制代码


  1. 在路由配置中,login配置下面使用beforeEnter函数通过判断isLogin来校验是否需要进入登录页


const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  }, {
    path: '/login',
    name: 'Login',
    component: Login,
    beforeEnter (to, from, next) {
      const { isLogin } = localStorage
      isLogin ? next({ name: 'Home' }) : next()
    }
  }
]
复制代码


XZJPP~}QS9(TA8O9QD}UCSJ.png

总结


本章节主要是将登录页和首页进行关联,并把路由中的钩子函数讲解了一点。

在登录的时候,我们并没有校验用户名和密码,因为重点不在这里,所以有兴趣的同学可以自己实现一下看看哦~

相关文章
|
8天前
|
JavaScript 前端开发 UED
组件库实战 | 用vue3+ts实现全局Header和列表数据渲染ColumnList
该文章详细介绍了如何使用Vue3结合TypeScript来开发全局Header组件和列表数据渲染组件ColumnList,并提供了从设计到实现的完整步骤指导。
|
2月前
|
开发者 Android开发 iOS开发
Xamarin开发者的神器!揭秘你绝不能错过的插件和工具,让你的开发效率飞跃式提升
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程,保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用介绍 Xamarin.Forms 的基本功能和工作原理。首先配置 Visual Studio 开发环境,然后创建并运行一个包含标题、按钮和消息标签的示例应用,展示如何定义界面布局及处理按钮点击事件。这帮助开发者快速入门 Xamarin.Forms,提高跨平台应用开发效率。
33 0
|
2月前
|
JavaScript 前端开发 开发者
Vue.js的未来已来:掌握最新功能,驾驭前端开发的新浪潮!
【8月更文挑战第30天】Vue.js作为前端开发领域的明星框架,凭借其轻量级、响应式及组件化特性,深受全球开发者喜爱。它持续进化,引入新功能并优化性能,如提升渲染速度和减小打包体积,增强TypeScript支持,简化组件编写流程,进一步提升应用响应性和加载速度,改善开发者体验。活跃的社区和丰富的开源项目如“vuejs-challenges”推动其不断发展。未来,Vue.js将探索更多新特性,如宏和非虚拟DOM模式,巩固其在现代前端框架中的领先地位。
44 0
|
2月前
|
JavaScript
Vue中组件化编码 完成任务的添加、删除、统计、勾选需求(实战练习三完结)
这篇文章展示了如何在Vue中实现任务添加、删除、勾选和统计功能,通过组件间参数传递和方法实现,提供了App.vue、TheList.vue、TheItem.vue、TheHeader.vue和TheFooter.vue组件的主要代码示例。
|
7天前
|
JavaScript
vue组件中的插槽
本文介绍了Vue中组件的插槽使用,包括单个插槽和多个具名插槽的定义及在父组件中的使用方法,展示了如何通过插槽将父组件的内容插入到子组件的指定位置。
|
5天前
|
JavaScript
vue消息订阅与发布
vue消息订阅与发布
|
2天前
|
JavaScript
理解 Vue 的 setup 应用程序钩子
【10月更文挑战第3天】`setup` 函数是 Vue 3 中的新组件选项,在组件创建前调用,作为初始化逻辑的入口。它接收 `props` 和 `context` 两个参数,内部定义的变量和函数需通过 `return` 暴露给模板。`props` 包含父组件传入的属性,`context` 包含组件上下文信息。`setup` 可替代 `beforeCreate` 和 `created` 钩子,并提供类似 `data`、`computed` 和 `methods` 的功能,支持逻辑复用和 TypeScript 类型定义。
20 11
|
6天前
|
JavaScript 前端开发 IDE
Vue学习笔记5:用Vue的事件监听 实现数据更新的实时视图显示
Vue学习笔记5:用Vue的事件监听 实现数据更新的实时视图显示
|
6天前
|
JavaScript 前端开发 API
Vue学习笔记4:用reactive() 实现数据更新的实时视图显示
Vue学习笔记4:用reactive() 实现数据更新的实时视图显示
|
4天前
|
JavaScript
vue尚品汇商城项目-day07【vue插件-50.(了解)表单校验插件】
vue尚品汇商城项目-day07【vue插件-50.(了解)表单校验插件】
14 4
下一篇
无影云桌面