vue-router中的beforeEach

本文分享了在Vue项目中实现基于角色的权限管理(RBAC)的经验,重点介绍了如何使用vue-router处理动态路由,并讨论了在beforeEach钩子中避免无限循环的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做vue项目的开发,用到的技术栈主要是vue相关的,在开发这个项目的时候,设计到了权限,因为是后台管理系统,不同的身份和角色访问系统的时候,系统所展现出来的可访问内容都是不一样的,有兴趣的同学可以参考下RBAC(以角色为基础的权限管理设计)这篇文章写得很详细,很直观,我写这篇文章主要是想要分享一下前端的技术栈vue-router是如何处理的,以及踩过的坑。

  • vue-router

可以参考官方文档vue-router,官方文档中介绍的很详细,解决权限问题,就用到了addRoutes这个API,去动态添加路由,我项目目前使用的vue-router的版本号是3.0.1,我把我初始化创建路由实例的代码可以展示给你们看一下的:

  • 动态路由处理方式

因为每次在进行路由跳转的时候,都会触发对应的钩子函数,可以参考官网的文档注解:

本人在项目里面是运用了beforeEach这个钩子函数来监控路由的变化的,具体可以参看代码:

 

  • beforeEach实现的思路如下:

每次通过vue-router进行页面跳转,都会触发beforeEach这个钩子函数,这个回调函数共有三个参数,to,from,next这三个参数,to表示我要跳转的目标路由对应的参数,from表示来自那个路由,就是操作路由跳转之前的,即将离开的路由对应的参数,next是一个回调函数,一定要调用next方法来resolve这个钩子函数;

这里在使用beforeEach的时候,应该要注意,如果这个beforeEach函数没有合理利用的情况下,就会陷入到无限循环之中。看到的现象就是整个页面不停的刷新,其实从代码的角度来看是一致在进行路由跳转,也就是一致在不停的执行beforeEach这个函数。

当在beforeEach这个函数中调用next({path:'/home'})的时候,会中断当前导航;比如当前导航是去/a,那么遇next({path:'/home'})之后,就会把to.path改成home,然后重新触发beforeEach这个钩子函数,注意是重新触发,而不是在当前这个钩子的函数的基础上去执行;之前因为对这一点理解的不透彻,以为只要是调用next({path:'/home'})就可以直接跳转到home了,但是没有像预期的那样,反而陷入到了无限循环之中;当重新触发以后,因为没有加上合理的判断条件,所以会一直循环。
解决这个无限循环的办法就是加上一个判断,如果to.path===‘/home’,就执行next();这样子就不会无限循环了。

可以看下代码示例:

 

以上就是本人在本次写项目的时候踩过的坑,跟大家分享一下经验,喜欢的话,就点个赞吧!

 

 

 

### 解决 `beforeEach` 在 Vue Router 4 中不执行的问题 在 Vue Router 4 中,导航守卫的行为可能因配置方式的不同而有所变化。以下是可能导致 `beforeEach` 守卫未正常工作的原因及其解决方案: #### 可能原因及解决方法 1. **Vue Router 实例未正确初始化** 如果 Vue Router 的实例未被正确挂载到应用中,则全局守卫(如 `beforeEach`)不会生效。确保在创建路由实例后将其传递给 Vue 应用程序[^1]。 ```javascript import { createApp } from 'vue'; import { createRouter, createWebHistory } from 'vue-router'; const routes = [ { path: '/', component: () => import('./components/Home.vue') }, { path: '/about', component: () => import('./components/About.vue') } ]; const router = createRouter({ history: createWebHistory(), routes, }); const app = createApp(App); app.use(router); // 确保在这里注册路由器 app.mount('#app'); ``` 2. **守卫逻辑放置位置错误** 确保 `router.beforeEach()` 方法是在路由实例化之后调用的,并且它位于入口文件或单独的路由配置文件中[^2]。 ```javascript import { createRouter, createWebHistory } from 'vue-router'; const router = createRouter({ history: createWebHistory(), routes: [], }); router.beforeEach((to, from, next) => { console.log('Navigating from:', from.path, 'to:', to.path); next(); // 切记要调用 next() 来继续导航流程 }); ``` 3. **异步组件加载问题** 当使用懒加载(Lazy Load)定义路由时,如果某些模块未能成功解析,可能会导致导航失败并跳过守卫逻辑。可以通过捕获异常来排查此类问题。 ```javascript const AsyncComponent = defineAsyncComponent({ loader: () => import('./MyComponent.vue'), errorComponent: ErrorDisplayComponent, loadingComponent: LoadingIndicatorComponent, delay: 200, timeout: 3000, }); ``` 4. **Server-Side Rendering (SSR)** 影响 如果项目涉及服务端渲染(SSR),则需要注意 SSR 和客户端之间的差异。在这种情况下,可以借助插件或其他工具统一管理元数据和状态同步[^3]。 5. **插件封装不当** 若希望自定义功能在整个应用程序范围内可用而不需显式导入,可考虑通过 Vue 插件的方式实现[^4]。 ```javascript export default { install(app, options) { app.config.globalProperties.$customMethod = function() {}; }, }; ``` 最后,请确认官方文档中的最新指南是否已被遵循,因为框架版本更新时常伴随 API 调整。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值