データベースに多数のエントリ(ユーザーなど)があるとします。また、2つのルートがあります。1つはリスト用、もう1つは詳細用です(ここでエントリを編集できます)。現在、データ構造にアプローチする方法に苦労しています。
私は2つのアプローチと両方のちょっとした組み合わせを考えています。
/list
に移動し、すべてのユーザーがusers
の下にあるreduxストアに保存されているAPIからダウンロードされます。また、users_offset
とusers_limit
を追加しますリストの一部のみをレンダリングする/detail/<id>
に移動し、currently_selected_user
をvalとして<id>
に格納します...これは、このusers.find(res => res.id === currently_selected_user)
のようなものでユーザーのデータを取得できることを意味しますさて、このアプローチに伴う問題は、ユーザーのリストが膨大になると(数百万人など)、ダウンロードに時間がかかる可能性があることです。また、/detail/<id>
に直接移動すると、まだすべてのユーザーがダウンロードされていないため、必要なユーザーだけのデータを取得するには、まずすべてをダウンロードする必要があります。 1つを編集するだけで何百万人ものユーザー。
/list
に移動し、APIからすべてのユーザーをダウンロードする代わりに、users_per_page
およびusers_current_page
の設定に応じて、そのうちの2、3のみをダウンロードします。おそらくデータをusers_currently_visible
として保存します/detail/<id>
に移動し、currently_selected_user
をvalとして<id>
に格納し、users_currently_visible
を検索する代わりに、単にAPIからユーザーのデータをダウンロードします。users_currently_visible
を更新するつもりはありませんここで考えられる問題は、/list
にアクセスしたときに、再度APIからデータをダウンロードする必要があることです。データベース内のデータと同期していない可能性があり、不必要にユーザーをダウンロードしている可能性もありますusers_currently_visible
に偶然既に含まれている可能性があるため、データの詳細
users_currently_visible
はありますかusers_currently_visible
の間に存在するかどうかを確認します。存在する場合は、リストも更新します。これはおそらく機能しますが、実際には適切な方法であるとは感じません。また、users_currently_visible
にアクセスしたときに/list
の新しいリストをダウンロードする必要があります。新しいリストを追加した可能性があるためです。
これを行うためのファンのお気に入りの方法はありますか...
ありがとう!
Reduxリポジトリの 「実世界」の例 を参照してください。
これはまさにこの問題の解決策を示しています。
状態の形状は次のようになります。
{
entities: {
users: {
1: { id: 1, name: 'Dan' },
42: { id: 42, name: 'Mary' }
}
},
visibleUsers: {
ids: [1, 42],
isFetching: false,
offset: 0
}
}
注entities
(ID->オブジェクトマップ)とvisibleUsers
(ページネーション状態とIDを持つ現在表示されているユーザーの説明)を別々に保存しています。
これは、「共有データセット」アプローチに似ています。しかし、あなたが挙げた欠点は、このアプローチに固有の本当の問題だとは思いません。それらを見てみましょう。
このアプローチで問題になっているのは、ユーザーのリストが膨大になると(数百万など)、ダウンロードに時間がかかる可能性があることです。
すべてをダウンロードする必要はありません!ダウンロードしたすべてのエンティティをentities
にマージしても、それらすべてをクエリする必要はありません。 entities
には、これまでにダウンロードされたすべてのエンティティ /が含まれている必要があります。世界のすべてのエンティティではありません。代わりに、ページネーション情報に従って現在表示しているもののみをダウンロードします。
/ detail /に直接移動すると、まだすべてのユーザーがダウンロードされていないため、1人だけのデータを取得するには、すべてをダウンロードする必要があります。 1つを編集するだけで何百万人ものユーザー。
いいえ、そのうちの1つだけをリクエストします。応答アクションが起動し、entities
を担当するリデューサーがこの単一のエンティティを既存の状態にマージします。理由はstate.entities.users
に複数のユーザーが含まれている可能性があるため、すべてのユーザーをダウンロードする必要はありません。 entities
は、haveが満たされないキャッシュと考えてください。
最後に、Reduxリポジトリの 「実世界」の例 に再度案内します。ページネーション情報とエンティティキャッシュ用のレデューサーの正確な記述方法、および normalizr
でAPI応答のJSONを正規化する方法 により、レデューサーがサーバーアクションから情報を簡単に抽出できるようになります均一な方法で。