Apollo Client 3.0 或 Redux 用于本地状态管理?

Posted

技术标签:

【中文标题】Apollo Client 3.0 或 Redux 用于本地状态管理?【英文标题】:Apollo Client 3.0 or Redux for the local state management? 【发布时间】:2021-04-04 09:47:45 【问题描述】:

我正在使用 Apollo Client 3.0 从 graphql 服务器获取数据,但我无法决定使用什么来进行本地状态管理(Redux 或 Apollo Client 3.0)。

我认为 Redux 迫使我编写更多代码,但以一种可预测且更简洁的方式,这很好。还将 Redux 添加到应用程序意味着我将混合使用 2 个状态管理库。

Apollo Client 3.0 有反应变量,但对于大型应用程序我认为它会变得一团糟!我也可以通过@client 指令使用查询和突变,但这可能有点令人困惑。

你有什么推荐给我的? 我应该使用什么? 你能给我一些好的例子吗?

谢谢!

【问题讨论】:

【参考方案1】:

Apollo 不是一个状态管理库。它是一个很棒的 graphql 客户端和缓存,但是当你开始将它用作客户端状态管理时,你会注意到它并不是真正的意思。 您必须编写的代码量类似于 vanilla redux,因为您必须为每个本地查询和突变编写自己的解析器,但是由于中间有一个基于文本的协议,您将失去所有可能拥有的类型安全性当保持“纯 javascript”时。然后您必须手动将数据放入标准化缓存,即使您的数据未标准化,所以您将开始将您的设置放入settings/1,因为一切都需要一个 id,即使您只有一个设置实例在您的应用程序中。 根据我的经验,这一切都感觉很笨拙。

此外,现代 redux 的样板文件比您现在可能习惯的要少得多 - 如果您遵循官方建议使用 redux 工具包 (take a look at this page of the official redux docs),您可能会编写您使用的代码代码的四分之一与“香草redux”一起使用。 现代 redux 没有手写动作创建者、动作类型、switch-case reducer 或不可变逻辑。这些都是目前在后台处理的所有实现细节。

我实际上在一年半前就该主题进行了一次会议演讲,所以我有一些例子。

Here is what you write with Apollo(是的,这个例子对 Apollo 来说有点人为——但我想对所有库都使用相同的例子,而登录流程正是我所追求的)

This is what it looks like in redux

【讨论】:

感谢您的详细解答! redux 工具包确实简化了 Redux! 现在不推荐编写本地解析器:apollographql.com/docs/react/local-state/local-state-management @raarts 是的,改变了一点,但老实说,它仍然无法与真实的状态管理解决方案相比。 Apollo 非常适合作为缓存,但恕我直言,将它用于除了最简单的变量之外的任何其他状态可能不是一个好主意。

以上是关于Apollo Client 3.0 或 Redux 用于本地状态管理?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Redux Thunk 和 Apollo Graphql 做出反应 - 如何访问 client.query?

带有命名空间查询的 Apollo Client 3.0 缓存

Apollo Client 3.0 中的 WebSocketClient 如何传递认证令牌?

从为 GraphQL 分派的 redux 操作中访问 Apollo 客户端

使用 Redux 时访问应用程序范围的客户端?

如何将 Gatsby 混合站点连接到 Apollo/Graphcool(或 Redux)?