react-router 2.0.0-rc5에서 현재 경로를 얻는 방법


83

다음과 같은 라우터가 있습니다.

<Router history={hashHistory}>
    <Route path="/" component={App}>
        <IndexRoute component={Index}/>
        <Route path="login" component={Login}/>
    </Route>
</Router>

내가 달성하고 싶은 것은 다음과 같습니다.

  1. /login로그인하지 않은 경우 사용자를로 리디렉션
  2. 사용자 /login가 이미 로그인 한 상태에서 액세스를 시도한 경우 루트로 리디렉션합니다./

그래서 지금은에서 사용자의 상태를 확인하기 위해 노력하고있어 AppS ' componentDidMount, 무언가를 좋아한다 :

if (!user.isLoggedIn) {
    this.context.router.push('login')
} else if(currentRoute == 'login') {
    this.context.router.push('/')
}

여기서 문제는 현재 경로를 가져 오는 API를 찾을 수 없다는 것입니다.

Router.ActiveState mixin 및 라우트 핸들러를 사용하여 제안 된 이 닫힌 문제를 발견 했지만이 두 솔루션은 이제 더 이상 사용되지 않는 것 같습니다.

답변:


112

더 많은 문서를 읽은 후 해결책을 찾았습니다.

https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/location.md

다음 location과 같이 구성 요소 인스턴스의 삽입 된 속성 에 액세스하면됩니다 .

var currentLocation = this.props.location.pathname

5
일부 하위 구성 요소에서는 사용할 수 없지만 prop을 통해 전달했습니다.
Damjan Pavlica

1
나를 위해 (v2.8.1), this.state.location.pathname(props 대신)을 통해 사용할 수 있습니다 .
internet-nico

2
이것을 컴포넌트에 추가해야합니다 static contextTypes = { router: React.PropTypes.object }
Alex Cory

1
그것은 자녀의 구성 요소를 사용할 수없는 경우, 당신은 단지 withRouter ()를 사용하여 포장 할 필요가
마이클 브라운

감사합니다. 링크가 도움이됩니다!
Alex Yursha

27

다음을 사용하여 현재 경로를 얻을 수 있습니다.

const currentRoute = this.props.routes[this.props.routes.length - 1];

... 가장 낮은 수준의 활성 <Route ...>구성 요소 에서 소품에 액세스 할 수 있습니다 .

주어진...

<Route path="childpath" component={ChildComponent} />

currentRoute.path반환 'childpath'currentRoute.component반환 function _class() { ... }.


1
이것은 경로에 정의 된 모든 사용자 지정 속성을 유지하므로 훌륭한 방법입니다. this.props.location이러한 사용자 지정 속성이 손실됩니다.
XtraSimplicity

이전 경로 (예 : 뒤로 버튼 + 레이블)를 얻으려면 다음을 사용할 수 있습니다this.props.routes.length - 2
devonj

10

히스토리를 사용하는 경우 라우터는 다음과 같이 모든 것을 히스토리의 위치에 넣습니다.

this.props.location.pathname;
this.props.location.query;

알 겠어요?


13
더 많은 의견과 참고 자료를 얻기 위해 답변을 확장 할 수 있습니까? 지금은 너무 일반적입니다
Farside

8

버전 3.0.0부터 다음을 호출하여 현재 경로를 가져올 수 있습니다.

this.context.router.location.pathname

샘플 코드는 다음과 같습니다.

var NavLink = React.createClass({
    contextTypes: {
        router: React.PropTypes.object
    },

    render() {   
        return (
            <Link {...this.props}></Link>
        );
    }
});

7

2017 년에 동일한 문제가 발생한 사용자를 위해 다음과 같은 방법으로 해결했습니다.

NavBar.contextTypes = {
    router: React.PropTypes.object,
    location: React.PropTypes.object
}

다음과 같이 사용하십시오.

componentDidMount () {
    console.log(this.context.location.pathname);
}

1
으로 PropTypes독립 의존성 지금, 추가 생각 : import PropTypes from 'prop-types'; ... NavBar.contextTypes = { router: PropTypes.object, location: PropTypes.object };
logicalicy


2

다음과 같이 'isActive'소품을 사용할 수 있습니다.

const { router } = this.context;
if (router.isActive('/login')) {
    router.push('/');
}

isActive는 참 또는 거짓을 반환합니다.

react-router 2.7로 테스트


0

같은 방식으로 나를 위해 작동합니다.

...
<MyComponent {...this.props}>
  <Route path="path1" name="pname1" component="FirstPath">
  ...
</MyComponent>
...

그런 다음 MyComponent 함수에서 "this.props.location.pathname"에 액세스 할 수 있습니다.

나는 그것이 내가 ...)))라는 것을 잊었다.) 다음 링크는 내비게이션 바 등을 위해 더 많은 것을 설명한다. : react router this.props.location


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