2016-10-17 12 views
0

私はカレンダーアプリを作っています。Redux、還元店の外にデータを保存する

ユーザーが来月に移動するときに、 データをフェッチするアクションを開始したいと考えています。

発動するアクションのリストは、本質的に動的です。これは、現在マウントされているコンポーネントによって異なります。

私は現在、私はReduxの店の外にデータを格納することにより、従来ではない何かをやっている感じ

(モジュールに)リストに発射するアクションのリストを格納しています。
しかし、私はreduxストアはシリアル化可能なものを保持するはずだとどこかで読んでいます。そして、私の行動(実際にはredux-thunkで使われるアクションクリエイター)は直列化できません。

なぜならばそこで問題は、

  1. Reduxの店の外にデータを格納するための悪い考えですか?
  2. なぜ非正規化可能なデータをreduxストアに格納するのが悪い考えですか?

(私はリストに保存する)アクションの作成者は、それがコードだ、データではありません、以下

function foo(params) { 
    var url = "some-url" 
    return (dispatch, getState) => { 
    fetch(url, params).then(..).then(dispatch(someAction)) 
    } 
} 

答えて

0

あなたのリストのように見えます。それはすべてのコードが実際にあるコマンドのリストです。これを状態の外に保存することができます。

あなたのリストはJavaScriptである必要があります。 ifで分岐し、複雑なチューリング完全なダイナミズムにはswitchを使用できます。おそらく、ちょうどthunkedアクション作成者でなければなりません。

なぜあなたの状態をシリアライザブルにする必要があるのか​​については、シリアライズできるようになっています。状態をシリアライズ可能にするツールとモジュールがありますが、オプションです。しかし、それはあなたの状態をデータに強制します。

つまり、Immutable.jsを使用すると、stateは複雑なオブジェクトになりました。まだシリアル化することはできますが、JSON.stringifyではできません。したがって、関数を書くことができれば、状態をシリアライズできる任意の関数が、状態がシリアライズ可能であると主張することができます。

0

あなたが現在取り組んでいるアプローチで技術的に「間違っている」ことはありませんが、それはちょっとしたアンチパターンです。通常、特定の条件に基づいていくつかのロジックを実行する場合は、配列内で呼び出す関数を格納することで実行しません。上記の回答が指摘しているように、もちろんifswitchを使用するので、ここでは実行しないでください。

非同期アクション用のミドルウェアを追加し、ユーザーが次の月に移動したときにアクションをディスパッチするのはなぜでしょうか。このミドルウェアはこのアクションのハンドラを呼び出します。その中で、他のアクションをディスパッチできます。これはとにかく私にとってはきれいだよ。