2017-01-28 61 views
2

在React Redux項目中:組件Item充當組件ProductCategory的遏制。 Item應始終監聽點擊事件,但根據其中包含的內容對其進行不同的處理:如果它包含Product,它應該派遣ADD_TO_CARTOPEN(如果它包含Category)。React Redux:對於何處定義窗簾動作感到困惑

我已經有產品和類別的動作創建者,它們當前使用redux-thunkaxios處理異步API請求。 OPENADD_TO_CART是否應該成爲這些動作創作者的一部分,還是這個功能屬於董事會的動作創作者?哪個還原器應該處理這些操作?

回答

1

這個問題不是你提供的,在某種意義上當前範圍,你不提你減速的架構,但在任何情況下,我們通過部分去:

必須在OPEN和ADD_TO_CART成爲這些動作創作者的一部分或者這個功能屬於董事會的動作創作者嗎?

雖然我不完全理解你所說的board's行動的創建者的意思是,我相信這是更爲簡單的推理行動,如果他們再加上一個創作者,例如:

function addToCart(item) { 
    return dispatch => dispatch({type: ADD_TO_CART, item}) 
} 

比起不同的創作者發出同樣的動作,那麼你的代碼變得更難調試,因爲你可能不完全確定哪個創建者發出了哪個動作,所以我的建議是:1創建者 - > 1動作。

,並在同一時間,連接行動的創建者與你的組件時,保持動作儘可能明確這樣你就不必在調試運行你的代碼,看看什麼是真正發生的事情,例如:

if(this.props.isItem) { 
    this.props.addToCart(this.props.item); 
} else { 
    this.props.open(this.props.category); 
} 

代碼是不言自明的,可以防止運行時的怪異行爲。

哪個減速器應該處理這些動作?

這是一個非常艱難的問題,不只是因爲我不知道你減速的現有結構,但一般選擇正確的架構是很困難的,但作爲一般準則,我會說:

Always split your reducers to sub-domains of your problem 

正如我看到你有一個叫做OPEN的行爲,這讓我認爲你實際上是在使用你的reducer作爲視圖模型,但這也取決於實現細節。

查看模型減速器在我看來非常有用,但一個應該小心,如果你有動作OPEN這意味着你不僅僅存儲物品信息,而且還存儲你的應用程序視圖在這個減速器中的狀態,我會將它重命名爲ITEM_OPEN,這樣您也可以對其他子域的OPEN操作,並且如果您要創建OPEN操作,則應該存儲哪個項目是open,並且您的Reducer實際上會在應用程序中生成新狀態。

如果你不想要這樣(將應用程序狀態存儲在減速器中作爲View Model),我將刪除OPEN動作,只需通過react-router或類似動作處理即可。

因此,從您提供的有限信息來看,我認爲您應該有2個減速器,一個用於物品,一個用於購物車,ADD_TO_CART明顯應該由購物車減速器處理,並且應該處理OPEN由物品減速器。