当前位置: 首页 > 知识库问答 >
问题:

为什么我们不能使用GraphQL只是Redux

呼延宪
2023-03-14

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

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

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

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

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

共有1个答案

郑和泰
2023-03-14

当您有许多相互依赖的实体时,“存储有关同步的某种[信息]以进行优化”成为一个非常困难的问题。

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

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

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

如果你自己管理redux状态,你将不得不为以下内容编写代码

>

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

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

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

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

这与编写react组件的原理类似:在渲染方法中,声明最终组件层次结构的外观(给定当前状态),库(react)确定要对DOM进行哪些更改。

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

如果一个redux商店和几个ajax调用足以满足您的用例,那么它可以是一个简单得多的设置。

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

综上所述,如果您真的想只使用redux和graphql,而不使用任何其他库(如Relay),那么您可以直接使用Apollo客户端。您可以从组件中分派Thunk,然后在Thunk中,您可以直接使用Apollo客户端进行graphql查询,一旦收到响应,您可以使用另一个动作分派将该数据放到树中的树中。

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

 类似资料:
  • 问题内容: 我是一个完整的初学者。 我已阅读了有关解决方案的Google文档。我在互联网上搜索了同样的内容。 但。一切似乎都是技术性的。 据我了解,.Flush有助于在功能出现时立即执行这些功能,而无需将它们捆绑在一起。 我对吗? 如果不是的话,外行人的含义是什么?并请举一个简单的例子。谢谢。 问题答案: 程序员在希望确保在继续之前将先前代码的输出和/或效果写入电子表格时会使用。如果您不这样做,则

  • 问题内容: 我正在阅读Java JDBC规范(版本4),并且遇到了以下语句: DataSource-此接口在JDBC 2.0可选软件包API中引入。它优于DriverManager,因为它允许有关基础数据源的详细信息对应用程序透明 我想了解的是a 和a 之间的区别以及它为什么存在。我的意思是,上面的代码块说关于数据源的详细信息对于应用程序是透明的,但是是否不会在属性文件中外部化数据库属性(例如用户

  • 我试图理解的是和之间的区别,以及它存在的原因。我的意思是,上面的块表明关于数据源的细节对应用程序是透明的,但是在属性文件中外部化数据库属性如用户名、密码、url等,然后使用DriverManager是否会以同样的方式工作? 创建接口是否只是为了有一种返回可以池化的连接的通用方式?在Java EE中,应用程序服务器是否实现了这个接口,并且部署的应用程序是否具有对数据源的引用而不是连接?

  • 我正在学习亚当·简斯的合唱团教程。 数据是用这个代码块加载的 而准备就绪被定义为 我把这个序列理解为 首先-创建一个名为promises的数组,其中第一项是来自此链接的已解析json,第二项是来自该文件的id/值对的映射 第二,获取promise变量中的所有promise,如果成功,则触发函数ready,如果失败,则不执行任何操作 如果这是对的,那么相对于这样的东西有什么优势呢?我用伪代码写这个因

  • 问题内容: 据我所知,以下两个代码段将达到相同的目的。为什么有块呢? 代码A: 代码B: 问题答案: 如果您未处理的异常被抛出会怎样?(我希望你不会抓到…) 如果从try块内部返回会怎样? 如果catch块引发异常会怎样? 一个代码块确保 无论 您退出该代码块(以几种方式明确地中止整个过程),该代码块都将被执行。这对于确定性清除资源很重要。

  • 如果我可以使用在一行中打印所需内容,那么我很难理解为什么我需要。