如何在 react-router v4 上获取历史记录?

IT技术 reactjs react-router
2021-03-28 00:09:25

我在从 React-Router v3 迁移到 v4 时遇到了一些小问题。在 v3 中,我可以在任何地方执行此操作:

import { browserHistory } from 'react-router';
browserHistory.push('/some/path');

我如何在 v4 中实现这一点。

我知道withRouter当您在组件中时,我可以使用 hoc 、react上下文或事件路由器props。但对我来说不是这样。

我正在寻找v4NavigatingOutsideOfComponents的等效项

6个回答

您只需要有一个导出history对象的module然后,您将在整个项目中导入该对象。

// history.js
import { createBrowserHistory } from 'history'

export default createBrowserHistory({
  /* pass a configuration object here if needed */
})

然后,您将使用该<Router>组件,而不是使用其中一个内置路由器

// index.js
import { Router } from 'react-router-dom'
import history from './history'
import App from './App'

ReactDOM.render((
  <Router history={history}>
    <App />
  </Router>
), holder)
// some-other-file.js
import history from './history'
history.push('/go-here')
非常感谢!目前,使用 react-router4,我不得不在 history.js 中使用这个导入: import createBrowserHistory from 'history/createBrowserHistory';
2021-05-24 00:09:25
createHashHistory如果您使用的是导入HashRouter
2021-06-01 00:09:25
我们可以使用 withHistory 并在 props 中获取历史记录,而不是创建单独的文件。这个解决方案对我的 redux 不起作用。
2021-06-10 00:09:25
当我将 history={history} 放入 Route 并像道具一样传递时,它对我有用
2021-06-20 00:09:25
@HassanAzzam 您可能使用的是 react-router V5,此答案适用于 V4,而不适用于 V5。我现在面临同样的挑战,正在四处寻找,但无法使其发挥作用。组件之外的 history.push 工作,但点击链接不再。
2021-06-21 00:09:25

这有效! https://reacttraining.com/react-router/web/api/withRouter

import { withRouter } from 'react-router-dom';

class MyComponent extends React.Component {
  render () {
    this.props.history;
  }
}

withRouter(MyComponent);
谢谢,这是从组件链接到另一条路由的最简单、最直接的方法。我只想补充一点,您需要这样做this.props.history.push('/some_route');才能使其正常工作。
2021-05-26 00:09:25
只要你在一个组件中。我不在组件中
2021-06-04 00:09:25
@storm_busterconst Component = props => {... // stuff}export default withRouter(Component)在无状态组件上为我工作
2021-06-14 00:09:25

如果您只需要历史对象才能导航到其他组件,则基于此答案

import { useHistory } from "react-router-dom";

function HomeButton() {
  const history = useHistory();

  function handleClick() {
    history.push("/home");
  }

  return (
    <button type="button" onClick={handleClick}>
      Go home
    </button>
  );
}
useHistory(和 React Hooks)比公认的答案更好/更干净
2021-06-03 00:09:25
错了,你在一个组件中。从接受的答案中查看 // some-other-file.js
2021-06-06 00:09:25

与接受的答案类似,您可以使用reactreact-router它本身为您提供history可以在文件中确定范围然后导出的对象。

历史.js

import React from 'react';
import { withRouter } from 'react-router';

// variable which will point to react-router history
let globalHistory = null;

// component which we will mount on top of the app
class Spy extends React.Component {
  constructor(props) {
    super(props)
    globalHistory = props.history; 
  }

  componentDidUpdate() {
    globalHistory = this.props.history;
  }

  render(){
    return null;
  }
}

export const GlobalHistory = withRouter(Spy);

// export react-router history
export default function getHistory() {    
  return globalHistory;
}

然后导入 Component 并挂载以初始化历史变量:

import { BrowserRouter } from 'react-router-dom';
import { GlobalHistory } from './history';

function render() {
  ReactDOM.render(
    <BrowserRouter>
        <div>
            <GlobalHistory />
            //.....
        </div>
    </BrowserRouter>
    document.getElementById('app'),
  );
}

然后您可以在安装后导入您的应用程序:

import getHistory from './history'; 

export const goToPage = () => (dispatch) => {
  dispatch({ type: GO_TO_SUCCESS_PAGE });
  getHistory().push('/success'); // at this point component probably has been mounted and we can safely get `history`
};

我什至制作了npm 包来做到这一点。

从 reactjs 16.9 开始,此解决方案将在 componentWillMount 和 componentWillReceiveProps 上发出弃用警告。
2021-05-29 00:09:25
@ian true,修复了
2021-06-15 00:09:25

如果您使用的是 redux 和 redux-thunk,最好的解决方案是使用react-router-redux

// then, in redux actions for example
import { push } from 'react-router-redux'

dispatch(push('/some/path'))

查看文档以进行一些配置很重要。

我来到这里希望找到这个确切的解决方案,谢谢
2021-06-21 00:09:25