react-router(v4)戻る方法は?


91

前のページに戻るにはどうすればよいかを理解しようとしています。使ってます[react-router-v4][1]

これは、最初のランディングページで構成したコードです。

<Router>
  <div>
    <Link to="/"><div className="routerStyle"><Glyphicon glyph="home" /></div></Link>
    <Route exact path="/" component={Page1}/>
    <Route path="/Page2" component={Page2}/>
    <Route path="/Page3" component={Page3}/>
  </div>
</Router>

次のページに転送するために、私は単に次のことを行います。

this.props.history.push('/Page2');

ただし、どうすれば前のページに戻ることができますか?下記のようないくつかのことを試しましたが、運がありません:1。this.props.history.goBack();

エラーが発生します:

TypeError:nullはオブジェクトではありません( 'this.props'を評価しています)

  1. this.context.router.goBack();

エラーが発生します:

TypeError:nullはオブジェクトではありません( 'this.context'を評価しています)

  1. this.props.history.push('/');

エラーが発生します:

TypeError:nullはオブジェクトではありません( 'this.props'を評価しています)

Page1以下にコードを投稿します。

import React, {Component} from 'react';
import {Button} from 'react-bootstrap';

class Page1 extends Component {
  constructor(props) {
    super(props);
    this.handleNext = this.handleNext.bind(this);
  }


  handleNext() {
    this.props.history.push('/page2');
  }

  handleBack() {
    this.props.history.push('/');
  }


  /*
   * Main render method of this class
   */
  render() {
    return (
      <div>
        {/* some component code */}


        <div className="navigationButtonsLeft">
          <Button onClick={this.handleBack} bsStyle="success">&lt; Back</Button>
        </div>
        <div className="navigationButtonsRight">
          <Button onClick={this.handleNext} bsStyle="success">Next &gt;</Button>
        </div>

      </div>
    );
  }


export default Page1;

あなたが試したいくつかのことは何ですか?
Vivek Doshi

3

@VivekDoshi:私が遭遇したエラーと一緒に試したものを追加しました
Akshay Lokur 2017年

@ AkshayLokur、this.props.history.goBack();を実行しようとしている場所から完全なコードを投稿してください。
Vivek Doshi

@VivekDoshi:完了しました。ご覧ください。ありがとう
ござい

回答:


127

問題はバインディングにあると思います:

constructor(props){
   super(props);
   this.goBack = this.goBack.bind(this); // i think you are missing this
}

goBack(){
    this.props.history.goBack();
}

.....

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

あなたがコードを投稿する前に私が想定したように:

constructor(props) {
    super(props);
    this.handleNext = this.handleNext.bind(this);
    this.handleBack = this.handleBack.bind(this); // you are missing this line
}

ブラウザの戻るボタンを押すとにされたときに動作しないcomponentDidUpdatewindow.onpopstate
jmunsch

27
this.props.history.goBack();

これはreact-routerv4の正しいソリューションです

ただし、覚えておくべきことの1つは、this.props.historyが存在することを確認する必要があるということです。

つまりthis.props.history.goBack();、<Route />でラップされているコンポーネント内でこの関数を呼び出す必要があります。

コンポーネントツリーのより深いコンポーネントでこの関数を呼び出すと、機能しません。

編集:

コンポーネントツリーのより深い部分(<Route>でラップされていない)に履歴オブジェクトを含める場合は、次のようにします。

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

class Demo extends Component {
    ...
    // Inside this you can use this.props.history.goBack();
}

export default withRouter(Demo);

では、どのように機能するのでしょうか?どうすればどこからでも歴史に戻ることができますか?
フェリペ

@Felipeどこからでも戻ることができます。「履歴」オブジェクトを取得するには、コンテナコンポーネントにこのコード行を追加する必要があることを意味します。ルート(medium.com/@dan_abramov)でラップされていないプレゼンテーションコンポーネントからこのコード行を使用しないでください。 / smart-and-dumb-components-7ca2f9a7c7d0
Hoang Trinh

@Felipe:こんにちは、編集した回答を確認してください。それはあなたの質問に答えると思います。
Hoang Trinh 2018

withRouterを編集していただき、ありがとうございます。
マシューライドアウト

17

React Routerv4およびDOMツリー内の任意の機能コンポーネントで使用します。

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

const GoBack = ({ history }) => <img src="./images/back.png" onClick={() => history.goBack()} alt="Go back" />;

export default withRouter(GoBack);

ライフサイクル方式を使用しないため、これは優れたソリューションです。また、通過するもの、この場合は履歴オブジェクトを示しているため、私にはわかりやすくなっています。
ACパトリス

太い矢印バージョンは、いつも私にはずっときれいに見えます、そのおかげで。
egdavid

9

ここでの各回答には、ソリューション全体の一部が含まれています。これは、Routeが使用された場所よりも深いコンポーネントの内部で機能させるために使用した完全なソリューションです。

import React, { Component } from 'react'
import { withRouter } from 'react-router-dom'

^関数をインポートし、ページの下部にあるコンポーネントをエクスポートするには、その2行目が必要です。

render() {
  return (
  ...
    <div onClick={() => this.props.history.goBack()}>GO BACK</div>
  )
}

^矢印関数が必要であるのに対して単にonClick = {this.props.history.goBack()}

export default withRouter(MyPage)

^コンポーネントの名前を「withRouter()」でラップします


5

使用するコードを提供できますか this.props.history.push('/Page2');か?

goBack()メソッドを試しましたか?

this.props.history.goBack();

ここにリストされています ますhttps://reacttraining.com/react-router/web/api/history

ここにライブの例がありますhttps://reacttraining.com/react-router/web/example/modal-gallery


これは私にエラーを与えます、上記の更新された質問を見てください
Akshay Lokur 2017年

また、周りにコードを追加できますthis.props.history.push('/Page2');か?this.propsがnullでない場合は、機能するはずです。
アルフレドRe

実際には何もありません。コンポーネントの[戻る]ボタンをクリックするだけでこれを呼び出します
Akshay Lokur 2017年

5

これは、この問題を処理するための最もクリーンで簡単な方法ですthis keyword。これにより、の考えられる落とし穴も無効になります。機能コンポーネントを使用する:

import { withRouter } from "react-router-dom";これで あなたcomponent以上をラップするApp.jsと、「アプリ全体」で利用できるようになります。コンポーネントをラップすると、withRouter() HOChistoryhistory available for that specific 選択されるです。

だからあなたは持っています:

  1. export default withRouter(App);

  2. Redux環境で export default withRouter( connect(mapStateToProps, { <!-- your action creators -->})(App), );は、historyこの方法でアクションクリエーターからユーザーを利用できるはずです。

あなたcomponentの中で次のことをします:

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

const history = useHistory(); // do this inside the component

goBack = () => history.goBack();

<btn btn-sm btn-primary onclick={goBack}>Go Back</btn>

export default DemoComponent;

GottchauseHistoryは最新のv5.1からのみエクスポートされるreact-router-domため、必ずパッケージを更新してください。ただし、心配する必要はありません。の多くの障害についてthis keyword

これを再利用可能なコンポーネントにして、アプリ全体で使用することもできます。


function BackButton({ children }) {
  let history = useHistory()
  return (
    <button type="button" onClick={() => history.goBack()}>
      {children}
    </button>
  )
}```
Cheers.


2
ありがとう。しかし、ブラウザを元に戻したときにコンポーネントが再レンダリングされないのはなぜですか?
ステファン

0

試してみてください:

this.props.router.goBack()

これは私にエラーを与えます、上記の更新された質問を見てください
Akshay Lokur 2017年

ルーターや履歴小道具はどこから入手していますか?親コンポーネントまたはページ(つまり、render関数のconsole.log(this.props)から取得していることを確認し、使用できるようにするためにルーターの小道具を印刷していることを確認してください。あなたのコンポーネント内のルータを持っていない。
Rodius

0

単に使用する

<span onClick={() => this.props.history.goBack()}>Back</span>

0

これが誰かを助けることを願っています:

import React from 'react';
import * as History from 'history';
import { withRouter } from 'react-router-dom';

interface Props {
  history: History;
}

@withRouter
export default class YourComponent extends React.PureComponent<Props> {

  private onBackClick = (event: React.MouseEvent): void => {
    const { history } = this.props;
    history.goBack();
  };

...

0

多分これは誰かを助けることができます。

history.replace()リダイレクトに使用していたので、を使用しようとするとhistory.goBack()、作業しているページの前に前のページに送信されました。そこで、メソッドhistory.replace()をに変更しhistory.push()て、履歴を保存し、戻ることができるようにしました。


0

他の誰かがこの問題に遭遇したのか、それともこれを見る必要があるのか​​はわかりません。しかし、私はこの問題を解決するために約3時間を費やしました。

ボタンをクリックするだけで簡単なgoBack()を実装したかったのです。App.jsがすでにルーターにラップされていて、「react-router-dom」から{BrowserRouter as Router}をインポートしていたので、良いスタートを切ったと思いました。...ルーター要素を使用すると、履歴オブジェクトを評価できます。

例:

import React from 'react';
import './App.css';
import Splash from './components/Splash';
import Header from './components/Header.js';
import Footer from './components/Footer';
import Info from './components/Info';
import Timer from './components/Timer';
import Options from './components/Options';
import { BrowserRouter as Router, Route } from 'react-router-dom';
function App() {
  return (
    <Router>
      <Header />
      <Route path='/' component={Splash} exact />
      <Route path='/home' component={Info} exact />
      <Route path='/timer' component={Timer} exact />
      <Route path='/options' component={Options} exact />
      <Footer />
    </Router>
  );
}
export default App;

しかし、問題は私のNav(子コンポーネント)モジュールにあり、 'react-router-dom'; 'から{withRouter}をインポートする必要がありました。次に、次のコマンドでエクスポートを強制します。

export default withRouter(Nav);

例:

import React from 'react';
import { withRouter } from 'react-router-dom';
class Nav extends React.Component {
    render() {
        return (
            <div>
                <label htmlFor='back'></label>
                <button id='back' onClick={ () => this.props.history.goBack() }>Back</button>
                <label htmlFor='logOut'></label>
                <button id='logOut' ><a href='./'>Log-Out</a>            
</button>
            </div>
        );
    }
}
export default withRouter(Nav);

要約すると、withRouterは、ルーターからの継承が拒否された特定のシナリオで強制エクスポートが必要になるReactの既知の問題のために作成されました。


0

history.goBack()機能コンポーネントで使用できます。ちょうどこのような。

import { useHistory } from 'react-router';
const component = () => { 
  const history = useHistory();

  return (
   <button onClick={() => history.goBack()}>Previous</button>
  )
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.