2016-11-10 56 views
2

我在我的Redux應用程序中有一種情況,我現在有3個單獨的reducers來處理從api獲取數據。我減速的一個的一個例子是:Redux可以在單獨的減速器中使用一種動作類型嗎?

const INITIAL_STATE = { 
    data: [], 
    loading: false, 
    error: '' 
}; 

export default (state = INITIAL_STATE, action) => { 
    switch (action.type) { 
    case GET_ALL_ORDERS_START: 
     return { 
     ...state, 
     loading: true 
     }; 
    case GET_ALL_ORDERS_SUCCESS: 
     return { 
     ...state, 
     allOrders: action.payload, 
     loading: false 
     }; 
    case GET_ALL_ORDERS_FAIL: 
     return { 
     ...state, 
     loading: false, 
     error: action.payload 
     }; 
    default: 
     return state; 
    } 
}; 

注意加載和錯誤狀態,這些都是在每個電流降低相同的,將是任何後續減速器我寫的,涉及從API取數據。

我想添加一個僅用於加載和錯誤狀態的進一步減速器。其他3個將存儲數據。

這會給我:

數據減速器×3

const INITIAL_STATE = { 
    data: [] 
    // any other state in the future 
}; 

export default (state = INITIAL_STATE, action) => { 
    switch (action.type) { 
    case GET_ALL_ORDERS_SUCCESS: 
     return { 
     ...state, 
     allOrders: action.payload 
     }; 
    default: 
     return state; 
    } 
}; 

加載/錯誤減速器(負責處理整個應用程序加載/錯誤)

const INITIAL_STATE = { 
    loading: false, 
    error: '' 
}; 

export default (state = INITIAL_STATE, action) => { 
    switch (action.type) { 
    case GET_ALL_ORDERS_START: 
     return { 
     ...state, 
     loading: true 
     }; 
    case GET_ALL_ORDERS_SUCCESS: 
     return { 
     ...state, 
     loading: false 
     }; 
    case GET_ALL_ORDERS_FAIL: 
     return { 
     ...state, 
     loading: false, 
     error: action.payload 
     }; 
    default: 
     return state; 
    } 
}; 

正如你可以看到這個手段GET_ALL_ORDER_SUCCESS動作類型將在2個單獨的縮減器中使用。我的問題是,這可以嗎?還是違背慣例?

非常感謝提前。

回答

6

我認爲這很好。沒有地方說動作和減速器有1:1的映射。實際上,Redux的創建者明確表示他們之間沒有關係,許多reducer可以對單個操作做出反應,單個reducer可以對多個操作做出反應。

我認爲他最好說的:https://github.com/reduxible/reduxible/issues/8

鳴叫:https://twitter.com/dan_abramov/status/691608868628119552

相關SO:Redux: Why not put actions and reducer in same file?

+1

感謝@julianljk我已經實現瞭解決方案,它似乎運作得很好,但我只是想澄清在稍後的階段,它不會在@英鎊的價位上咬我。 – mtwallet

+1

有一個折衷的方法,一個單一的操作,不會顯式調試,如果你關心日誌記錄,就更難調試。多個行動更明確。我認爲它關於找到一個餘額 – julianljk

+0

絕對。有關該主題的更多詳細信息,另請參閱http://redux.js.org/docs/faq/Actions.html#actions-reducer-mappings和http://redux.js.org/docs/recipes/StructuringReducers.html。 – markerikson

相關問題