我有一個API響應,它有很多嵌套的實體。我使用normalizr來保持redux狀態儘可能平坦。
例如。 API響應看起來象下面這樣:
Redux + Normalizr:在Redux狀態下添加和刪除規範化的實體
{
"id": 1,
"docs": [
{
"id": 1,
"name": "IMG_0289.JPG"
},
{
"id": 2,
"name": "IMG_0223.JPG"
}
],
"tags": [
{
"id": "1",
"name": "tag1"
},
{
"id": "2",
"name": "tag2"
}
]
}
這種反應使用normalizr
使用下面給出的方案進行歸一化:
const OpeningSchema = new schema.Entity('openings', {
tags: [new schema.Entity('tags')],
docs: [new schema.Entity('docs')]
});
和下面是它的外觀則:
{
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"
}
}
}
}
現在還原狀態如下所示:
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"
}
]
}
現在,如果我派遣一個動作添加tag
,然後添加一個tag
對象state.tags
但它不會更新state.opening.tags
陣列。同樣的行爲,同時刪除標籤。
我保留opening
,tags
和docs
在三個不同的reducer。
這是一種不一致的狀態。我能想到的通過以下方式來保持狀態保持一致:
- 我派遣一個動作來更新標籤和聽它在這兩個
tags
減速機和減速opening
和更新,在這兩個地方隨後標籤。 - 使用標籤更新打開的修補程序請求會返回開放響應。我可以再次發送標準化響應和設置標籤的動作,打開等適當的一致性。
什麼是正確的方法來做到這一點。實體不應該觀察相關實體的變化並自行進行變更。或者有任何其他模式可以採取任何此類行動。