react-router (v4) 돌아가는 방법?


84

이전 페이지로 돌아가는 방법을 알아 내려고합니다. 나는 사용하고있다[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');

그러나 이전 페이지로 돌아가려면 어떻게해야합니까? 아래에 언급 된 것과 같은 몇 가지를 시도했지만 운이 없었습니다.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
시도 this.props.history.goBack(); github.com/ReactTraining/react-router/blob/...을
baskax

@VivekDoshi : 추가 내가 오류와 함께 시도 내가가 발생
하기 Akshay Lokur에게

@AkshayLokur, this.props.history.goBack (); 실행하려는 곳에서 전체 코드를 게시 해 주시겠습니까?
Vivek Doshi

@VivekDoshi : 완료는 감사보고를하십시오
하기 Akshay Lokur

답변:


119

문제는 바인딩에 있다고 생각합니다.

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

25
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);

그렇다면 어떻게 작동 할 수 있습니까? 어디에서 어떻게 역사로 되돌아 갈 수 있습니까?
Felipe

@Felipe 어디에서나 돌아갈 수 있습니다. "히스토리"개체를 가져 오려면 컨테이너 구성 요소에이 코드 줄을 추가해야합니다. Route ( medium.com/@dan_abramov)로 래핑되지 않은 Presentational 구성 요소에서이 코드 줄을 사용하지 마십시오. / smart-and-dumb-components-7ca2f9a7c7d0 )
Hoang Trinh

@Felipe : 안녕하세요, 제 수정 된 답변을 확인해주세요. 나는 그것이 당신의 질문에 대답한다고 생각합니다.
Hoang Trinh

저를 위해 수정 한 withRouter 편집에 감사드립니다.
Matthew Rideout

17

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);

이것은 수명주기 방법을 사용하지 않기 때문에 좋은 솔루션입니다. 통과되는 것을 나타 내기 때문에이 경우에는 히스토리 객체가 더 명확합니다.
AC Patrice

뚱뚱한 화살 버전은 항상 나에게 훨씬 더 깨끗해 보입니다.
egdavid jul.

9

여기의 각 답변에는 전체 솔루션의 일부가 있습니다. 다음은 Route가 사용 된 곳보다 더 깊은 구성 요소 내부에서 작동하도록하는 데 사용한 완전한 솔루션입니다.

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

^ 함수를 가져오고 페이지 하단에 컴포넌트를 내보내려면 두 번째 줄이 필요합니다.

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

^ 화살표 함수가 필요함 vs 단순히 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

주변에 코드를 추가 할 수도 this.props.history.push('/Page2');있습니까? 경우 this.props가 null가 아닌, 그것을 작동합니다.
Alfredo Re

아무것도 정말, 난 그냥 내 구성 요소에서 뒤로 버튼의 클릭에 대해 문의
하기 Akshay Lokur

4

다음은이 문제를 처리 할 수있는 가장 깨끗하고 간단한 방법이며 this keyword. 기능적 구성 요소 사용 :

import { withRouter } from "react-router-dom"; 당신의 포장 component또는 더 나은 App.jswithRouter() HOC이 차종은 history"응용 프로그램 전체"사용할 수. 구성 요소를 감싸는 것만으로 history 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;

Gottcha useHistory는 최신 v5.1에서만 내보내 react-router-dom지므로 패키지를 업데이트해야합니다. 그러나 걱정할 필요는 없습니다. 의 많은 걸림돌에 대해 this keyword.

이 구성 요소를 재사용 가능한 구성 요소로 만들어 앱 전체에서 사용할 수도 있습니다.


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



2
감사. 그러나 브라우저를 다시 실행할 때 구성 요소가 다시 렌더링되지 않는 이유는 무엇입니까?
Stephane

0

시험:

this.props.router.goBack()

이것은 나에게 오류를 제공, 위의 업데이트 된 질문을 참조하십시오
하기 Akshay Lokur

라우터 또는 히스토리 소품을 어디서 얻습니까? 렌더링 함수의 상위 구성 요소 또는 페이지 (예 : console.log (this.props))에서 가져오고 있는지 확인하고 라우터 소품을 인쇄하여 사용할 수 있는지 확인합니다. 구성 요소에 라우터가 없습니다.
로디우스

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}를 가져 왔기 때문에 좋은 시작이라고 생각했습니다. ... 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의 알려진 문제로 인해 생성되었습니다. 특정 시나리오에서 라우터로부터 상속이 거부되는 경우 강제 내보내기가 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.