目前我在不同的项目中使用redux
进行状态管理。几天前,我听说了react-query
,它也用于状态管理,并提供缓存和异步获取。我正试图弄清楚这两个图书馆之间的主要区别。我应该在哪里使用react-query
,在哪些情况下我需要redux。
React查询就是您所说的专用库。它为您保存了一个api缓存,没有其他内容。由于它是专业化的,所以它能很好地完成这项工作,并且需要更少的代码。
另一方面,Redux为您提供了几乎可以存储任何东西的工具,但您必须编写逻辑。因此,您可以在Redux中做更多的工作,但您可能需要编写专用库不需要的代码。
您可以同时使用它们:react查询中的api缓存,Redux中的其余全局状态。
也就是说,官方的Redux Toolkit自1.6版以来还附带了一个api缓存抽象RTK Query,其功能集与React Query相似,但总体上有一些不同的概念-你可能也想看看。
react-query
设计用于处理存储在远程服务器上的数据。若要访问此数据,您的应用程序需要使用异步请求。这可能是您想要处理缓存、加载状态、网络故障等的地方。
这就是react查询的闪光点。
另一端的Redux处理客户端的数据。例如,文本输入的内容或模态的状态。您不需要处理与网络相关的问题。但你确实需要处理复杂的因果序列。
这就是redux闪耀的地方
Redux
和react-query
是两个非常不同的东西:react-query
用于数据同步,Redux
是全局状态管理器。react-query
用于将所有应用程序同步到同一数据库,Redux
用于将应用程序状态的一部分共享给需要读取该状态的所有组件。
举个例子:我有一个应用程序可以和其他用户聊天。使用react-query
,我将所有应用程序与用户收到的所有消息保持同步,然后将消息存储在Redux
中,以便在聊天页面和历史聊天页面上显示消息。
React Query管理服务器状态。它的主要功能是处理服务器和客户端之间的功能。
Redux处理客户端状态。Redux可用于异步存储数据。
因此,它们在不同的层面上都有其独特的作用,两者都可以同时使用。
- React Query=服务器状态库(保存/缓存api响应)
- Redux=客户端状态库(全局可访问的客户端状态应存储)
我们应该区分两种状态,客户端状态&服务器(或远程)状态:
- 客户端状态包含:
- 本地创建的数据尚未持久化到服务器
- 处理活动路由、选定选项卡、微调器、分页控件等的UI状态
- 服务器状态是与以下各项相关的一切:
- 远程持久化数据,需要异步API进行获取和更新
在客户端状态方面,Redux是用于管理应用程序状态的网格管理工具。
另一方面,为了管理服务器状态,我们可以使用常规的状态管理工具,但它们不太擅长处理异步或服务器状态。因此,为了解决这个问题,我们使用React Query。正如他们的文档中所描述的,React查询是一个很好的工具:
- 正在缓存。。。(可能是编程中最难做的事情)
- 将对同一数据的多个请求消除为一个请求
- 更新";"过时";后台数据
- 知道何时数据是";"过时">
- 尽快反映数据更新
- 性能优化,如分页和延迟加载数据
- 管理内存和服务器状态的垃圾收集
- 使用结构共享记忆查询结果
您可以简单地思考:
- React Query=axios+缓存逻辑
- Redux可以存储同步数据和异步数据
顺便说一句,我现在使用context
管理同步状态,React Query
管理异步状态。
Redux是一个不错的选择。
另一方面
React Query可以用于需要大量数据提取的应用程序。它提供了从API获取、缓存和更新数据的功能。
简而言之,我们可以说,如果我们有很多API可供使用,并且我们的主要功能是显示来自API的数据,那么RQ是更好的选择。另一方面,如果您需要对应用程序的状态进行更多的控制和数据处理,Redux是更好的选择。
反应查询:
- 主要专注于数据获取/更新/缓存/同步
- 在应用程序频繁调用api时发挥重要作用
- 缓存时间可以更改
冗余:
- 主要专注于客户端的状态管理
- 需要实现像store/action/reducer这样的主要代码
- 全局状态管理不依赖于时间