[reactjs] 반응 라우터를 사용하여 프로그래밍 방식으로 탐색

react-router내가 사용할 수 있습니다 Link기본적으로 처리 라우터 반응하는 링크를 생성하는 요소.

내부적으로 호출하는 것을 봅니다 this.context.transitionTo(...).

탐색을하고 싶습니다. 링크가 아니라 드롭 다운 선택 (예 :)입니다. 코드에서 어떻게 할 수 있습니까? 무엇입니까 this.context?

나는 Navigationmixin을 보았지만없이 이것을 할 수 mixins있습니까?



답변

후크가있는 React Router v5.1.0

useHistoryReact> 16.8.0 및 기능적 구성 요소를 사용하는 경우 React Router> 5.1.0에 새로운 후크가 있습니다.

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

function HomeButton() {
  const history = useHistory();

  function handleClick() {
    history.push("/home");
  }

  return (
    <button type="button" onClick={handleClick}>
      Go home
    </button>
  );
}

라우터 v4 반응

React Router v4를 사용하면 구성 요소 내에서 프로그래밍 방식으로 라우팅 할 수있는 세 가지 방법이 있습니다.

  1. withRouter고차 부품을 사용하십시오 .
  2. 컴포지션 사용 및 렌더링 <Route>
  3. 를 사용하십시오 context.

React Router는 대부분 history라이브러리를 둘러싼 래퍼 입니다. 브라우저 및 해시 기록을 통해 브라우저와 history의 상호 작용을 처리합니다 window.history. 또한 전역 기록이없는 환경에 유용한 메모리 기록을 제공합니다. 이는 특히 모바일 앱 개발 ( react-native) 및 노드를 사용한 단위 테스트에 유용합니다 .

history인스턴스를 탐색하기위한 두 가지 방법이 있습니다 : pushreplace. history를 방문한 위치의 배열로 생각 하면 배열에 push새 위치를 추가하고 배열 replace의 현재 위치를 새 위치로 바꿉니다. 일반적으로 push탐색 할 때이 방법 을 사용하려고합니다 .

이전 버전의 React Router에서는 자체 history인스턴스 를 작성해야 했지만 v4 <BrowserRouter>에서는 <HashRouter>, 및 <MemoryRouter>구성 요소가 브라우저, 해시 및 메모리 인스턴스를 작성합니다. React Router는 라우터와 history연결된 인스턴스 의 속성과 메서드를 컨텍스트 아래의 router개체 아래에서 사용할 수있게 합니다.

1. withRouter고차 부품 사용

withRouter고차 성분을 분사 할 history컴포넌트의 소품으로 개체. 이를 통해 를 처리하지 않고도 pushreplace메소드 에 액세스 할 수 있습니다 context.

import { withRouter } from 'react-router-dom'
// this also works with react-router-native

const Button = withRouter(({ history }) => (
  <button
    type='button'
    onClick={() => { history.push('/new-location') }}
  >
    Click Me!
  </button>
))

2. 컴포지션을 사용하고 <Route>

<Route>구성 요소는 일치하는 위치는 아니다. 경로없는 경로를 렌더링 할 수 있으며 항상 현재 위치와 일치합니다 . <Route>구성 요소와 같은 소품을 통과 withRouter당신이 액세스 할 수 있도록 history관통 방법을 history소품.

import { Route } from 'react-router-dom'

const Button = () => (
  <Route render={({ history}) => (
    <button
      type='button'
      onClick={() => { history.push('/new-location') }}
    >
      Click Me!
    </button>
  )} />
)

3. 문맥을 사용하십시오 *

그러나 당신은 아마해서는 안됩니다

마지막 옵션은 React의 컨텍스트 모델로 편안하게 작업 할 수있는 경우에만 사용해야하는 옵션입니다 (React의 컨텍스트 API는 v16부터 안정적 ​​임).

const Button = (props, context) => (
  <button
    type='button'
    onClick={() => {
      // context.history.push === history.push
      context.history.push('/new-location')
    }}
  >
    Click Me!
  </button>
)

// you need to specify the context type so that it
// is available within the component
Button.contextTypes = {
  history: React.PropTypes.shape({
    push: React.PropTypes.func.isRequired
  })
}

1과 2는 구현하기에 가장 간단한 선택이므로 대부분의 경우 가장 좋은 선택입니다.


답변

React-Router 5.1.0+ 답변 (후크 사용 및 React> 16.8)

useHistory기능 구성 요소 의 새로운 후크를 사용 하고 프로그래밍 방식으로 탐색 할 수 있습니다.

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

function HomeButton() {
  let history = useHistory();
  // use history.push('/some/path') here
};

반응 라우터 4.0.0+ 답변

4.0 이상에서는 히스토리를 컴포넌트의 소품으로 사용하십시오.

class Example extends React.Component {
   // use `this.props.history.push('/some/path')` here
};

참고 :이 컴포넌트가에 의해 렌더링되지 않은 경우 this.props.history는 존재하지 않습니다 <Route>. <Route path="..." component={YourComponent}/>YourComponent에 this.props.history가 있어야합니다.

반응 라우터 3.0.0+ 답변

3.0 이상에서는 라우터를 컴포넌트의 소품으로 사용하십시오.

class Example extends React.Component {
   // use `this.props.router.push('/some/path')` here
};

반응 라우터 2.4.0+ 답변

2.4 이상에서는 상위 구성 요소를 사용하여 라우터를 구성 요소의 소품으로 가져옵니다.

import { withRouter } from 'react-router';

class Example extends React.Component {
   // use `this.props.router.push('/some/path')` here
};

// Export the decorated class
var DecoratedExample = withRouter(Example);

// PropTypes
Example.propTypes = {
  router: React.PropTypes.shape({
    push: React.PropTypes.func.isRequired
  }).isRequired
};

반응 라우터 2.0.0+ 답변

이 버전은 1.x와 역 호환되므로 업그레이드 안내서가 필요하지 않습니다. 예제를 살펴 보는 것만으로도 충분합니다.

즉, 새로운 패턴으로 전환하려면 라우터 내부에 액세스 할 수있는 browserHistory 모듈이 있습니다.

import { browserHistory } from 'react-router'

이제 브라우저 기록에 액세스 할 수 있으므로 밀어 넣기, 바꾸기 등의 작업을 수행 할 수 있습니다.

browserHistory.push('/some/path')

추가 자료 :
기록
탐색


반응 라우터 1.xx 답변

나는 세부 사항을 업그레이드하지 않을 것입니다. 업그레이드 안내서 에서 이에 대해 읽을 수 있습니다

여기서 질문에 대한 주요 변경 사항은 탐색 믹스 인에서 기록으로 변경되었습니다. 이제 브라우저 historyAPI를 사용하여 경로를 변경하므로 앞으로 사용할 것 pushState()입니다.

다음은 Mixin을 사용하는 예입니다.

var Example = React.createClass({
  mixins: [ History ],
  navigateToHelpPage () {
    this.history.pushState(null, `/help`);
  }
})

이주의 History에서 온다 rackt / 역사 프로젝트. React-Router 자체가 아닙니다.

ES6 클래스로 인해 어떤 이유로 Mixin을 사용하지 않으려면 라우터에서 가져온 기록에 액세스 할 수 있습니다 this.props.history. 라우터에서 렌더링 한 구성 요소에만 액세스 할 수 있습니다. 따라서 하위 구성 요소에서 사용하려면를 통해 속성으로 전달해야합니다 props.

1.0.x 설명서 에서 새 릴리스에 대한 자세한 내용을 읽을 수 있습니다

컴포넌트 외부 탐색에 대한 도움말 페이지 는 다음과 같습니다.

참조를 잡고 history = createHistory()호출 하는 것이 좋습니다 replaceState.

반응 라우터 0.13.x 답변

나는 같은 문제에 봉착했고 반응 라우터와 함께 제공되는 Navigation 믹스 인 솔루션 만 찾을 수있었습니다.

내가 한 방법은 다음과 같습니다

import React from 'react';
import {Navigation} from 'react-router';

let Authentication = React.createClass({
  mixins: [Navigation],

  handleClick(e) {
    e.preventDefault();

    this.transitionTo('/');
  },

  render(){
    return (<div onClick={this.handleClick}>Click me!</div>);
  }
});

transitionTo()액세스 할 필요없이 전화를 걸 수있었습니다.context

아니면 당신은 멋진 ES6를 시도 할 수 있습니다 class

import React from 'react';

export default class Authentication extends React.Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick(e) {
    e.preventDefault();

    this.context.router.transitionTo('/');
  }

  render(){
    return (<div onClick={this.handleClick}>Click me!</div>);
  }
}

Authentication.contextTypes = {
  router: React.PropTypes.func.isRequired
};

반응 라우터 루덕

참고 : Redux 를 사용하는 경우 React-Redux 와 동일한 접근 방식을 사용하여 ReactRouter에 대한 redux 바인딩을 제공하는
React-Router-Redux 라는 또 다른 프로젝트
가 있습니다.

React-Router-Redux에는 액션 제작자 내부를 간단하게 탐색 할 수있는 몇 가지 방법이 있습니다. 이는 React Native에 기존 아키텍처가있는 사람들에게 특히 유용 할 수 있으며, 보일러 플레이트 오버 헤드를 최소화하면서 React Web에서 동일한 패턴을 활용하고자합니다.

다음 방법을 탐색하십시오.

  • push(location)
  • replace(location)
  • go(number)
  • goBack()
  • goForward()

다음은 Redux-Thunk 사용 예입니다 .

./actioncreators.js

import { goBack } from 'react-router-redux'

export const onBackPress = () => (dispatch) => dispatch(goBack())

./viewcomponent.js

<button
  disabled={submitting}
  className="cancel_button"
  onClick={(e) => {
    e.preventDefault()
    this.props.onBackPress()
  }}
>
  CANCEL
</button>


답변

반응 라우터 v2

가장 최근 릴리스 ( v2.0.0-rc5)의 경우 권장 탐색 방법은 기록 싱글 톤을 직접 푸시하는 것입니다. 구성 요소 외부 탐색 문서 에서 실제로 작동하는 것을 볼 수 있습니다 .

관련 발췌 :

import { browserHistory } from 'react-router';
browserHistory.push('/some/path');

최신 반응 라우터 API를 사용하는 경우 컴포넌트 내부 history에서 from 을 사용해야합니다 this.props.

this.props.history.push('/some/path');

또한 제공 pushState하지만 기록 된 경고에 따라 더 이상 사용되지 않습니다.

를 사용 react-router-redux하면 다음 push과 같이 전달할 수 있는 기능을 제공합니다 .

import { push } from 'react-router-redux';
this.props.dispatch(push('/some/path'));

그러나 이것은 실제로 페이지를 탐색하지 않고 URL을 변경하는 데만 사용될 수 있습니다.


답변

ES6을 사용 react-router v2.0.0하여 이를 수행하는 방법은 다음과 같습니다 . 믹스 인에서 멀어졌습니다.react-router

import React from 'react';

export default class MyComponent extends React.Component {
  navigateToPage = () => {
    this.context.router.push('/my-route')
  };

  render() {
    return (
      <button onClick={this.navigateToPage}>Go!</button>
    );
  }
}

MyComponent.contextTypes = {
  router: React.PropTypes.object.isRequired
}


답변

반응 라우터 4.x 답변 :

결국에는 구성 요소 외부에서도 수행 할 수있는 단일 기록 개체를 갖고 싶습니다. 내가 좋아하는 것은 주문형으로 가져 와서 조작하는 하나의 history.js 파일을 갖는 것입니다.

BrowserRouter라우터 로 변경 하고 히스토리 소품을 지정하기 만하면 됩니다. 원하는대로 조작 할 수있는 고유 한 히스토리 오브젝트가 있다는 점을 제외하고는 아무것도 변경되지 않습니다.

에 의해 사용되는 라이브러리 인 history 를 설치해야합니다 react-router.

사용법 예, ES6 표기법 :

history.js

import createBrowserHistory from 'history/createBrowserHistory'
export default createBrowserHistory()

BasicComponent.js

import React, { Component } from 'react';
import history from './history';

class BasicComponent extends Component {

    goToIndex(e){
        e.preventDefault();
        history.push('/');
    }

    render(){
        return <a href="#" onClick={this.goToIndex}>Previous</a>;
    }
}

2018 년 4 월 16 일 수정 :

실제로 Route컴포넌트 에서 렌더링 된 컴포넌트를 탐색해야하는 경우 다음 과 같이 소품에서 히스토리에 액세스 할 수도 있습니다.

BasicComponent.js

import React, { Component } from 'react';

class BasicComponent extends Component {

    navigate(e){
        e.preventDefault();
        this.props.history.push('/url');
    }

    render(){
        return <a href="#" onClick={this.navigate}>Previous</a>;
    }
}


답변

이 경우 서버 측을 제어하지 않고 해시 라우터 v2를 사용하는 사람은 다음과 같습니다.

당신의 장소 역사를 (예를 들어 app_history.js ES6) 별도의 파일로 :

import { useRouterHistory } from 'react-router'
import { createHashHistory } from 'history'
const appHistory = useRouterHistory(createHashHistory)({ queryKey: false });

export default appHistory;

그리고 어디서나 사용하십시오!

반응 라우터의 진입 점 (app.js ES6) :

import React from 'react'
import { render } from 'react-dom'
import { Router, Route, Redirect } from 'react-router'
import appHistory from './app_history'
...
const render((
  <Router history={appHistory}>
  ...
  </Router>
), document.querySelector('[data-role="app"]'));

모든 구성 요소 (ES6) 내 탐색 :

import appHistory from '../app_history'
...
ajaxLogin('/login', (err, data) => {
  if (err) {
    console.error(err); // login failed
  } else {
    // logged in
    appHistory.replace('/dashboard'); // or .push() if you don't need .replace()
  }
})


답변

라우터 V4 반응

tl : dr;

if (navigate) {
  return <Redirect to="/" push={true} />
}

간단하고 선언적인 답변은 다음 <Redirect to={URL} push={boolean} />과 함께 사용해야합니다 .setState()

push : boolean- true 인 경우 경로 재 지정은 현재 항목을 바꾸는 대신 새 항목을 내역으로 푸시합니다.


import { Redirect } from 'react-router'

class FooBar extends React.Component {
  state = {
    navigate: false
  }

  render() {
    const { navigate } = this.state

    // here is the important part
    if (navigate) {
      return <Redirect to="/" push={true} />
    }
   // ^^^^^^^^^^^^^^^^^^^^^^^

    return (
      <div>
        <button onClick={() => this.setState({ navigate: true })}>
          Home
        </button>
      </div>
    )
  }
}

여기에 전체 예제가 있습니다 . 자세한 내용은 여기를 참조 하십시오 .

추신. 이 예에서는 ES7 + Property Initializer 를 사용 하여 상태를 초기화합니다. 관심이 있으시면 여기도 보십시오 .