我试图重定向我的用户时,用户登录。但我所有的方法,我发现到目前为止不会工作。etg我试图使用使用导航功能使用React路由器v6。
但由于某种原因,我得到以下错误:
Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
See react-invalid-hook-call for tips about how to debug and fix this problem.
地址:
/login.jsx:35
let navigate = useNavigate();
功能:
PerformLogin = () => {
let navigate = useNavigate();
const username = this.state.username;
const password = this.state.password;
if (username === '') {
console.log("please enter username");
} else if (password === '') {
console.log("please enter password");
} else {
console.log("username of login: ",this.state.username);
axios.post(process.env.REACT_APP_DATAURL + `/login`,{ username: username, password: password },{withCredentials: true})
.then(res => {
res = res.data;
console.log(res);
console.log(res.data);
if (res.type) {
console.log("navigating logged in");
navigate.push('/crime');
//return <Navigate to="/crime" />;
}
})
}
}
问:我必须做什么才能修复此问题并能够重定向我的用户?
5条答案
按热度按时间2eafrhcq1#
编辑:对于React路由器v6
在react-router v6中没有
withRouter
和useHistory
,为了简单起见,我建议重构您的组件以使用钩子,但另一种解决方案是创建一个 Package 器组件,将从钩子获得的导航函数作为prop传递:useHistory
是一个钩子,钩子只能在“函数”组件内部使用。但是我可以猜到您是从“类”组件使用它的,因为有一些
this.state
,所以您不能在那里使用钩子。另一种可行的方法是将组件 Package 在
withRouter
中:withRouter将把历史作为一个 prop 注入。
vbkedwbf2#
在react-router-dom最新**版本(v6)**中,您不能使用
this.props.match.params.id
和this.props.history
(在react最新版本中,将history
替换为navigate
)。此外,您不能在类组件中调用它们。要在类组件中调用它们,请先创建一个函数-ProductDetails
组件上。如下所示-App
模块,我在其中定义了路由-vfhzx4xs3#
您只能在组件内部的顶层(https://reactjs.org/docs/hooks-rules.html)调用钩子。
因此,这是无效的,因为它不仅出现在if语句中,出现在promise的
.then
函数中,而且看起来甚至不是一个函数组件,而只是一个函数:我会尝试设置一个标志,然后根据该标志进行导航:
但我会完全避免这种情况,而只是利用useHistory钩子来获取一个历史示例,并对其进行处理(我也没有测试,但它应该可以工作):
注意:你必须直接在你的组件本身中完成,你不能在一个不是组件的普通函数中使用钩子。
n8ghc7c14#
balp4ylt5#
在普通函数中不使用
useNavigate()