11

在过去的几个月里,我一直在学习 React 和 Flux,我还没有处理过的一件事是向用户显示错误消息。具体来说,由于通量操作创建者方法中的 ajax http 请求而出现的错误消息。

一个简单的例子是用户登录 - 如果登录 ajax 请求由于密码错误而失败,服务器会以失败响应。在那一刻,在我的通量动作创建者方法中,我唯一的选择是调度一个包含错误信息的动作,对吗?

我可以发送错误信息并将该错误保存在商店中。不过,我不确定将某些错误与某些组件联系起来的最佳方法是什么。假设我的反应组件树正在呈现多个错误感知组件,但在服务器端用户身份验证尝试期间发生错误,需要在该登录表单上显示。

是否有良好的模式或约定来存储错误并知道它们用于哪个组件?是否有一种编程方式来确定这一点,而不是将某个标识符传递给每个动作创建者函数,以标识动作创建者被称为它的组件等?

4

2 回答 2

10

由于您使用 Redux 标签标记了问题,我假设您使用 Redux。
如果是这样,这个真实世界的例子显示了错误处理。

有一个reducer 可以对field的任何操作做出反应error

// Updates error message to notify about the failed fetches.
function errorMessage(state = null, action) {
  const { type, error } = action;

  if (type === ActionTypes.RESET_ERROR_MESSAGE) {
    return null;
  } else if (error) {
    return action.error;
  }

  return state;
}

自定义 API 中间件将任何错误消息放入error操作的字段中

  return callApi(endpoint, schema).then(
    response => next(actionWith({
      response,
      type: successType
    })),
    error => next(actionWith({
      type: failureType,
      error: error.message || 'Something bad happened'
    }))
  );

最后,组件从 Redux store 读取错误消息

function mapStateToProps(state) {
  return {
    errorMessage: state.errorMessage
  };
}

如您所见,这与您处理显示获取的数据的方式没有任何不同。

于 2015-10-03T11:58:37.437 回答
3

您将错误信息保存在商店中的想法很好(可能是ErrorStore)。但是商店不需要知道对特定错误感兴趣的组件。相反,ErrorStore需要发出一个CHANGE事件。发出该事件时,您可以添加一个附加参数,即错误类型(存储可能从动作创建者那里获得)。

现在,任何组件都可以侦听ErrorStore并检查错误类型(它将作为参数获取)。然后组件可以知道产生了什么样的错误,并决定他们是否对此感兴趣。

于 2015-08-05T19:29:25.180 回答