入れ子になっているエンティティがたくさんあるAPIレスポンスがあります。私はnormalizrを使って還元状態をできるだけ平坦に保ちます。
たとえば、以下
Redux + Normalizr:正規化されたエンティティをRedux状態に追加して削除する
const OpeningSchema = new schema.Entity('openings', {
tags: [new schema.Entity('tags')],
docs: [new schema.Entity('docs')]
});
とは、それがその後、どのように見えるかです:下記のスキーマを使用してnormalizr
を用いて正規化され
{
"id": 1,
"docs": [
{
"id": 1,
"name": "IMG_0289.JPG"
},
{
"id": 2,
"name": "IMG_0223.JPG"
}
],
"tags": [
{
"id": "1",
"name": "tag1"
},
{
"id": "2",
"name": "tag2"
}
]
}
この応答:APIレスポンスは以下のようになります
{
result: "1",
entities: {
"openings": {
"1": {
"id": 1,
"docs": [1,2],
"tags": [1,2]
}
},
"docs": {
"1": {
id: "1",
"name": "IMG_0289.JPG"
},
"2": {
id: "2",
"name": "IMG_0223.JPG"
}
},
"tags": {
"1": {
"id": 1,
"name": "tag1"
},
"2": {
"id": 2,
"name": "tag2"
}
}
}
}
還元状態は次のようになります。
私はtag
を追加するアクションをディスパッチする場合
state = {
"opening" : {
id: 1,
tags: [1,2],
docs: [1,2]
},
"tags": [
{
"id":1,
"name": "tag1"
},
{
"id":2,
"name": "tag2"
}
],
"docs": [
{
"id":1,
"name": "IMG_0289.JPG"
},
{
"id":2,
"name": "IMG_0223.JPG"
}
]
}
は今、それはstate.tags
にtag
オブジェクトが追加されますが、それはstate.opening.tags
配列を更新しません。タグを削除するときも同じ動作です。
私はopening
,tags
およびdocs
を3種類のレデューサーで保ちます。
これは状態の不一致です。私は一貫性のある状態を維持するには、次の方法を考えることができます。
- 私はタグを更新し、その後、両方の場所で
tags
減速とopening
減速や更新タグの両方でそれを聞くためにアクションを派遣します。 - タグを使用してopeningを更新するパッチ要求は、開始応答を返します。応答を正常化し、タグを設定したり、適切な一貫性を持って開くなどのアクションを再度呼び出すことができます。
これを行う正しい方法は何ですか。エンティティが関連するエンティティへの変更を監視し、変更を行うべきではありません。あるいは、そのような行動に従うことができる他のパターンがあります。