2017-07-12 1 views
0

私のチームと私は、reduxストアの設計に忙しくなりました。アプリケーションの性質上、私たちはreduxストアのさまざまなノード(ブランチ)間に固有のカップリング/依存関係を持っています。これらの依存関係を最もスケーラブルに処理するという我々の考えは、それを状態ツリーのそれ自身の別個のノードに抽出することでした。私たちが考えている構造を示しており、私たちが直面している問題に到達するために簡略化した例を挙げてみましょう:Reduxストアデータの依存関係の処理

  • SectionA::などのデータAと

    は、私たちの状態ツリーには、次のを持っていると言いますブール

  • SectionB:Aが真であるならば、Bはおそらく、なぜこれはそれを行う、考えている10以上

なければならないこと、依存関係を持つ:int型

  • DependencySectionとしてデータBとwどう?セクションBのレデューサーに依存性を統合するだけではどうですか?その理由は、これらの依存関係がクライアントごとに異なり、データベースからそれらの依存関係を読み取るためです。これは、状態ツリーの任意の部分を他の部分にリンクし、それ自体の動作を起こさせる必要があります。

    ここで私の質問は、これらの依存関係を考慮しながらアクションを減らすにはどうしたらいいですか?私たちのアプリケーションフローの場合:

    1. ユーザーたちはSectionCを紹介する場合に、何が起こるの依存

    に基づいて

  • DependencySection更新データB TOGGLE_DATA_Aアクションに
  • SectionA減速の更新データが発生しますデータBに依存するデータC? DependencySectionがデータBを更新するときに新しいアクションを開始する必要があるようで、データBが更新されているというアクションがあるようです。これは、別のアクションが減少している間にアクションを実行することを意味しますが、これは明らかに許可されていません。あるいは、さまざまな減速器セクションを非常に特定の順序で実行するように見えることも問題を解決すると思われますが、これは確かに反パターンです。

    私たちが思いつくことができる唯一の解決策は、状態が変わらなくなるまで、アクションごとにUPDATEアクションを繰り返し実行するミドルウェアを持つことです。例えば、TOGGLE_DATA_Aアクションが(データAへの依存性を介して)データBを更新した後、次のUPDATEアクションは(データBへの依存性を介して)データCを更新し、次のUPDATEは何も更新せずにループを停止する。これはかなりハッキーです。

    このような依存状態を減らす方が良い方法はありますか?あるいは、私たちの状態ツリーを違うように構造化するべきですか? Reduxの背後にある主要な概念の

  • 答えて

    1

    一つの減速ロジックはちょうどを機能、そしてあなたがあなたの状態の更新が特定の順序で処理する注文する必要がある場合、あなたはそのための明示的なコードを記述していることを自分で行うことができますであるということです。したがって、「異なるリデューサセクションを特定の順序で実行する」は、ではなく、では「反パターン」です。これは、Reduxでは絶対に有効で奨励されたアプローチです。

    ReduxドキュメントのStructuring Reducers - Beyond combineReducersセクションとブログ投稿Idiomatic Redux: The Tao of Redux, Part 1 - Implementation and IntentPractical Redux, Part 7: Feature Reducersには、このアプローチの例と説明があります。私は基本的な仮説の例を貼り付けます:

    export function commentsReducer(state = initialState, action, hasPostReallyBeenAdded) {} 
    
    // elsewhere 
    export default function rootReducer(state = initialState, action) { 
        const postState = postsReducer(state.post, action); 
        const {hasPostReallyBeenAdded} = postState; 
        const commentState = commentsReducer(state.comments, action, hasPostReallyBeenAdded); 
        return { post : postState, comments : commentState }; 
    } 
    
    +0

    ああ、私は参照してください。私は明らかにcombineReducersの単一ユースケースに巻き込まれました。あなたの非常に有益な答えと例をありがとう。 – CJNaude

    +0

    確かに。うん、 'combinedReducers'は減速器ロジックを構築するための推奨されているデフォルトのアプローチですが、ユースケースのカスタムロジックも自由に書く必要があります。 – markerikson

    関連する問題