简体   繁体   English

react-router-dom useHistory()不起作用

[英]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>
      )
  }
  • For the version of react router dom less than 6.^对于react router dom小于6.^

You can use useHistory() hook like your code is showing您可以像代码显示一样使用useHistory()钩子

  • For the latest version of 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('/');
    
    .....

After some investigation, I found that there is a bug in react-router-dom version ^5.2.0 .经过一番调查,我发现react-router-dom版本^5.2.0存在一个错误。 See this and this .看到这个这个 I would suggest you to downgrade react-router-dom version to 4.10.1我建议你将react-router-dom版本降级到4.10.1

而不是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM