React / Redux:在哪里处理来自API响应的数据以及来自reducer的调度动作

Fra*_*ser 5 reactjs redux

我是React和Redux的新手,所以这是一个最佳实践问题。

我有一个动作创建者,它会触发API调用并将响应分发给我的reducer:

export function loadDrawSuccess(draw) {
  return { type: ActionTypes.LOAD_DRAW_SUCCESS, draw};
}

export function loadDraw() {
  return function(dispatch) {
    dispatch(beginAjaxCall());
    return drawApi.getDraw().then(draw => {
      dispatch(loadDrawSuccess(draw));
    }).catch(() => {
      dispatch(ajaxCallError());
    });
  };
}
Run Code Online (Sandbox Code Playgroud)

现在....在我的化简器中,我正在处理响应以从中提取所需的数据.....

function extractNextOpenDraw(draws) {
  if (!draws || typeof draws.content === 'undefined'){
    return {};
  }
  let openDraws = draws.content.filter(draw => {return draw.status === 'open';});
  let sortedOpenDraws = openDraws.sort((draw1, draw2) => {
    return DateHelper.getDateObjectFromUtcDateString(draw1.closeTimeUtc) - DateHelper.getDateObjectFromUtcDateString(draw2.closeTimeUtc);
  });
  return sortedOpenDraws[0];
}


export default function drawReducer(state = initialState.draw, action) {

  switch (action.type) {
    case types.LOAD_DRAW_SUCCESS: {
      return objectAssign({}, extractNextOpenDraw(action.draw), {dateModified: action.dateModified});
    }
    ........

    default:
      return state;
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是

  1. 我是否可以在化简器中处理响应,还是应该在API类或操作创建者中处理?
  2. 在API返回没有错误但响应格式不符合预期格式的情况下,我想调度ajaxCallError()操作。在减速器中执行此操作是否正确?

Kin*_*nza 5

  1. 不,减速器应该尽可能干净,并且只用提供给它的值更新存储。您应该解析操作本身的响应,或者为 api 创建一个包装器。我相信,在行动本身中这样做就足够了。
  2. 不,处理操作中的所有此类错误并将其分派到那里。减速器不能也不应该调度动作。

  • 正如@kinnza 所说,reducer 必须尽可能干净,store 不应该提出 actions。我想补充一点,如果我是你,我会分为 Actions 和 Api,而 Actions 通常有(至少)3 种可能的方式:处理、处理正常和处理错误。 (2认同)