react-router (v4) 如何返回?
试图弄清楚如何返回上一页。我正在使用
[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 is not an object (evaluating 'this.props')
-
this.context.router.goBack();
出现错误:
TypeError: null is not an object (evaluating 'this.context')
-
this.props.history.push('/');
出现错误:
TypeError: null is not an object (evaluating '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
}
更新:
现在我们有了钩子,所以我们可以使用 useHistory
const history = useHistory()
const goBack = () => {
history.goBack()
}
return (
<button type="button" onClick={goBack}>
Go back
</button>
);
原始帖子:
this.props.history.goBack();
这是 react-router v4 的正确解决方案
但有一件事你应该记住,那就是你需要确保 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);
与 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);