Redux我可以在单独的减速器中使用一种动作类型吗?

Redux我可以在单独的减速器中使用一种动作类型吗?,redux,react-redux,Redux,React Redux,在我的Redux应用程序中,我目前有3个单独的还原器,用于处理从api获取数据。我的一个减速机示例如下: const INITIAL_STATE = { data: [], loading: false, error: '' }; export default (state = INITIAL_STATE, action) => { switch (action.type) { case GET_ALL_ORDERS_START: return {

在我的Redux应用程序中,我目前有3个单独的还原器,用于处理从api获取数据。我的一个减速机示例如下:

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;
  }
};
请注意加载和错误状态,它们在每个当前的reducer中都是相同的,并且对于我编写的涉及从api获取数据的任何后续reducer都是相同的

我想再添加一个减速机,它只用于状态的加载和错误部分。另外3个将存储数据

这将给我:

数据缩减器x3

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;
  }
};
加载/错误缩减器(处理整个应用程序的加载/错误)

如您所见,这意味着GET_ALL_ORDER_SUCCESS动作类型将在两个单独的减速器中使用。我的问题是,这样可以吗?还是违反了惯例


非常感谢。

我想那很好。没有地方可以说明动作和减缩器具有1:1映射。事实上,Redux的创建者明确地说,它们之间没有关系,许多简化程序可以对单个操作作出反应,单个简化程序可以对多个操作作出反应

我认为他说得最好:

推特:


因此相关:

我有一个类似的问题,我是否可以在两个或多个单独的还原器中使用相同的动作类型名称,如果没有非常特殊的情况,答案肯定是否定的

为什么不呢

即使我们在通过combineReducers函数组合它们之后单独编写减缩器,当我们分派操作时,所有减缩器都称为它们的switch case语句

减速器一:

export const postReducer = (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case "SET_DATA":
      const { posts } = action.payload;
      return {
        ...state,
        posts: posts,
      };
  }
};
减速器二:

export const commentReducer = (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case "SET_DATA":
      const { comments } = action.payload;
      return {
        ...state,
        comments: comments,
      };
  }
};
因此,当我们调度一个类型为SET_DATA的操作时,两个reducer都将被调用 如果有效载荷值为

{
  comments: ['comment one', 'comment two'] 
}
立柱减速器将其立柱设置为未定义

更好的解决方案是这样命名类型:

case "SET_POST_DATA":

case "SET_COMMENT_DATA": 
避免两个减速器动作之间发生碰撞


按照惯例,当调用action时,只有一个reducer负责回答该操作,否则会导致其他开发人员产生误解

谢谢@julianjk我已经实现了解决方案,它似乎工作得很好,但我只是想澄清一下,它不会在以后咬我的钱有一个折衷的方法,一个单一的动作做所有的事情都不那么明确,更难调试(如果你关心日志记录的话)。其中,多个操作更为明确。我认为这绝对是为了找到平衡。有关此主题的更多详细信息,请参见和。但是如何使用redux'x
bindActionCreators
来调度两个减速机函数以响应单个操作?在redux样式指南中,强烈建议这样做。这里是链接
case "SET_POST_DATA":

case "SET_COMMENT_DATA":