我一直在努力學習如何更好地構建我的Redux商店,並偶然發現了Dan的這一課。Redux - 爲什麼正常化?
https://egghead.io/lessons/javascript-redux-normalizing-the-state-shape#/guidelinesModal
雖然我知道如何去用這種方式正常化我的數據,我不明白它背後的動機。特別是,我有兩個問題。
爲什麼不簡單的數組就足夠了? Dan提到 - 「在複雜的應用程序中,我們可能不止一個數組,而且在不同陣列中具有相同ID的待辦事項可能會不同步」。我不明白這一點,我可以舉個例子嗎?我從使用對象看到的唯一好處是提高了效率,因爲我們不需要映射整個數組,以防我想將某個待辦事項委託給另一個還原器。
爲什麼我們需要維護一個allIds列表?爲什麼要保持這個額外的狀態,當我們可以很容易地映射所有待辦事項清單並獲得它?
我知道normalizr爲我們做了這個,但爲什麼我們應該正常化呢?即使響應沒有深度嵌套,規範化是否有意義?
編輯1:
謝謝您的回答,克里斯托弗。
讓我們假設你的狀態樹是這個樣子
{
user: {
byId: {
1: {
id: 1,
name: 'Buy stuff'
},
2: {
id: 2,
name: 'Yeah'
}
}
},
allIds: [1, 2],
subscribedIds: [5],
}
department: {
byId: {
5: {
id: 5,
name: 'Sell Stuff'
}
},
allIds: [5],
subscribedIds: []
}
}
我沒有看到發生在這裏的數組具有對象的利益。我也可以有一些選擇器,即使它是一個數組,也可以通過ID從部門獲取訂閱的待辦事項。看來我對這個概念的理解有點不足。你能否詳細說明一下?
是的。關於你最後的問題,如果你理解你,只需要一個淺層對象而不是對象層次結構的數組就可以工作。 但是,如果您最終在數組中有* lots *項,並且您經常執行「find this id」操作,則每個數組查找都是O(N)。將您的對象放入哈希結構中,而不是使查找O(1)...顯着更快。 –
完美!謝謝。 –
對於任何想要了解更多關於該主題的文獻,您可以參考http://redux.js.org/docs/FAQ.html#organizing-state-nested-data和鏈接的文章。 –