当前位置: 首页 > 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. 避免循环跳转

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

http://www.xdnf.cn/news/394363.html

相关文章:

  • 《Vuejs 设计与实现》第 4 章(响应式系统)( 下 )
  • ES 面试题系列「二」
  • C++ asio网络编程(4)异步读写操作及注意事项
  • (十二)Java枚举类深度解析:从基础到高级应用
  • C++八股——函数对象
  • 工具篇-扣子空间MCP,一键做游戏,一键成曲
  • C/C++实践(五)C++内存管理:从基础到高阶的系统性实现指南
  • 《从零构建一个简易的IOC容器,理解Spring的核心思想》
  • 命令行解释器中shell、bash和zsh的区别
  • LangChain对话链:打造智能多轮对话机器人
  • C 语言报错 xxx incomplete type xxx
  • CTFd CSRF 校验模块解读
  • 表加字段如何不停机
  • NCCL N卡通信机制
  • 《Effective Python》第1章 Pythonic 思维详解——始终用括号包裹单元素元组
  • 用一张网记住局域网核心概念:从拓扑结构到传输介质的具象化理解
  • 懒人美食帮SpringBoot订餐系统开发实现
  • Linux网络编程day9 libevent库
  • 代码随想录算法训练营第60期第三十二天打卡
  • RAII是什么?
  • 大学之大:东京工业大学2025.5.11
  • 误差函数(Error Function)的推导与物理意义
  • 【电机控制器】PY32MD310K18U7TR——ADC、UART
  • AAAI-2025 | 电子科大类比推理助力精准识别!SPAR:基于自提示类比推理的无人机目标探测技术
  • Java 线程池原理
  • 解决stm32HAL库使用vscode打开,识别不到头文件及uint8_t等问题
  • LOJ 6346 线段树:关于时间 Solution
  • 假如你的项目是springboot+vue怎么解决跨域问题
  • Anaconda环境中conda与pip命令的区别
  • Java--图书管理系统(简易版)