ステートシェイプの設計に関する章のドキュメントでは、IDでキー設定されたオブジェクトに状態を保持することを推奨しています。
IDをキーとして格納されたオブジェクト内のすべてのエンティティを保持し、IDを使用して他のエンティティまたはリストからそれを参照します。
彼らは州に行く
アプリの状態をデータベースと考えてください。
フィルターのリストの状態図形を処理しています。フィルターの一部は開かれる(ポップアップに表示される)か、オプションが選択されます。「アプリの状態をデータベースと考える」を読んだとき、APIから返される(データベースによってサポートされている)JSON応答として考えることを考えました。
だから私はそれを次のように考えていました
[{
id: '1',
name: 'View',
open: false,
options: ['10', '11', '12', '13'],
selectedOption: ['10'],
parent: null,
},
{
id: '10',
name: 'Time & Fees',
open: false,
options: ['20', '21', '22', '23', '24'],
selectedOption: null,
parent: '1',
}]
ただし、ドキュメントはより多くのような形式を提案しています
{
1: {
name: 'View',
open: false,
options: ['10', '11', '12', '13'],
selectedOption: ['10'],
parent: null,
},
10: {
name: 'Time & Fees',
open: false,
options: ['20', '21', '22', '23', '24'],
selectedOption: null,
parent: '1',
}
}
理論的には、データがシリアル化可能である限り( "State"という見出しの下)は問題になりません。
そのため、レデューサーを作成するまで、オブジェクトの配列のアプローチを楽しく使用しました。
object-keyed-by-idアプローチ(および、spread構文の自由な使用)ではOPEN_FILTER
、レデューサーの部分は次のようになります。
switch (action.type) {
case OPEN_FILTER: {
return { ...state, { ...state[action.id], open: true } }
}
オブジェクトの配列アプローチでは、より冗長になります(ヘルパー関数に依存します)。
switch (action.type) {
case OPEN_FILTER: {
// relies on getFilterById helper function
const filter = getFilterById(state, action.id);
const index = state.indexOf(filter);
return state
.slice(0, index)
.concat([{ ...filter, open: true }])
.concat(state.slice(index + 1));
}
...
だから私の質問は3つあります:
1)レデューサーのシンプルさが、object-keyed-by-idアプローチを採用する動機ですか?その状態の形に他の利点はありますか?
そして
2)id-object-keyed-by-idアプローチでは、APIの標準のJSONイン/アウトの処理が難しくなるようです。(それが、私が最初にオブジェクトの配列を使用した理由です。)したがって、そのアプローチを使用する場合は、関数を使用して、JSON形式と状態形状形式の間で相互に変換しますか?それは不格好のようです。(もしあなたがそのアプローチを支持しているなら、それはあなたの推論の一部であり、それは上記のオブジェクトの配列のレデューサーよりも不格好ではないですか?)
そして
3)Dan Abramovが理論的に状態データ構造にとらわれないようにreduxを設計したことを知っています(「慣例により、トップレベルの状態はオブジェクトまたはマップのような他のキー値コレクションですが、技術的にはタイプ、 "私の強調)。しかし、上記を考えると、IDでキー設定されたオブジェクトを保持することは単に「推奨」されますか、それとも、それを中止するようにするオブジェクトの配列を使用して実行する他の予期しない問題点がありますか? IDでキー設定されたオブジェクトを計画し、それを使い続けることを試みますか?