ep-mobx-router缺失beforeExit钩子的问题排查与使用方案咨询
问题原因
你遇到的是库文档和对应版本功能不对齐的问题:
- 你安装的v0.2.3是ep-mobx-router的早期发行版本,beforeExit钩子是后续版本新增的API,该版本源码仅实现了onEnter钩子,不存在beforeExit相关逻辑
- 该库官方文档未做版本分区适配,展示的是最新版本的功能说明,没有标注beforeExit的最低支持版本,导致出现文档描述和实际可用API不符的问题
最小改动解决方案
以下方案按代码改动量从小到大排序:
方案1:使用patch-package给现有版本打补丁(推荐,侵入性最低)
该方案不需要修改上层业务代码,仅通过补丁给现有版本新增beforeExit能力,且补丁会在团队所有成员安装依赖时自动生效:
- 安装patch-package开发依赖:
# npm npm install patch-package --save-dev # yarn yarn add patch-package --dev
- 手动修改
node_modules/ep-mobx-router下的源码:- 在
route.ts的Route接口定义中新增beforeExit可选属性,类型对齐onEnter的参数定义 - 找到路由核心跳转逻辑(一般存在于
router.ts的go/replace等跳转方法中),在离开当前路由的逻辑前插入beforeExit钩子的调用逻辑:如果钩子返回false则中断跳转,否则继续执行原有跳转逻辑
- 在
- 执行命令生成补丁文件:
npx patch-package ep-mobx-router
- 将生成的
patches目录提交到代码仓库即可,后续安装依赖时补丁会自动应用
方案2:上层封装全局路由拦截
如果不想修改库源码,可以在上层封装跳转逻辑模拟beforeExit能力:
- 补充TypeScript类型声明,扩展原有Route的配置项:
declare module 'ep-mobx-router' { interface Route { beforeExit?: (fromRoute: Route, toRoute: Route, params: Record<string, any>) => boolean | Promise<boolean> } }
- 封装全局跳转工具函数,替换项目中所有直接调用ep-mobx-router原生跳转方法的位置:
import { router } from 'ep-mobx-router' export async function customNavigate(toRoute: Route, params?: Record<string, any>) { const currentRoute = router.currentRoute // 执行当前路由的beforeExit钩子 if (currentRoute.beforeExit) { const allowExit = await currentRoute.beforeExit(currentRoute, toRoute, params || {}) if (!allowExit) return } // 执行原有跳转逻辑 router.go(toRoute, params) }
方案3:升级ep-mobx-router到最新稳定版
先确认该库最新版本的更新日志,验证beforeExit钩子已实装且无破坏性改动的前提下,直接升级包版本即可,升级前建议先跑完全部现有业务测试用例避免兼容问题。
内容的提问来源于stack exchange,提问作者JSDrogon
相关产品推荐
相关产品推荐

