2016-03-07 86 views
4

所以,我有一個應用程序有多個減速器,並因此多個動作創建者相關聯。Redux和Reducer中訪問不同的reducer,如何?

有一次,我的一個減速器更新狀態(因爲編輯),因此,我必須確保其他減速器看到此更新並相應地調整其狀態。

認爲它就好像用戶選擇「運動鞋」,並且此狀態管理位於名爲productsReducer的reducer中。因此,當用戶移動應用程序進程時,他們會獲得與其相關聯的優惠券Redirect ...但用戶可以隨時「編輯」,因此如果他們隨後編輯「運動鞋」並說,選擇另一個製作人,我必須能夠實時更改優惠券Redecer,因爲進度模式需要反映這一點。我可以通過流向優惠券頁面來做到這一點,因爲在該頁面上,我只是調和componentWillMount上的數據...但是,我有一個進度模式,並且在進入優惠券頁面之前,用戶可以打開進度模式...並且這裏會有一個錯位...

長時間囉嗦我知道,我只是想解釋我的情況。

因此,我希望能夠從productsReducer中調用「其他減速器」或其動作創建者。

這裏的中間件是否適合我在哪裏嗅探某個「action.type」,如果我看到它,我可以派發其他action.type或者有沒有辦法從productsReducer內部調用動作創建器?

導入:import *作爲'./couponsActions'的優惠券和我需要的任何其他操作似乎不合適。

回答

11

基於應用程序狀態更新狀態是一種反模式。解決方案更簡單:

如果某個操作影響多個還原器,請在關注的還原器中訂閱該操作。

因此,當用戶選擇sneakers,觸發此動作

{ type: 'item_select', payload: 'sneakers' } 

,然後在couponsReducer,有這樣的事情:

function (state == initialState, action) { 
    if (action.type == 'item_select') { 
    return { ...state, activeProduct: action.payload);} 
    } 
    return state; 
} 

你不想級聯更新,其中狀態取決於其他狀態在改變。你想要一個簡單的調度體系結構,其中一個動作同時影響所有內容。

+1

真棒。我主要關注的是保持在適當的範式內而不是反模式。我能夠按照我的需要有效地完成我所需要的工作,就像您建議的那樣。萬分感謝。 –

+0

「基於應用程序狀態更新狀態是一種反模式」?這沒有任何意義。 Reducer功能的重點在於您根據*當前狀態*和行動來做出決定。 – markerikson

+0

@markerikson不,減壓器是爲了處理動作,而不是狀態的變化。狀態的變化應始終是行動的結果。創建操作作爲被調度操作的結果是一種反模式。 –

1

在很多情況下,處理多個reducer中的相同操作就足夠了(這是官方建議的redux操作方式)。所以總是先試試這個解決方案。

在更復雜的情況下,您可以使用一些庫。例如使用redux-saga你能處理這樣的:

function* watchItemSelect() { 
    while(true) { 
     // Wait for the action you are interested in 
     const action = yield take('ITEM_SELECT'); 
     // Send another action 
     yield put({type: 'OTHER_ACTION'}) 
     // The loop will now continue and wait until the next ITEM_SELECT action comes 
    } 
} 

也有做同樣的事情,但有點不同的其他庫。他們中的大多數靈感來自榆樹的語言:

而且這種回購提供有關在上述圖書館的思考一些信息:

redux-architecture