首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反应路由器(v4)怎么回去?

反应路由器(v4)怎么回去?
EN

Stack Overflow用户
提问于 2017-10-11 06:38:35
回答 14查看 222.4K关注 0票数 123

想弄清楚怎么才能回到上一页。我正在使用[react-router-v4][1]

这是我在第一次登陆页面中配置的代码:

代码语言:javascript
复制
<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>

为了转发到以后的页面,我只需:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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;
EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2017-10-11 06:53:25

我认为问题在于具有约束力:

代码语言:javascript
复制
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>

正如我在您发布代码之前所假设的那样:

代码语言:javascript
复制
constructor(props) {
    super(props);
    this.handleNext = this.handleNext.bind(this);
    this.handleBack = this.handleBack.bind(this); // you are missing this line
}
票数 151
EN

Stack Overflow用户

发布于 2018-06-25 08:22:07

更新:

现在我们有了钩子,所以我们可以通过使用useHistory轻松地完成它

代码语言:javascript
复制
const history = useHistory()

const goBack = () => {
  history.goBack()
}

return (
  <button type="button" onClick={goBack}>
    Go back
  </button>
);

原始帖子:

代码语言:javascript
复制
this.props.history.goBack();

这是反应路由器v4的正确解决方案。

但是,您应该记住的一件事是,您需要确保this.props.history的存在。

这意味着您需要在组件中调用此函数this.props.history.goBack();,该组件由< That />包装

如果在组件树中更深的组件中调用此函数,它将无法工作。

编辑:

如果您想要在组件树中更深的组件中拥有历史对象(它不是由包装的),您可以这样做:

代码语言:javascript
复制
...
import {withRouter} from 'react-router-dom';

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

export default withRouter(Demo);
票数 69
EN

Stack Overflow用户

发布于 2018-10-23 11:33:59

用于React路由器、v4和dom-tree中任何位置的功能组件。

代码语言:javascript
复制
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);
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46681387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档