在 React-Router v4 中以编程方式导航

IT技术 reactjs react-router
2021-04-19 11:43:18

我迫不及待地开始使用react-routerv4的最新 alpha 版本全新的功能<BrowserRouter/>可以让您的 UI 与浏览器历史记录保持同步,但我如何使用它以编程方式导航?

6个回答

路由器将historyprops散列中向您的组件添加一个对象因此,在您的组件中,只需执行以下操作:

this.props.history.push('/mypath')

这是一个完整的例子:

App.js

import React from 'react'
import {BrowserRouter as Router, Route} from 'react-router-dom'

import Login from './Login'

export default class App extends React.Component {
  render() {
    return (
      <Router>
        <div>
          <Route exact path='/login' component={Login} />
        </div>
      </Router>
    )
  }
}

Login.js

import React, {PropTypes} from 'react'

export default class Login extends React.Component {
  constructor(props) {
    super(props)
    this.handleLogin = this.handleLogin.bind(this)
  }

  handleLogin(event) {
    event.preventDefault()
    // do some login logic here, and if successful:
    this.props.history.push(`/mypath`)
  }

  render() {
    return (
      <div>
        <form onSubmit={this.handleLogin}>
          <input type='submit' value='Login' />
        </form>
      </div>
    )
  }
}
@PardeepJain 您能否包含堆栈跟踪的前几行(如果有)?
2021-05-22 11:43:18
抛出错误Cannot read property 'object' of undefined,对此有什么技巧吗?
2021-05-24 11:43:18
哇谢谢。这节省了我的一天。与最新版本的 react 和 react-router 完美配合
2021-06-01 11:43:18
这更像是一种命令式方法。你应该只是使用Redirect在后台使用相同的PushReplace方法,但更具声明性
2021-06-12 11:43:18

在过去,您可能习惯于browserHistory推动一条新的道路。这不适用于react-routerv4。相反,你必须使用化妆作出react的中contextroutertransitionTo方法。

这是一个简单的例子:

import React from 'react';

class NavigateNext extends React.Component {
  constructor() {
    super();
    this.navigateProgramatically = this.navigateProgramatically.bind(this);
  }

  navigateProgramatically(e) {
    e.preventDefault();

    this.context.router.transitionTo(e.target.href)
  }

  render() {
    return (
      <Link to={"/next-page"}
            onClick={this.navigateProgramatically}
      >Continue</Link>
    );
  }
}

NavigateNext.contextTypes = {
  router: React.PropTypes.object
};

transitionTo只是可用的router方法之一。router对象还包含blockTransitions(getPromptMessage)createHref(to)并且replaceWith(loc)这是值得一试。

是提到上述方法官方react-router教程如果您想了解有关使用react更多信息,context请查看文档

这对我不起作用。我最终发现你需要的一切都传递给你的组件props您只需要this.props.history.push('/mypath'). 我在下面的单独答案中给出了一个完整的例子:stackoverflow.com/a/43250939/1533892
2021-05-26 11:43:18
我正在使用 redux。如何从动作创建者访问路由器对象?
2021-06-03 11:43:18
我正在尝试这个,但上下文对象中的路由器变量未定义。“不知何故”它是 Link.js 中的有效变量。知道如何在 Link.js 之外获取路由器对象吗?
2021-06-10 11:43:18
@Kaidjin 检查以在redux 操作中访问历史记录
2021-06-14 11:43:18

我没有足够的声誉来发表评论,但在回答@singularity 的问题时,您必须包含您希望在组件类的contextTypes静态属性上可用的上下文属性。

来自React 文档context

如果未定义 contextTypes,则 context 将是一个空对象。

在这种情况下:

class NavigateNext extends React.Component {

  // ...

  static contextTypes = {
    router: PropTypes.object
  }

  // ...

}

propTypes,contextTypes实际上导致 React 的行为不同,并且不仅用于类型检查。

感谢您指出这一点。我在 propTypes 而不是 contextTypes 上设置了“路由器”。
2021-06-03 11:43:18
谢谢这是缺少的东西。现在我可以使用 this.context.history.goBack()
2021-06-09 11:43:18

使用withRouter将为您的组件添加路由器属性,然后您可以像使用 v3 一样访问history和使用push

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

class Form extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      input: '',
    };

    this._submit = this._submit.bind(this);
  }

  render() {
    return (
      <form onSubmit={this._submit}>
        <input type="text" onChange={(event) => this.setState({input: event.target.value})}/>

        <button type="submit">Submit</button>
      </form>
    );
  }

  _submit(event) {
    event.preventDefault();

    this.props.history.push(`/theUrlYouWantToGoTo`);
  }
}

export default withRouter(Form);
像魅力一样工作,对于和我一样讨厌 React Router 的人来说,这会奏效;)
2021-06-13 11:43:18
为什么不使用 <Redirect /> 或将 <Route /> 放在子组件中?
2021-06-20 11:43:18

react-router v4 beta 发布,API 稍有改动。而不是this.context.router.transitionTo(e.target.href)做什么,this.context.router.push(e.target.href)如果你使用的是最新版本。

链接到新文档:https : //reacttraining.com/react-router/#context.router

我使用的是 react-router-dom 4.1.2 版,我得到这个工作的唯一方法是使用this.context.router.history.push('/'). 也许这会帮助某人。
2021-06-21 11:43:18