2016-03-15 80 views
5

我一直在我的React應用程序中使用Redux,並且一直在困擾着我。 Redux的文檔清楚地表明減速器應該是無狀態的。你經常看到這樣的例子:爲什麼Redux減速器必須是無副作用的?

function reducer(state = { exampleState: true }, action) { 
    switch(action.type) { 
    case "ACTION_EXAMPLE": 
    return Object.assign({}, state, { exampleState: false }); 
    default: 
    return state; 
    } 
} 

我的問題是爲什麼這是必需的? JavaScript是單線程的。減速器內部不存在競賽狀況的可能性。據我所知,一個Redux商店只能夠返回商店的當前狀態,所以看起來奇怪的是,對純功能的關注太多了。

+1

不好意思,「減速機內部沒有比賽條件的機會」是什麼意思? – FurkanO

+0

https://goshakkk.name/redux-side-effect-approaches/ – zloctb

回答

6

的情況下爲純函數在作者的documentation而成。當然,你可以寫不純功能減速,但:

發展的功能,比如時間旅行,記錄/回放,或熱重裝將打破。

如果沒有這些功能提供益處,或者是感興趣的你,然後,通過各種手段,寫不純的功能。然而,這個問題會變成什麼樣,爲什麼要使用Redux?

+0

感謝佈雷特,我不知道這些功能。 – Max

2

僅僅因爲它是單線程的,並不意味着它不是異步的,但是這真的沒有那麼重要。副作用與線程無關,一切都與確保您的對象按其API說明的方式行事有關:如果它具有狀態,則可能會有不同的行爲,具體取決於調用的次數以及數據是什麼傳遞給每個調用,而不是一個具有持續行爲的對象,無論何時調用它。

重要的部分是「對於完全相同的輸入,其行爲方式完全相同」。添加和使用狀態幾乎是字面上的承諾,情況並非如此。

+0

對不起,這不回答問題。所有這些東西都可以修改狀態目錄。考慮這樣做的reducer:'(state,action)=> {state.prop + = 1;返回狀態; }'。這不是免費的副作用,但取決於多少次呼叫,它會有不同的行爲。 – Max

+0

你只是字面上描述了一個不可預知的副作用。您剛剛更新了商店不擁有的對象:對象的所有者剛剛發生了什麼?這個「道具」的價值奇蹟般的改變了,那會有什麼後果呢?爲什麼你甚至會認爲你知道其他對象是否也可以這樣做,包括你甚至不知道任何事情的代碼(模塊等)?不要編寫帶有副作用的代碼,因爲充其量只是你,但最壞的情況是,每個人使用你的代碼,都不會理解它們的影響,並且不能依賴代碼行爲的確定性預測 –

+0

@Max「it將取決於進行多少次呼叫而具有不同的行爲「如果每次調用所做的每個調用,使用相同的輸入都會以相同的可預測和可重複的方式更改狀態,則不會產生副作用。編輯:另外,你永遠不應該對狀態對象本身進行操作。這是一個不是的 –

1

因爲 '預知'

Redux is a predictable state container for JavaScript apps.

重點。

增加副作用使得預見

+1

您可以在行爲如何變得無法預測時添加一些理由嗎? – Max

+0

好的。讓我們說,無論出於什麼原因,你在你的reducer中添加一個XHRequest,在成功的時候,對'state'進行修改。你只是讓你的減速器變得不可預知,因爲現在你不能保證每次你的減速器被執行相同的確切輸入時,它總會以相同的可預測的方式改變狀態。 (因爲如果XHRequest失敗會怎麼樣?) –

+0

當然,你不想在reducer中做一個AJAX調用。但這並不意味着減速器**必須是無副作用的。你的例子表明減速器應該是確定性的。 – Max

相關問題