React-Router:为啥react中未定义useHistory? [复制]

Posted

技术标签:

【中文标题】React-Router:为啥react中未定义useHistory? [复制]【英文标题】:React-Router: Why is the useHistory undefined in react? [duplicate]React-Router:为什么react中未定义useHistory? [复制] 【发布时间】:2020-10-18 05:13:36 【问题描述】:

我有这个。 它与文档中所说的完全相同。 我认为 react-router-dom 模块很好,因为在其他组件中 BrowserRouter、Router 和 Link 对我有用

import  useHistory  from "react-router-dom"
import React from 'react'

export default function HomeButton() 
  let history = useHistory()

  function handleClick() 
    history.push("/home")
  

  return (
    <button type="button" onClick=handleClick>
      Go home
    </button>
  );

当我点击按钮时会发生这种情况

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

我是reactjs的新手,请帮忙,谢谢

【问题讨论】:

useHistory 无法在您拥有 Routes 的组件中工作,因为尚未设置 useHistory 所需的上下文。 useHistory 将适用于您在您中声明的任何子组件或组件,但不适用于 的父组件或组件本身 这能回答你的问题吗? Cannot read property 'history' of undefined (useHistory hook of React Router 5) 【参考方案1】:

您在使用 useHistory 的同一组件中使用 &lt;Router&gt;...&lt;/Router&gt; 将路由器添加到 DOM。

useHistory 仅适用于子组件,但不适用于父组件或组件本身。

您必须将组件的 &lt;Router&gt;...&lt;/Router&gt; 包装上移一层。您可以在 app.js 中执行此操作:

App.js



import  BrowserRouter as Router  from 'react-router-dom'; 

function App() 
  return (
    <Router>
      <div className="App">
      </div>
    </Router>
  );


export default App;

component.js


import React from'react';
import useHistory, withRouter  from "react-router-dom";


export default function HomeButton() 
  let history = useHistory()

  function handleClick() 
    history.push("/home")
  

  return (
    <button type="button" onClick=handleClick>
      Go home
    </button>
  );


export default withRouter(HomeButton);

这对我有用。

【讨论】:

以上是关于React-Router:为啥react中未定义useHistory? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 react-router 在调度时会自动返回上一个路由

为啥声明类型时可以在 redux 中未定义状态?

为啥react-router中的link用不了

为啥我的 react-router 链接会将我带到页面中间?

为啥我的变量在 useEffect 中定义的其他地方在反应中未定义?

react中为啥不window.location.href来跳转,还要用react-router来跳转