升级react-router-dom v6.21.1后出现pathname未定义的TypeError
核心原因
类型定义与库版本不兼容
使用v5版本的@types/react-router-dom搭配v6版本的react-router-dom,两者API定义完全不匹配。v6中useNavigate返回的navigate函数与v5的history对象用法差异极大,旧类型定义会导致代码在类型检查和运行时出现冲突,最终触发pathname读取错误。测试环境模拟不匹配v6 API
如果测试中仍按照v5的方式模拟路由导航(比如模拟history.push而非v6的navigate),或者手动mock的useNavigate不符合v6的参数要求,当组件调用navigate时,mock函数内部可能错误地尝试读取参数的pathname属性(比如组件传的是字符串路径,而mock期望接收location对象),导致undefined报错。组件内
navigate调用可能存在隐性问题
虽然组件代码在v6下逻辑正确,但由于类型定义冲突,可能导致编译时未发现的参数错误(比如误传undefined作为导航参数),运行时触发读取pathname的错误。
解决步骤
同步类型定义版本
将@types/react-router-dom升级至与react-router-domv6.21.1匹配的版本(推荐直接安装@types/react-router-dom@6.21.1),确保类型定义与库的实际API完全一致,消除类型冲突带来的隐性错误。修正测试中的导航模拟逻辑
按照v6的useNavigateAPI来mock导航函数,示例:jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useNavigate: () => jest.fn(), }));同时确保测试中验证
navigate调用时,参数符合v6的用法(比如字符串路径或合法的location对象)。检查组件内
navigate调用
确认组件中调用navigate时的参数正确:v6支持直接传入路径字符串(navigate('/target'))或包含pathname的对象(navigate({ pathname: '/target' })),避免传入undefined或格式错误的参数。更新测试依赖
确保@testing-library/react-router等测试工具是支持v6的版本(比如@testing-library/react-router@^6.0.0),避免测试工具用v5的逻辑处理v6组件。
内容的提问来源于stack exchange,提问作者Chinna P

