2016-08-22 41 views

回答

5

這是可以接受的,因爲(至少在您的示例代碼中),突變位於淺對象上,所以您不會修改任何其他代碼當前引用的對象。

它會而不是是可以接受的做一個淺拷貝,然後修改一個嵌套的對象!關鍵是你克隆對象樹中任何和所有對象,這些對象位於你想改變的深層屬性的路徑上。

Redux FAQ

要記住,當你更新一個嵌套的值, 你還必須在你的國家 樹返回它的高於一切新副本是很重要的。如果你有state.a.b.c.d,並且你想更新d, ,你還需要返回c,b,a和state的新副本。這 state tree mutation diagram演示如何深入樹 需要改變一直。

+0

作爲終極版FAQ的作者,看到它得到引用,並引述讓我快樂_very_ :) – markerikson

+1

@markerikson這個特別的FAQ條目和相應的突變圖是非常有用的 - 所有的時間我的手出來給我的同事。 – Brandon

+0

很高興聽到它!在這種情況下,您可能還會對我正在爲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

2

Redux中的減速器應該是純粹的,這意味着它必須保證它不會改變或影響它自身功能以外的任何東西(即不會產生副作用)。如果直接改變傳遞的狀態對象,就違反了這個規則。

通過創建新副本,您肯定知道應用程序中沒有其他部分使用它(它剛剛創建,所以它們怎麼樣?)。這反過來意味着可以安全地進行變異而不用擔心奇怪的副作用。

相關問題