[英]react-router-dom useHistory() not working
The useHistory() hook is not working in my project. useHistory()钩子在我的项目中不起作用。 I have it in different components but none of them work.
我在不同的组件中有它,但它们都不起作用。 I am using "react-router-dom": "^5.2.0",
我正在使用“react-router-dom”:“^5.2.0”,
import {useHistory} from 'react-router-dom'
const history = useHistory()
const logout = () => {
toggleMenu()
setUser(null)
dispatch({type: 'LOGOUT'})
history.push('/')
}
And also in action its not working而且在行动中它也不起作用
export const signin = (formdata, history, setError) => async (dispatch) => {
try {
const {data} = await API.signIn(formdata)
if(data.error){
setError(data.message)
}else{
dispatch({type: SIGNIN, data})
history.push('/dashboard')
}
} catch (error) {
setError(error)
console.log(error)
}
}
Here is my router.js file这是我的 router.js 文件
const Router = () => {
const user = JSON.parse(localStorage.getItem('profile'))
return (
<BrowserRouter>
<>
{user && <Navigation/>}
<Switch>
<Route path='/page-not-found' component={Auth}/>
<Route path='/' exact component={()=>((user && user.result) ? <Redirect to="/dasboard"/> : <Auth/>)} />
<Route path='/dashboard' component={() => (user ? <Dashboard/> : <Redirect to='/'/>)} />
<Route path='/books-purchase' component={() => (user ? <BooksPage/> : <Redirect to='/' />)} />
</Switch>
</>
</BrowserRouter>
)
}
react router dom
less than 6.^
react router dom
小于6.^
You can use useHistory()
hook like your code is showing您可以像代码显示一样使用
useHistory()
钩子
react router dom
greater than 6.^
react router dom
大于6.^
You can use useNavigate()
hook like this.你可以像这样使用
useNavigate()
钩子。 You can also use without props不带道具也可以使用
import { useNavigate } from 'react-router-dom';
class Login extends Component {
....
let navigate = useNavigate();
navigate('/');
.....
而不是useHistory
,尝试useNavigate
:
import { useNavigate } from 'react-router-dom';
In my point of view, It doesn't need to downgrade react-router-dom
, just use "useNavigate" hook instead of "useHistory" hook.在我看来,它不需要降级
react-router-dom
,只需使用“useNavigate”钩子而不是“useHistory”钩子。 For example if you also want to send some data to your dashboard page, you can use it like so:例如,如果您还想向仪表板页面发送一些数据,您可以像这样使用它:
import { useNavigate } from 'react-router-dom' const FunctionalComponent = () => { const navigate = useNavigate(); const TestHandler = (someData) => { navigate("/dashboard", {state: {someData: someData}}); //and if you don't want to send any data use like so: //navigate("/dashboard"); } }
Finally, if you want to use that sent data for example in your dashboard page, you can do it like so:最后,如果您想在仪表板页面中使用发送的数据,您可以这样做:
import { useLocation } from 'react-router-dom' export const Dashboard = () => { const location = useLocation(); useEffect(() => { if (location.state.someData) { // "someData" is available here. } });
You can refer to this migration guide: https://reactrouter.com/docs/en/v6/upgrading/v5你可以参考这个迁移指南: https ://reactrouter.com/docs/en/v6/upgrading/v5
i have same error, I forgot add type to button that working function.我有同样的错误,我忘记为该工作功能的按钮添加类型。 when i give type,problem was solved
当我输入类型时,问题就解决了
If useNavigate
not working, react-router-dom
verison is older then v6
use useHistory
如果
useNavigate
不起作用, react-router-dom
版本比v6
旧,请使用useHistory
App.js应用程序.js
import React from 'react'
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import AuthGuard from "./Routes/AuthGuard";
function App() {
return (
<div className='App'>
<Router>
<Routes>
<Route path='/' element={<Home />} />
<Route path='/contact' element={<Contact />} />
<Route path='/guest-page' element={<AuthGuard isGuest={true}><h1>Guest Page</h1></AuthGuard>} />
<Route path='/protected-page' element={<AuthGuard requireToken={true}><h1>ProtectedPage</h1></AuthGuard>} />
</Routes>
</Router>
</div>
);
}
export default App;
AuthGuard.js AuthGuard.js
import { Route, useNavigate } from "react-router-dom";
import { useLayoutEffect } from "react";
const ProtectedRoute = ({requireToken, guest, children, ...rest}) => {
console.log(requireToken, guest, children, rest);
const navigate = useNavigate();
const hasToken = false;
let hasAccess = (!requireToken || (requireToken && hasToken));
let navigateTo = '/?login-rquired=true';
if(guest) {
hasAccess = !hasToken;
navigateTo = '/?guest=true';
console.log("Guest > hasAccess: " + hasAccess)
}
if(requireToken){
console.log("requireToken", requireToken)
}
useLayoutEffect(()=>{
if (!hasAccess) {
console.log("Not allowed");
navigate(navigateTo);
}
},[])
return (
<>{ hasAccess ? children : "Login required" }</>
)
}
export default ProtectedRoute;
Sometimes, if we call history in dialog or modal it shows error, pass the method to components有时,如果我们在对话框或模式中调用历史记录会显示错误,请将方法传递给组件
const methodTopass= () => {
history.push("/route");
};
<componet methodTopass/>
left "react-router-dom": "^5.2.0",
离开
"react-router-dom": "^5.2.0",
add "history": "4.10.1",
in to package.json在 package.json 中添加
"history": "4.10.1",
then use import { createBrowserHistory } from "history";
然后使用
import { createBrowserHistory } from "history";
and和
let hist = createBrowserHistory();
hist.push("/domoy");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.