react-router2.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がすでにログインしているときにアクセスしようとした場合は、rootにリダイレクトします/

今私は、ユーザーの状態を確認しようとしているAppcomponentDidMountような何かを、その後、:

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

ここでの問題は、現在のルートを取得するためのAPIが見つからないことです。

このクローズされた問題は、Router.ActiveStateミックスインとルートハンドラーの使用が示唆されていることがわかりましたが、これら2つのソリューションは現在非推奨になっているようです。

回答:


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を介してそれらを渡すことができました。
ダムジャンパブリカ2016年

1
私(v2.8.1)の場合、this.state.location.pathname(小道具の代わりに)経由で入手できました。
internet-nico 2016

2
これをコンポーネントに必ず追加する必要があります static contextTypes = { router: React.PropTypes.object }
Alex Cory

1
子コンポーネントで使用できない場合は、withRouter()を使用してラップする必要があります
Michael Brown

おかげで、リンクは役に立ちます!
AlexYursha19年

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 2016年

そして、以前のルート(つまり、戻るボタン+ラベル)を取得するには、次を使用できますthis.props.routes.length - 2
devonj 2017年

10

履歴を使用する場合、ルーターは次のようにすべてを履歴の場所に配置します。

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

それを得る?


13
より多くの入力といくつかの参照を持つために、あなたはあなたの答えを拡張することができるかもしれませんか?今のところそれはあまりにも一般的です
ファー

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はtrueまたはfalseを返します。

react-router2.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.