代码之家  ›  专栏  ›  技术社区  ›  macieks

为什么我们不能将GraphQL仅用于Redux

  •  6
  • macieks  · 技术社区  · 7 年前

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

    我以前从未使用过GraphQL,但我想开始一个新项目,但阿波罗和中继都不能说服我。目前,我正在创建一个使用react和redux以及老式rest api的应用程序。我喜欢redux的想法,它将我的应用程序的全部信息存储在一个地方。

    现在,据我所知,Apollo和relay都做了类似的事情,但它们使用单独的存储,在这两种情况下,我们混合了逻辑和视图,而不仅仅是反应,这两种情况(另一个存储和混合代码)似乎有点混乱。优点是缓存,对吗?

    那么,为什么我们不能像使用普通rest api那样发送查询,并将数据放入redux存储区(可能尝试存储一些关于同步的信息以进行优化)。

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

    1 回复  |  直到 7 年前
        1
  •  18
  •   lorefnon    7 年前

    “存储有关同步的某种信息以进行优化” 当你有很多相互依存的实体时,这就成了一个非常困难的问题。

    此外,构造客户端状态在大型应用程序中也是一个难题。redux社区中被视为最佳实践的经验法则是,在组件中使用redux状态树时,需要在redux状态树中规范化和移除冗余,并对其进行反规范化。

    像relay和apollo这样的库希望拥有它们所管理的状态,以便它们可以从最终用户那里卸下规范化/非规范化数据的责任,并在很大程度上管理缓存(尽可能多),同时在需要时仍然为他们提供低级别的控制。

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

    如果您自己管理redux状态,则必须为以下内容编写代码: 备注详细信息 组件如下所示:

    1. 如果redux树中还没有注释,请使用graphql查询获取所需字段。

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

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

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

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

    这与编写react组件的原理相似:在渲染方法中,您声明最终组件层次结构应该是什么样子(给定当前状态),库(react)确定要对DOM进行哪些更改。

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

    如果一个redux存储和几个ajax调用足以满足您的用例,那么它可以是一个更简单的设置。

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


    说到这里,如果你真的想 只是 将redux与graphql一起使用,而不需要任何其他库,如可以使用的Relay Apollo client 直接地您可以调度 thunks 从组件,然后在thunks中,可以直接使用Apollo客户端进行graphql查询,一旦收到响应,就可以使用另一个动作调度将数据放在树中的树中。

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