当前位置: 首页 > news >正文

Vue Router全局拦截

Vue Router全局拦截全攻略

一、为什么需要全局拦截?

最近在开发后台管理系统时,突然发现所有页面都需要登录才能访问。如果每个页面都手动检查登录状态,那代码简直要写成意大利面条了。这时候,Vue Router的全局拦截功能就像个贴心小助手,帮我们统一处理这些逻辑。

二、认识导航守卫

Vue Router提供了完整的导航解析流程,就像地铁安检一样,每个乘客(路由)都要经过几个检查点:

  1. 全局前置守卫(beforeEach):进站前的安检
  2. 路由独享守卫(beforeEnter):特殊通道检查
  3. 组件内守卫(beforeRouteEnter):车厢内抽查

今天咱们重点聊聊这个最常用的beforeEach

三、基础拦截示例

先来个最简单的登录拦截:

const router = new VueRouter({ ... })router.beforeEach((to, from, next) => {if (to.meta.requiresAuth && !isAuthenticated()) {// 如果需要认证且未登录,跳转到登录页next(/login)} else {// 放行next()}
})

这里有几个关键点:

  • to:目标路由对象
  • from:当前路由对象
  • next:必须调用的函数,就像安检员的小旗子

四、实战进阶技巧

1. 权限控制

后台管理系统通常需要根据用户角色显示不同菜单:

router.beforeEach((to, from, next) => {const userRole = getUserRole()const requiredRole = to.meta.roleif (requiredRole && userRole !== requiredRole) {next(/403) // 无权限页面} else {next()}
})

2. 页面访问统计

router.beforeEach((to, from, next) => {trackPageView(to.path) // 发送统计next()
})

3. 动态修改页面标题

router.beforeEach((to, from, next) => {document.title = to.meta.title || 默认标题next()
})

五、常见坑点指南

  1. 忘记调用next():会导致页面卡住,就像把乘客堵在安检口
  2. 无限重定向
    // 错误示范!
    next(/login)
    // 在login页又跳转回首页
    
  3. 异步操作处理
    router.beforeEach(async (to, from, next) => {await checkAuth()next()
    })
    

六、完整项目示例

假设我们有个电商项目,需要:

  • 未登录跳转登录页
  • 已登录但未完善信息跳转资料页
  • 管理员才能访问后台
router.beforeEach(async (to, from, next) => {const isLogin = await checkLogin()const userInfo = await getUserInfo()if (to.meta.requiresAuth && !isLogin) {next({ path: /login, query: { redirect: to.fullPath } })} else if (isLogin && !userInfo.completedProfile && to.path !== /profile) {next(/profile)}else if (to.meta.adminOnly && !userInfo.isAdmin) {next(/403)}else {next()}
})

七、总结

Vue Router的全局拦截就像交通管制系统,合理使用可以让我们的应用:

  • 更安全(权限控制)
  • 更智能(动态路由)
  • 更可维护(统一处理)

记住几个要点:

  1. 一定要调用next()
  2. 处理好异步情况
  3. 避免循环跳转

现在,快去给你的路由加上守卫吧!

相关文章:

  • 02.three官方示例+编辑器+AI快速学习webgl_animation_skinning_blending
  • 深入理解 Polly:.NET Core 中的健壮错误处理策略
  • LVGL(lv_btnmatrix矩阵按钮)
  • [特殊字符] 免税商品优选购物商城系统 | Java + SpringBoot + Vue | 前后端分离实战项目分享
  • Telnetlib 库完全指南
  • 常见的排序算法(Java版)简单易懂好上手!!
  • AI日报 - 2024年05月12日
  • js事件循环机制
  • 深入理解AMBA总线(六)AHB-lite Slave响应和其它控制信号
  • 关于阿里云OSS传输加速域名(全地域上传下载加速)
  • Python httpx库终极指南
  • Day116 | 灵神 | 二叉树 | 二叉搜索树中第K小的元素
  • 无人甘蔗小车履带式底盘行走系统的研究
  • 关于物联网的基础知识(二)——物联网体系结构分层
  • 网络调优的策略有哪些
  • Oracle 通过 ROWID 批量更新表
  • Spring Web MVC响应
  • 《Effective Python》第1章 Pythonic 思维详解——item03-05
  • AUTOSAR图解==>AUTOSAR_TR_HWTestManagementIntegrationGuide
  • JVM 监控
  • 美国和沙特签署上千亿美元军售协议
  • 一海南救护车在西藏无任务拉警笛开道,墨脱警方:已处罚教育
  • 特朗普访中东绕行以色列,专家:凸显美以利益分歧扩大
  • 国务院新闻办公室发布《新时代的中国国家安全》白皮书
  • 湖南湘西州副州长刘冬生主动交代问题,接受审查调查
  • 家电维修担心遇“李鬼”?上海推动“物业+专业服务”进社区