vue三种路由守卫详解

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 在 Vue 中,可以通过路由守卫来实现路由鉴权。**Vue 提供了三种路由守卫:全局前置守卫、全局解析守卫和组件内的守卫

在 Vue 中,可以通过路由守卫来实现路由鉴权。Vue 提供了三种路由守卫:全局前置守卫、全局解析守卫和组件内的守卫

全局前置守卫

通过 router.beforeEach() 方法实现,可以在路由跳转之前进行权限判断。在这个守卫中,可以根据用户的登录状态、角色等信息来判断用户是否有权限访问该路由。如果没有权限,则可以跳转到登录页面或者其他提示页面。

全局解析守卫

通过 router.beforeResolve() 方法实现,可以在路由解析之前进行权限判断。这个守卫可以用于处理异步路由加载的情况,确保在加载路由之前进行权限判断。

组件内的守卫

通过 beforeRouteEnter 、 beforeRouteUpdate 和 beforeRouteLeave 这三个钩子函数实现。这些守卫直接在组件内部定义,并且会在组件的路由导航过程中触发。可以用于执行一些与组件相关的逻辑,例如加载组件的数据、检查组件的状态等。

全局前置守卫代码示例

以下是一个示例代码,展示了如何使用全局前置守卫来限制未登录用户的访问:

const router = new VueRouter({
   
  routes: [
    {
   
      path: '/',
      component: HomeComponent,
    },
    {
   
      path: '/login',
      component: LoginComponent,
    },
  ],
});

router.beforeEach((to, from, next) => {
   
  // 检查用户是否已登录
  if (!isLoggedIn) {
   
    next('/login');
  } else {
   
    next();
  }
});

在这个示例中,定义了一个全局前置守卫,使用 router.beforeEach() 方法来检查用户是否已登录。如果用户未登录,则导航到登录页面,否则允许继续导航。

全局解析守卫的示例代码

这个示例展示了如何使用 router.beforeResolve() 方法进行权限判断:

router.beforeResolve((to, from, next) => {
   
  // 获取要进入的路由组件
  const component = to.matched[0].components.default; 

  // 进行权限检查
  if (hasPermission(component)) {
   
    next();
  } else {
   
    // 没有权限,跳转到错误页面或执行其他操作
    next('/error');
  }
});

在这个示例中,使用 router.beforeResolve() 方法定义了全局解析守卫。通过获取要进入的路由组件,并进行权限检查来确定用户是否有权访问该组件。如果有相应权限,就继续导航;否则,跳转到错误页面或执行其他操作。

请注意,全局解析守卫在路由解析完成后触发,也就是在组件被加载之前。这意味着你可以在守卫中进行更复杂的权限检查,例如检查组件的特定属性或与服务器进行异步验证。

组件内守卫代码示例

在 Vue.js 中,组件内守卫有三个: beforeRouteEnter 、 beforeRouteUpdate 和 beforeRouteLeave 。以下是一个示例代码,展示了如何使用这三种组件内守卫:

export default {
   
  name: 'About',
  // beforeRouteEnter 是进入守卫,通过路由规则,进入该组件时被调用
  beforeRouteEnter(to, from, next) {
   
    console.log('About--beforeRouteEnter', to, from)
    if (to.meta.isAuth) {
   
      if (localStorage.getItem('school') === 'atguigu') {
   
        next()
      } else {
   
        alert('学校名不对,无权限查看!')
      }
    } else {
   
      next()
    }
  },
  // beforeRouteLeave 是离开守卫,通过路由规则,离开该组件时被调用
  beforeRouteLeave(to, from, next) {
   
    console.log('About--beforeRouteLeave', to, from)
    next()
  },
  // beforeRouteUpdate 是更新守卫,组件被复用(例如从缓存中恢复)时被调用
  beforeRouteUpdate(to, from, next) {
   
    console.log('About--beforeRouteUpdate', to, from)
    next()
  }
}

在上述示例中, beforeRouteEnter 守卫会在进入 About 组件时被调用。如果路由规则中设置了 isAuth 元数据并且本地存储中 school 的值为 atguigu ,则允许进入该组件;否则会弹出一个警告框。 beforeRouteLeave 守卫会在离开 About 组件时被调用,它只是简单地继续执行下一个路由。 beforeRouteUpdate 守卫会在组件被复用(例如从缓存中恢复)时被调用,它也只是简单地继续执行下一个路由。

请注意,上述示例代码中的 isAuth 元数据和 localStorage.getItem('school') 是自定义的,你可以根据实际需求进行相应的修改。

相关文章
|
4天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
vue学习第四章
|
4天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
vue学习第九章(v-model)
|
4天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
vue学习第十章(组件开发)
|
9天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
9天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
JavaScript Go
|
JavaScript C语言 Go
|
10天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
10天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
10天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
下一篇
无影云桌面