React-Router:为什么在react中未定义useHistory?

时间:2020-06-27 19:10:06

标签: reactjs react-hooks react-router-dom

我有这个。 它与文档中所说的完全相同。 我认为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的新手,请帮忙,谢谢

2 个答案:

答案 0 :(得分:8)

  1. 这是因为未在该组件中设置react-router上下文。 由于其<Router>组件可以设置上下文,因此您可以 在子组件中使用useHistory,但不要在子组件中使用。

  2. 从其中导入其中之一(RouteruseHistory钩子)时可能引发相同的错误 react-router和另一个来自react-router-dom和包 这些软件包的版本不匹配。不要同时使用它们,

答案 1 :(得分:0)

您在使用 useHistory 的同一组件中使用 <Router>...</Router> 将路由器添加到 DOM。

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

您必须将组件的 <Router>...</Router> 包装上移一级。你可以在 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);

这对我有用。