2015-11-02 26 views
9

ルートロード時にreact-routerのonEnterフックを使用して私のreduxストア内の変数をチェックしたいと思います。ドキュメント、onEnterによる反応ルータのonEnterフックからreduxストアに接続するにはどうすればいいですか?

...は、最初の引数として、次のルータの状態を受け取ります。 replaceState関数を使用して、別のURLへの遷移をトリガすることができます。

ストアが渡されません。このフック内からreduxストアに接続することは可能ですか?私はあらゆる種類のことを試しましたが、これを達成する方法を見つけることはできません。例えば

"react-redux": "^4.0.0", 
"react-router": "1.0.0-rc1", 
"redux": "^3.0.0", 

答えて

11

で状態を読み、あなたのルートのパラメーターに店舗をとる関数

export default (store) => { 
return (
    <Route handler={App} path="/"> 
    <Route path="mypath" component={handler} onEnter={myHook(store)}> 
    <Route> 
) 
}; 

はあなたの移行フック

で同じ操作を行います作ります
export const myHook = (store) => { 
    return (location, replaceWith) => { 
    // Do something with your store 
    } 
}; 

次に、店舗とルータを同じ場所に作成すると仮定しますルータmigration documentationに反応する

const router = (
      <Provider store={store}> 
       <Router history={history}> 
        {routes(store)} 
       </Router> 
      </Provider> 
     ); 
+1

これは私にとっては役に立たなかった。 RR v 2.0.0-rc5を使用している場合、これは(申し訳ありません):\t \t \t <ルータのルート= {routes()} history = {browserHistory} /> '、そしてルートは次のようになります:' exportデフォルトの(小道具)=> { \t返信[ \t \t {パス: "/"、コンポーネント:AppWrapper} }} ... 'これはコンソールに表示されます。 <ルーターのルート>を変更することはできません。それは無視されます。私は何か愚かなことをやっていますか(うまくいけば、簡単に修正可能ですか)? – hairbo

+0

より完全な例を教えてください(おそらく多分) 私が正しく覚えていれば、ルータコンポーネントが再レンダリングされている場合に警告が発生します。 – ganmor

+0

さて、待って、私はあなたの例を誤って読んだと思う。私は現時点で要望はありませんが(必要な場合は1つにすることができます)、私がやろうとしたことは、 "ストア"オブジェクト自体を渡すのではなく、Reduxストアの出力をルータに渡すことでした。前者の場合、RRが好きではないと思われるのイベントを再描画します(私はかなり確信しています)。後者の場合は、ストアにアクセスしてから、 'onEnter()'の中から 'store.getState()'を実行して現在のReduxアプリケーションの状態を取得します。 – hairbo

4

をあなたは、ファイルstore.jsと輸出最終ストアを作成することができます(同じあなたが再来に渡す)

:私が使用している

バージョンその後、

import configureStore from 'utils/configure-store.js'; 

const store = configureStore(); 
export default store; 

とルーターのファイルにインポートし、store.getState()

+0

答えにいくつかのコード例を追加 – Green

1

バージョン4ファイルの変更を処理するために、あなたのコンポーネントのライフサイクルメソッドを使用することをお勧めします。

たとえば、onEnterの代わりにcomponentWillMountを使用するか、componentWillReceivePropsで状態の変化に対応します。

だからあなたのコンポーネント自体に:ボーナスポイント

import { browserHistory } from 'react-router'; 

... 

componentWillMount() { 
    if (someConditionIsTrue) { 
    browserHistory.push('/your/new/path'); 
    } 
} 

単にあなたの元のコンポーネントをラップHigher Order Componentとしてこれを書くことができます。同じロジックを必要とする他のコンポーネント間でこのロジックを共有するのが簡単になります。

関連する問題