为什么我们不能仅将 GraphQL 与 Redux 一起使用

Why can’t we use GraphQL just with Redux

我想知道为什么人们似乎不将 GraphQL 与 Redux 一起使用。

我以前从未使用过 GraphQL,但我想开始一个新项目,但是 Apollo 和 Relay 都不能说服我。目前,我正在创建一个使用 React 和 Redux 以及“老式”rest api 的应用程序。我喜欢 redux 的想法,它将关于我的应用程序的全部信息存储在一个地方。

现在,据我所知,Apollo 和 Relay 都做了类似的事情,但它们使用单​​独的存储,并且在两者中我们混合了逻辑和视图,甚至比仅使用 React 还要多,这两种东西(另一个存储和混合代码)似乎有点乱。优点是缓存,我说的对吗?

那么,为什么我们不能像以前那样在正常休息时发送查询 api 并将数据放入 redux 存储(也许尝试存储一些关于同步的信息以进行优化)。

抱歉,如果我遗漏了什么,我是新来的,我不是专业人士,这就是为什么我问一些可能比我更有经验的人:)

当你有很多相互依赖的实体时,

"store some kind [of] information about sync for optimisation" 成为一个非常困难的问题。

此外,构建客户端状态在大型应用程序中是一个难题。在 redux 社区中,被认为是最佳实践的经验法则是,当在组件中使用时,您需要在 redux 状态树中规范化和删除冗余,并在组件中使用它们时非规范化。

像 relay 和 apollo 这样的库希望拥有他们管理的状态,这样他们就可以消除 normalizing/denormalizing 数据的责任,并在很大程度上从末端管理缓存(尽可能多)用户,同时在他们需要时仍然为他们提供低级别的控制。

这是一个相当复杂的问题,因为不同的组件可能依赖于部分模型,例如。 NoteSummary 组件可能只需要 titletags 字段,NoteDetails 组件也需要 descriptioncomments

如果您自己管理 redux 状态,则当出现 NoteDetails 组件时,您将不得不为以下内容编写代码:

  1. 如果注释不存在于 redux 树中,请使用 graphql 查询获取所需的字段。

  2. 如果注释已经存在,但并非所有必填字段都存在,请为缺少的字段创建一个 graphql 查询,然后通过查询 graphql 服务器来获取它们。

  3. 如果注释已经存在,并且包含所有必填字段,只需使用本地版本。

当我们拥有相互依赖的实体,或者涉及实时协作或订阅时,这会变得更加复杂。

GraphQL 库试图以非常网络高效的方式解决上述所有问题。使用 react-apollo 或中继您的组件可以声明它需要的所有内容和底层库,将智能地确定要获取的内容和数量。

这在哲学上类似于您编写 React 组件的方式:在您的渲染方法中,您声明您的最终组件层次结构应该是什么样子(给定当前状态)并且库(React)找出要对其进行哪些更改DOM。

您应该评估您的用例是否受益于这种网络效率,如果是,您是否愿意投入时间来学习 GraphQL 及其周围的生态系统。

如果一个 redux store 和一些 ajax 调用足以满足您的用例,它可以是一个更简单的设置。

如果您决定完全使用 GraphQL 和 Apollo,您可能根本不想使用 redux。您可以使用 apollo-link-state 并使用 graphql 查询和突变管理所有数据(本地或远程)。那么从你的组件的角度来看,一些数据是远程的还是本地的就变得无关紧要了。


综上所述,如果你真的想 只是 使用 redux 和 graphql 而没有任何额外的库,比如 Relay 你可以使用组件中的 Apollo client directly. You can dispatch thunks,然后在你的 thunk 中,你可以直接使用 Apollo 客户端进行 graphql 查询,一旦你收到响应,你可以使用另一个动作调度将该数据放入树中的树中。

如果这听起来更复杂,那是因为它确实如此。