如何正确使用 react-router-dom 中的 useHistory()?

Posted

技术标签:

【中文标题】如何正确使用 react-router-dom 中的 useHistory()?【英文标题】:How to properly use useHistory () from react-router-dom? 【发布时间】:2021-02-26 12:06:42 【问题描述】:

如何正确使用useHistory()?我无法从一个反应组件过渡到另一个。 根据 React 文档和 Stack Overflow 上的说明,我无法从 App.js 转换到 MyComponent.js。

例如 - 我正在尝试

/* **App.js ** */
/* Import modules */
import React from 'react';
import  useHistory  from 'react-router-dom'; // version 5.2.0

function App()

    let history = useHistory ();
    const handleClick = () => 
       history.push ('./pages/MyComponent');
        

    return (
       <div className="App">
          <button onClick=handleClick>Next page ==></button>
       </div>
    );

我也测试了这个例子,但是按下按钮时输出抛出以下错误:

TypeError: 无法读取未定义的属性“push”

是不是好像有什么东西泄露给我了,还是 Babel 那边出了什么问题?

项目反应结构:

+ Root/
    + src/
        - App.js
        - index.js
        + pages/
            - MyComponent.js
    

【问题讨论】:

push 和括号之间是否有空格? 没有错。 (我尝试过这个)。 @BlackMath 【参考方案1】:

这在 v6 中有所改变,useHistory 现在是 useNavigate,我们可以按如下方式使用它:

代替:

const history = useHistory()
history.push('/')

我们现在使用:

const navigate = useNavigate()
navigate('/')

【讨论】:

【参考方案2】:

您不能只使用useHistory 挂钩来重定向到另一个页面。 您需要正确设置应用程序才能使用 React Router。从这个https://reactrouter.com/web/example/basic开始看他们的例子

您需要使用&lt;BrowserRouter /&gt; 包装整个应用程序,这将通过挂钩提供您正在寻找的历史对象。

顺便说一句,您没有将 history.push 的相对文件路径作为参数提供,您必须提供通常使用 &lt;Route /&gt; 组件设置的有效路由

【讨论】:

【参考方案3】:

使用history.replace('/&lt;route-name&gt;') 也可以。

【讨论】:

【参考方案4】:

您需要将它与 react-router-dom 一起使用。设置您的路由器配置,然后将其推送到该路径。您可以通过查看文档来获取更多信息。

https://reactrouter.com/web/example/route-config

不要忘记设置您的开关组件和您的确切根路径。

【讨论】:

我们看不到他的路线。 app.js 通常包含该路由,并且有一条路由将您发送到第一个组件。似乎他正在尝试从第一个组件中获取历史记录而不设置任何路线。 我同意。他使用的是相对路径而不是绝对路径。 是的,他可以使用 withRouter,但如果你以正确的方式构建东西就没有任何问题 我更新了问题并添加了项目的树结构。 @TalOrlanczyk【参考方案5】:

当你应用 history.push 时,那是你的路径名吗? history.push('/pathname') 是我猜的过程。 你可以在这里看到:https://reactrouter.com/web/api/Hooks

【讨论】:

以上是关于如何正确使用 react-router-dom 中的 useHistory()?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React.js 中使用 react-router-dom 保持 App() 级别状态不重置?

如何在没有任何事件的情况下使用 react-router-dom 打开页面?

React TypeScript:react-router-dom 中 useLocation() 的正确类型

如何防止某人被在某些情况下从react-router-dom重定向

使用 react-router-dom 重新加载页面时出现问题

如何配置tomcat 7以在react中使用react-router-dom?