前のページに戻る方法を理解しようとしています。 [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」を評価)
this.context.router.goBack();
エラーが発生します:
TypeError:nullはオブジェクトではありません(「this.context」を評価します)
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">< Back</Button>
</div>
<div className="navigationButtonsRight">
<Button onClick={this.handleNext} bsStyle="success">Next ></Button>
</div>
</div>
);
}
export default Page1;
問題はバインディングにあると思います:
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
}
this.props.history.goBack();
これは、react-router v4の正しいソリューションです
ただし、留意すべきことの1つは、this.props.historyが存在することを確認する必要があるということです。
つまり、<Route />でラップされたコンポーネント内でこの関数this.props.history.goBack();
を呼び出す必要があります。
コンポーネントツリーのより深いコンポーネントでこの関数を呼び出すと、機能しません。
EDIT:
コンポーネントツリーのより深いコンポーネント(<Route>でラップされていない)に履歴オブジェクトを保持する場合は、次のように実行できます。
...
import {withRouter} from 'react-router-dom';
class Demo extends Component {
...
// Inside this you can use this.props.history.goBack();
}
export default withRouter(Demo);
React Router v4およびdom-tree内の任意の機能コンポーネントで使用します。
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);
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
ここの各回答には、ソリューション全体の一部が含まれています。ルートを使用した場所よりも深いコンポーネント内で動作させるために使用した完全なソリューションは次のとおりです。
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()」でラップします
試してください:
this.props.router.goBack()