在 React Apollo 中处理 success/error 响应消息

Handling success/error response messages in React Apollo

我想在发生突变后显示一条 success/error 消息,以通知用户他们的突变 was/wasn 没有成功。

我来自 Redux 背景,这很容易 - 我会制作一个 <Response /> 组件,该组件将位于应用程序的全局某个位置(例如,靠近应用程序的根目录,因此它将在所有屏幕上),并且该组件将连接到 Redux 存储,因此分派的任何消息都会导致响应组件出现。

对于 Apollo,我不确定执行此操作的最佳方法。假设我有一个具有以下组件结构的待办事项应用程序:

我正在接近它,因此添加待办事项的变更将放在 AddTodoComponent 组件中,查询待办事项的查询将放在 ViewTodos 组件中。由于突变中的 update() 调用,该列表会自动更新,但是我将如何发送响应消息以显示在应用程序的其他地方?

我探索了如何制作一个 HoC,它可以很好地显示从中执行突变的直接组件的响应消息,但如果调用突变的组件是多个组件级别深,这将不起作用。我也考虑过使用标准的 React 方式并通过组件树向上传递函数回调,但这对我来说似乎是一种代码味道。

谢谢

react-apollo 的全局错误处理非常简单。显示成功消息没有那么多。

错误:

Apollo 允许您在初始化客户端时提供 onError 回调。如果您使用 apollo-boost,那么只需提供 onError 选项即可。回调接收一些参数,包括 graphQLErrors,其中包含 graphQL 响应中包含的错误。您可以检查它是否存在,然后适当地显示错误。

import ApolloClient from 'apollo-boost';

const client = new ApolloClient({
  uri: `${process.env.REACT_APP_API_URI}/api/v0`,
  credentials: 'include',
  clientState: {
    resolvers,
    defaults
  },
  onError: ({ graphQLErrors, networkError, response }) => {
    if (graphQLErrors) {
      // Do something with the errors
    } else if (networkError && networkError.statusCode === 401) {
      // This also causes a browser refresh, which clears the cache.
      window.location = '/login';
    }
  },
});

如果您不使用 apollo-boost,那么您将需要使用 apollo-link-error

成功:

我还没有找到在全球范围内处理此问题的方法。同时,Mutation 组件在请求成功完成时接受 onCompleted 属性。回调将 graphQL 响应作为其参数传递,因此如果您在响应中包含成功消息,则可以像这样使用它:

class MyComponent extends Component {
  onCompleted(resp) {
    // Display using resp.message
  }

  render() {
    return (
      <Mutation mutation={ MUTATION } onCompleted={ this.onCompleted }>
        {(doMutation) => (
          doMutation({ variables: { a: b } })
        )}
      </Mutation>
    );
  }
}

如果有人有更好的方法来处理全局成功消息,我很想听听。