2017-03-14 7 views
0

私はReduxが本当に新しく、これを実装する方法について質問したいと思います。CombineReducersをReduxで使用するときに一般的な状態を共有する方法

私は、各ページが1つのReactコンポーネントを表すReactで書かれた完全なアプリケーションを持っています。 各Reactコンポーネントには独自のRedux Reducerとアクションがあります。

非常に簡単な例として、HomePageコンポーネントを考えてみましょう。

class HomePage extends React.Component { 
    render() { 
     return (
      <h1>Home Page</h1> 
     ) 
    } 
} 

私には、アプリケーションが完全にブートストラップされたことを示す現在の状態を変更する減速器があります。

export default function homePageReducer(state = {appBootstrapped: false}, action) { 
    switch (action.type) { 
     case 'APP_BOOTSTRAPPED': 
      state = { appBootstrapped: true } 
     default: 
      return state; 
    } 
} 

Reduxのアクションは以下の通りです:私のコンポーネントは、上記Reduxの実装を使用するように構成されている

export function SetApplicationBootstrapped() { 
    return { type: 'APP_BOOTSTRAPPED' } 
} 

function mapStateToProps(state, ownProps) { 
    return { 
     homePage: state.homePageReducer 
    } 
} 

export default connect(mapStateToProps)(HomePage); 

、私の構成要素の中から、私は私を呼び出すことができます通知するアクション私のアプリケーションが完全にブートストラップされたことを確認します。 しかし、私は、それぞれがコンポーネントで表され、各コンポーネントがそれ自身のレデューサー/アクションを持っているので、私は10ページを持っているので、すべてのレデューサーでアプリケーションをブートストラップするための呼び出しを実装する必要があるので、

これは通常のReduxアプローチですか?

もしそうでなければ、どうすればよいですか?

基本的な考え方は、アプリケーションをブートストラップするとすぐに非表示にしたいローディング画面を表すコンポーネントが必要なことです。 しかし、各コンポーネントは独自のアクションにしかアクセスできないため、別のコンポーネントの状態を変更することはできません。私は、それが自分の状態を管理している他の減速機の状態にアクセスすることを許可しないで、それぞれの減速機がcombineReducersであっても、それは私には分かっているので、私は共有状態のアイデアで少し失われている。

答えて

0

あなたがなぜそれを制限するのか分かりません。各コンポーネントは、独自のレデューサーとアクションにしかアクセスできません。あなたのケースでは、私はあなたがまだ今あなたがsharedappBootstrappedを入れて、そしてそのために共有アクションを作成することができます例

{ 
    shared: { ... }, 
    pageA: { ... }, 
    pageB: { ... }, 
    pageC: { ... } 
} 

のために、共有状態を持つことができると思います。


は、あなただけのトップレベルのコンポーネントを作成する必要があるので、あなたは一度だけを派遣することができます。

また、あなたはあなたの減速状態を変異させるべきではありません。

case 'APP_BOOTSTRAPPED': 
    state = { appBootstrapped: true } 

はちょうど私がここに小さな誤解があると思うcase文

case 'APP_BOOTSTRAPPED': 
    return { appBootstrapped: true } 
+0

における状態オブジェクトを右に戻します。各ページ(コンポーネント)は、APIからデータを取得するなど、レンダリング前にいくつかのロジックを持ちます。各ページは別のAPI呼び出しを実行します。API呼び出しが完了したときだけ、アプリケーションがブートストラップされたという動作設定をディスパッチする必要があります。私は 'top-level-component 'を使ってそれがどうやってできるのか分かりません。だから、各コンポーネントからロードする画面を実装せずに、アプリケーションがブートストラップされた状態を各コンポーネントからどのように設定できますか?したがって、コンポーネントXは、コンポーネントYの再レンダリングを可能にする状態を変更する必要があります。 – Complexity

+0

この問題は、単一のレデューサーを使用するだけで簡単に解決できます。そうすれば私は単一の状態しか持たないが、これが正しいアプローチであるかどうかは疑問だ。 – Complexity

+0

更新をお寄せいただきありがとうございます。これは、 'mapStateToProps'では、各コンポーネントが' Shared'状態にアクセスでき、読み込み画面を隠すようにアクションを呼び出す必要があることを意味していますか? – Complexity

関連する問題