2016-06-02 2 views
1

私はreduxミドルウェアとそれがReduxストア内でどのように設定されるかを理解するのに苦労しています。例えば、私は、以下の実施例Reduxミドルウェアロジック

const store = compose(
    resetRedux('LOGOUT_USER'), 
    applyMiddleware(...middlewares), 
)(createStore)(rootReducer, initialState); 

resetReduxを有するストリングLOGOUT_USERが送出されたときに、基本的に全体Reduxのストアをリセットするミドルウェアです。しかし、これは素晴らしいですが、resetReduxミドルウェア内にconsole.logを置くと、それは一度しか呼び出されません。私はアクションを毎回チェックする必要があると考えて、奇妙です。格納。

export default function resetMiddleware(types = ['RESET']) { 
    return (next) => (reducer, initialState) => { 
    const resetTypes = Array.isArray(types) ? types : [types]; 
    console.log('THIS IS ONLY CALLED ONCE??!') 
    const enhanceReducer = (state, action) => { 
     if (~resetTypes.indexOf(action.type)) { 
     state = undefined; 
     } 
     return reducer(state, action); 
    }; 
    return next(enhanceReducer, initialState); 
    } 
}; 

だから、私はconsole.logは一度だけ呼び出されたときに、これが働いているか興味があります。

+0

質問: 'compose()'と 'createStore()'を使う構文は、どこにありますか?それは_valid_ですが、ひどいです。最近、いくつかの質問でポップアップが見られました。まだどこかのドキュメントにある場合は、ドキュメントを更新してそのドキュメントを停止する必要があります。 'createStore(reducer、preloadedState、composEnhancers)' – markerikson

+0

いくつかのスターターキットで使用しています。それが私がその論理を理解しようとしていた理由です。上記のコードを見ても、console.log文が1回だけ呼び出される理由は理解できません。私は、すべてのアクションで、reduxストアをリセットするかどうかを判断する条件付きチェックが行われていると考えています...さらに、applyMiddleware関数内にresetReduxを置くと動作しません。 – Detuned

答えて

2

「ミドルウェア」と「ストアエンハンサー」を混乱させて混乱させています。あなたが書いたresetRedux作品は、実際には「ストアエンハンサー」であり、ミドルウェアではありません。

実際のミドルウェアは、発送されるすべてのアクションに対して本体が実行されます。ストアエンハンサー自体は、ストア作成時に1回評価/実行されます。 レデューサーは、実際のレデューサーがcreateStoreに提供されているものをラップする関数を作成しているため、すべてのアクションに対して実行されます。

私のReact/ReduxリンクリストのRedux Tutorials#Implementation Walkthroughsセクションには、ミドルウェアがどのようにReduxで動作するかを説明する記事がいくつかあります。

+0

これは絶対に当てはまります!私はフィードバックに感謝し、なぜ私は混乱した。 'applyMiddleware'関数を使ってミドルウェアが一般的に適用されていることを理解しましたが、コードの' resetRedux'ビットはそこでは機能しませんでしたので、あなたが言及したように 'store enhancer 'として外側に移動しました。 リセットが実際にどのように機能するのか不思議です。一度しか呼び出されないからです。さらに、それをミドルウェアとして移動する方がよい場合は、どのように動作するように構成することができます。 – Detuned

+0

ミドルウェアとエンハンサの両方がファクトリ関数として定義されています。一番外側の関数はファクトリであり、ストアの作成時に一度しか実行されません。内部メソッドは複数回実行されます。あなたが定義した 'enhanceReducer'リデューサ関数は、ディスパッチされたアクションがストアに達するたびに実行されます。なぜなら、これは今では唯一のリデューサ関数です。ミドルウェアの内部関数は、アクションがミドルウェアパイプラインを経由するたびに実行されるため、それを処理する機会があります。それは "工場"と "工場が返すもの"の違いです。 – markerikson

+0

それは素晴らしいです!私はエンハンサーが実際に何回も呼ばれていたという事実を見落としました。 – Detuned

1

これは何ですか?composeは、渡された関数を受け取り、それらを "作成"する新しい関数を作成します。

引数

(引数):構成する機能。各機能は、 が単一のパラメータを受け入れることが期待されます。その戻り値は、左にある関数への引数として として提供されます。 例外は、 合成関数のシグネチャを提供するため、複数の パラメータを受け入れることができる最も右側の引数です。右から左に所定の 関数を合成した最終的な機能:

戻り値(関数)を返します。

あなたは、例えば、ソースコードhere

その関数型プログラミングにおける一般的な有用性を確認することができますlodash'sもprovide itunderscore as well

+0

上記のコードを見れば、 'console.log'文がなぜ一度しか呼び出されないのか理解できません。すべてのアクションで、reduxストアをリセットするかどうかを決定する条件付きチェックが行われていると思います... さらに、resetReduxを 'applyMiddleware'関数内に置くと動作しません。私はそれを外側に置き、上記のように 'compose'を使う必要があります。 – Detuned

関連する問題