react-router go back a page 你如何配置历史记录?

IT技术 javascript reactjs react-router
2021-03-05 11:49:33

谁能告诉我如何返回上一页而不是特定路线?

使用此代码时:

var BackButton = React.createClass({

 mixins: [Router.Navigation],
  render: function() {
    return (
        <button
            className="button icon-left"
            onClick={this.navigateBack}>
            Back
        </button>
    );
  },

  navigateBack: function(){
    this.goBack();
  }
});

得到这个错误,goBack() 被忽略,因为没有路由器历史记录

以下是我的路线:

// Routing Components
Route = Router.Route;
RouteHandler = Router.RouteHandler;
DefaultRoute = Router.DefaultRoute;

var routes = (
 <Route name="app" path="/" handler={OurSchoolsApp}>
     <DefaultRoute name="home" handler={HomePage} />
     <Route name="add-school" handler={AddSchoolPage}  />
     <Route name="calendar" handler={CalendarPage}  />
     <Route name="calendar-detail" path="calendar-detail/:id" handler={CalendarDetailPage} />
     <Route name="info-detail" path="info-detail/:id" handler={InfoDetailPage} />
     <Route name="info" handler={InfoPage} />
     <Route name="news" handler={NewsListPage} />
     <Route name="news-detail" path="news-detail/:id" handler={NewsDetailPage} />
     <Route name="contacts" handler={ContactPage} />
     <Route name="contact-detail" handler={ContactDetailPage} />
     <Route name="settings" handler={SettingsPage} />
 </Route>
 );

 Router.run(routes, function(Handler){
   var mountNode = document.getElementById('app');
   React.render(<Handler /> , mountNode);
 });
6个回答

更新 React v16 和 ReactRouter v4.2.0(2017 年 10 月):

class BackButton extends Component {
  static contextTypes = {
    router: () => true, // replace with PropTypes.object if you use them
  }

  render() {
    return (
      <button
        className="button icon-left"
        onClick={this.context.router.history.goBack}>
          Back
      </button>
    )
  }
}

更新 React v15 和 ReactRouter v3.0.0(2016 年 8 月):

var browserHistory = ReactRouter.browserHistory;

var BackButton = React.createClass({
  render: function() {
    return (
      <button
        className="button icon-left"
        onClick={browserHistory.goBack}>
        Back
      </button>
    );
  }
});

创建了一个带有嵌入式 iframe 的更复杂示例的小提琴:https : //jsfiddle.net/kwg1da3a/

React v14 和 ReacRouter v1.0.0(2015 年 9 月 10 日)

你可以这样做:

var React = require("react");
var Router = require("react-router");

var SomePage = React.createClass({
  ...

  contextTypes: {
    router: React.PropTypes.func
  },
  ...

  handleClose: function () {
    if (Router.History.length > 1) {
      // this will take you back if there is history
      Router.History.back();
    } else {
      // this will take you to the parent route if there is no history,
      // but unfortunately also add it as a new route
      var currentRoutes = this.context.router.getCurrentRoutes();
      var routeName = currentRoutes[currentRoutes.length - 2].name;
      this.context.router.transitionTo(routeName);
    }
  },
  ...

你需要小心,你有必要的历史可以回去。如果您直接点击页面然后回击,它会将您带回到应用程序之前的浏览器历史记录中。

此解决方案将处理这两种情况。但是,它不会处理可以使用后退按钮在页面内导航(并添加到浏览器历史记录)的 iframe。坦率地说,我认为这是react-router中的一个错误。问题在这里创建:https : //github.com/rackt/react-router/issues/1874

此外,根据设置,可能会使用 this.props.history.goBack 而不是 this.context.router.history.goBack
2021-05-08 11:49:33
如果有一种不使用上下文的方法来做到这一点会很好吗?
2021-05-19 11:49:33

使用 React 钩子

进口:

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

在无状态组件中:

let history = useHistory();

调用事件:

history.goBack()

示例在事件按钮中使用:

<button onClick={history.goBack}>Back</button>

或者

<button onClick={() => history.goBack()}>Back</button>
感谢您提到这一点,因为我喜欢钩子。到目前为止,我一直在使用 withRouter。
2021-04-26 11:49:33
<button onClick={() => history.goBack()}>返回</button>
2021-04-27 11:49:33
@Hunter 谢谢我正在做onClick={history.goBack()}然后它开始点击而不点击
2021-05-06 11:49:33
按原样传递函数也有效<button onClick={history.goBack}>Back</button>(不带括号)
2021-05-15 11:49:33
'useHistory' 不是从 'react-router-dom' 导出的。
2021-05-19 11:49:33

我认为你只需要通过像这样初始化它来在你的路由器上启用 BrowserHistory : <Router history={new BrowserHistory}>

在此之前,您应该要求BrowserHistory'react-router/lib/BrowserHistory'

我希望有帮助!

更新:ES6 中的示例

const BrowserHistory = require('react-router/lib/BrowserHistory').default;

const App = React.createClass({
    render: () => {
        return (
            <div><button onClick={BrowserHistory.goBack}>Go Back</button></div>
        );
    }
});

React.render((
    <Router history={BrowserHistory}>
        <Route path="/" component={App} />
    </Router>
), document.body);
反应路由器4怎么样?我认为它不再支持 BrowserHistory。
2021-04-23 11:49:33
这怎么算正确答案?这甚至没有回答这个问题。@轰炸机
2021-04-29 11:49:33
从 react-router-dom 版本 5 开始,历史记录是由 BrowserRouter 隐式创建的,并且可以通过 props 访问,您可以通过 props.history 访问它。
2021-04-30 11:49:33
对于任何阅读本文的人。如果您想从子组件执行此操作。您可以在 找到历史对象this.props.history于是,代码变成this.props.history.goBack
2021-05-08 11:49:33
您好,我们面临同样的问题。你能不能更详细地解释一下。谢谢
2021-05-15 11:49:33
  1. 进口 withRouter

    import { withRouter } from 'react-router-dom';
    
  2. 将您的组件导出为:

    export withRouter(nameofcomponent) 
    
  3. 例如,单击按钮时,调用goBack

    <button onClick={this.props.history.goBack}>Back</button>
    

react-router-domv4.3 上测试

顺便说一句,即使不导入或使用withRouter. 也许我们只是使用浏览器历史原生 API。但是这样好吗??
2021-04-23 11:49:33
@MichaelFreidgeim 能否请您上传您的代码片段,以便我进行检查和验证
2021-04-24 11:49:33
最好的解释在这里
2021-05-05 11:49:33
这是一个很好的解决方案。当用户使用直接 URL 登陆页面时的唯一问题 -> 它会破坏应用程序,因为它没有历史记录。
2021-05-20 11:49:33
this.context.router.goBack()

无需导航混合!

这在 React Router v4 中仍然有效,但它是this.context.router.history.goBack. (+历史)
2021-04-24 11:49:33
使用 react-router-dom: "v4.2.2" 并import { withRouter } from 'react-router-dom';this.props.history.goBack();
2021-04-30 11:49:33
除了@felansu 的评论外,您还需要按照答案stackoverflow.com/a/49130220/3123338 中的说明使用路由器导出组件
2021-05-09 11:49:33