2016-11-10 55 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

相关问题