vue三种路由守卫详解

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

  1. 全局前置守卫
    通过 router.beforeEach() 方法实现,可以在路由跳转之前进行权限判断。在这个守卫中,可以根据用户的登录状态、角色等信息来判断用户是否有权限访问该路由。如果没有权限,则可以跳转到登录页面或者其他提示页面。
  2. 全局解析守卫
    通过 router.beforeResolve() 方法实现,可以在路由解析之前进行权限判断。这个守卫可以用于处理异步路由加载的情况,确保在加载路由之前进行权限判断。
  3. 组件内的守卫
    通过 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') 是自定义的,你可以根据实际需求进行相应的修改。

相关推荐
Pu_Nine_924 分钟前
Vue 3 + TypeScript 项目性能优化全链路实战:从 2.1MB 到 130KB 的蜕变
前端·vue.js·性能优化·typescript·1024程序员节
一个处女座的程序猿O(∩_∩)O1 小时前
Vue CLI 插件开发完全指南:从原理到实战
前端·javascript·vue.js
姜至1 小时前
el-calendar实现自定义展示效果
前端·vue.js
拉不动的猪1 小时前
webpack分包优化简单分析
前端·vue.js·webpack
麦麦大数据2 小时前
F035 vue+neo4j中医南药药膳知识图谱可视化系统 | vue+flask
vue.js·知识图谱·neo4j·中医·中药·药膳·南药
麦麦大数据2 小时前
F037 vue+neo4j 编程语言知识图谱可视化分析系统vue+flask+neo4j
vue.js·flask·知识图谱·neo4j·可视化·编程语言知识图谱
Sheldon一蓑烟雨任平生3 小时前
Vue3 组件 v-model
vue.js·vue3·v-model·definemodel·v-model修饰符·自定义双向绑定组件·多个v-model绑定
OpenTiny社区3 小时前
如何使用 TinyEditor 快速部署一个协同编辑器?
前端·vue.js
胖虎2653 小时前
打造梦幻粒子动画效果:基于 Vue 的 Canvas 实现方案
vue.js
李剑一4 小时前
vite框架下大屏适配方案
前端·vue.js·响应式设计