考慮以下幾點:爲什麼認爲可以改變我的狀態的淺表副本?
[SELECT]: (state, action) => {
let newState = {...state, newState}
delete newState[action.payload.key]
return(newState)
}
爲什麼是可以接受的我的突變淺拷貝,返回它仍然滿足約不變異我州的規則?
考慮以下幾點:爲什麼認爲可以改變我的狀態的淺表副本?
[SELECT]: (state, action) => {
let newState = {...state, newState}
delete newState[action.payload.key]
return(newState)
}
爲什麼是可以接受的我的突變淺拷貝,返回它仍然滿足約不變異我州的規則?
這是可以接受的,因爲(至少在您的示例代碼中),突變位於淺對象上,所以您不會修改任何其他代碼當前引用的對象。
它會而不是是可以接受的做一個淺拷貝,然後修改一個嵌套的對象!關鍵是你克隆對象樹中任何和所有對象,這些對象位於你想改變的深層屬性的路徑上。
要記住,當你更新一個嵌套的值, 你還必須在你的國家 樹返回它的高於一切新副本是很重要的。如果你有state.a.b.c.d,並且你想更新d, ,你還需要返回c,b,a和state的新副本。這 state tree mutation diagram演示如何深入樹 需要改變一直。
Redux中的減速器應該是純粹的,這意味着它必須保證它不會改變或影響它自身功能以外的任何東西(即不會產生副作用)。如果直接改變傳遞的狀態對象,就違反了這個規則。
通過創建新副本,您肯定知道應用程序中沒有其他部分使用它(它剛剛創建,所以它們怎麼樣?)。這反過來意味着可以安全地進行變異而不用擔心奇怪的副作用。
作爲終極版FAQ的作者,看到它得到引用,並引述讓我快樂_very_ :) – markerikson
@markerikson這個特別的FAQ條目和相應的突變圖是非常有用的 - 所有的時間我的手出來給我的同事。 – Brandon
很高興聽到它!在這種情況下,您可能還會對我正在爲Redux文檔創建的一組新頁面感興趣,即「構建Reducers」。問題在https://github.com/reactjs/redux/issues/1784,WIP在https://github.com/markerikson/redux/blob/structuring-reducers-page/docs/recipes/StructuringReducers.md。一頁講述「不可變的更新模式」:https://github.com/markerikson/redux/blob/structuring-reducers-page/docs/recipes/reducers/09-ImmutableUpdatePatterns.md。希望對問題頁面有任何反饋意見。 – markerikson