React中useHistory钩子调用无效及Invalid hook call错误排查求助
解决React中useHistory钩子无效及Invalid hook call错误
看起来你遇到的问题主要来自两个方面:history版本与react-router-dom不兼容,以及路由组件的使用方式不符合react-router-dom v5的规范。下面是具体的排查和修复步骤:
一、版本冲突问题
你当前安装的history是v5.0.0,但react-router-dom v5.2.0依赖的是history v4.x版本,版本不匹配会导致React钩子调用异常,甚至触发"多个React副本"的错误场景。
修复步骤:
- 卸载当前不兼容的history包:
npm uninstall history
- 安装与react-router-dom v5兼容的history版本:
npm install history@4.10.1
二、路由组件配置错误
在react-router-dom v5中,你不需要手动创建BrowserHistory实例并传递给Router,官方提供的BrowserRouter已经内置了这部分逻辑,手动传递自定义history反而会破坏路由上下文,导致useHistory无法正确获取路由实例。
修改Route.js文件:
import React from 'react'; // 替换Router为内置的BrowserRouter import { BrowserRouter, Route, Switch, Redirect } from 'react-router-dom'; import Login from '../Pages/Login'; import Profile from '../Pages/Profile'; const Routes = () => { // 移除手动创建的history实例 return ( <BrowserRouter> <Switch> <Route path="/login" component={Login} /> <Route path="/profile" component={Profile} /> {/* 添加默认路由重定向,避免空白页面 */} <Route path="/" exact render={() => <Redirect to="/login" />} /> </Switch> </BrowserRouter> ); } export default Routes;
三、Login组件的小细节修复
你的Login组件里密码输入框的属性写错了,typ应该改为type,否则输入框功能会异常:
<input type="text" placeholder="password" />
验证修复
完成以上步骤后,重启你的开发服务器,点击Login页面的Submit按钮,应该就能正常跳转到Profile页面了。
内容的提问来源于stack exchange,提问作者Suria Prakash




