RTK Query 是一个强大的数据获取和缓存解决方案,内置于 Redux Toolkit。它提供了一种简化的方法来处理 Redux 应用程序中的 API 请求,无需手动编写 reducer、action creator 和 thunk 来执行数据获取操作。本页介绍了 RTK Query 的核心概念、架构和使用模式。
有关使用 thunk 进行基本 Redux 数据获取的信息,请参阅 基本 Redux 数据流。有关使用 Redux Toolkit 的 createSlice 的信息,请参阅 createSlice 和 Reducers。
RTK Query 围绕几个关键概念设计,这些概念协同工作以提供完整的数据获取解决方案
Sources: docs/tutorials/essentials/part-7-rtk-query-basics.md165-184 docs/tutorials/essentials/part-7-rtk-query-basics.md118-140
| 功能 | 描述 |
|---|---|
| 自动 Hook 生成 | 为每个端点创建自定义的 React hook |
| 缓存管理 | 处理响应数据的缓存并自动重新获取 |
| 请求生命周期管理 | 跟踪加载中、成功和错误状态 |
| 请求去重 | 自动避免对相同数据发出重复请求 |
| 基于标签的缓存失效 | 允许在数据更改时进行有针对性的缓存更新 |
| 轮询和重新获取 | 支持按设定间隔自动刷新数据 |
| TypeScript 支持 | 内置类型定义,实现卓越的 TypeScript 集成 |
| 分页/无限滚动 | 处理分页数据的实用工具 |
Sources: docs/tutorials/essentials/part-7-rtk-query-basics.md89-99 docs/tutorials/essentials/part-7-rtk-query-basics.md124-136
RTK Query 的核心是 createApi 函数,它定义了一组用于与服务器 API 交互的端点
Sources: docs/tutorials/essentials/part-7-rtk-query-basics.md156-184 docs/tutorials/essentials/part-7-rtk-query-basics.md235-273
基本设置示例
Sources: docs/tutorials/essentials/part-7-rtk-query-basics.md156-184 docs/tutorials/essentials/part-7-rtk-query-basics.md275-325
RTK Query 会自动为每个端点生成 React hook。这些 hook 处理数据获取、缓存和订阅管理
对于查询端点,RTK Query 会生成一个 hook,返回当前的请求状态
Sources: docs/tutorials/essentials/part-7-rtk-query-basics.md327-385 docs/tutorials/essentials/part-7-rtk-query-basics.md449-491
对于 mutation 端点,RTK Query 会生成一个 hook,返回一个触发函数和请求状态
Sources: docs/tutorials/essentials/part-7-rtk-query-basics.md731-775 docs/tutorials/essentials/part-7-rtk-query-basics.md812-844
下图说明了数据如何通过使用 RTK Query 的 Redux 应用程序流动
Sources: docs/tutorials/essentials/part-7-rtk-query-basics.md118-152 docs/tutorials/essentials/part-7-rtk-query-basics.md449-491
RTK Query 的缓存系统负责存储响应数据并跟踪 API 请求的生命周期。
Sources: docs/tutorials/essentials/part-8-rtk-query-advanced.md144-156 docs/tutorials/essentials/part-8-rtk-query-advanced.md77-82
RTK Query 使用基于标签的系统进行缓存失效,允许对何时需要重新获取数据进行细粒度控制
Sources: docs/tutorials/essentials/part-8-rtk-query-advanced.md158-222 docs/tutorials/essentials/part-8-rtk-query-advanced.md235-238
基于标签的失效示例
Sources: docs/tutorials/essentials/part-8-rtk-query-advanced.md177-215
您可以使用 transformResponse 在 API 响应数据存储到缓存之前对其进行转换
Sources: docs/tutorials/essentials/part-8-rtk-query-advanced.md387-390
RTK Query 基于 TypeScript 构建,提供出色的类型安全
Sources: docs/tutorials/essentials/part-7-rtk-query-basics.md255-273
您可以实现乐观更新以提供更好的用户体验
Sources: docs/tutorials/essentials/part-8-rtk-query-advanced.md505-525
虽然 RTK Query 通常通过其生成的 hook 与 React 一起使用,但您可以将其与任何 UI 框架或不使用 UI 框架一起使用
Sources: docs/tutorials/essentials/part-8-rtk-query-advanced.md286-298 docs/tutorials/essentials/part-8-rtk-query-advanced.md371-375
以下是 RTK Query 与传统 Redux 数据获取方法的比较
| 功能 | 传统 Redux 方法 | RTK Query |
|---|---|---|
| 设置 | 需要手动设置 store、action creator、reducer 和 selector | 通过 createApi 和自动生成的 hook 进行简化 |
| 加载状态 | 需要手动管理 loading、error 等 | 通过 hook 自动跟踪和提供 |
| 缓存 | 需要手动实现 | 内置智能默认值 |
| 去重 | 需要自定义逻辑 | 自动请求去重 |
| 重新获取 | 需要手动实现 | 内置基于标签的失效 |
| 类型定义 | 额外的工作以正确进行类型定义 | 一流的 TypeScript 集成 |
| 代码大小 | 更多样板代码 | 代码显著减少 |
Sources: docs/tutorials/essentials/part-7-rtk-query-basics.md32-40 docs/tutorials/essentials/part-5-async-logic.md32-39
keepUnusedDataFor 设置selectFromResult 仅提取您需要的数据Sources: docs/tutorials/essentials/part-8-rtk-query-advanced.md235-242 docs/tutorials/essentials/part-7-rtk-query-basics.md634-636
Sources: docs/tutorials/essentials/part-7-rtk-query-basics.md65-99 docs/tutorials/essentials/part-7-rtk-query-basics.md118-140
RTK Query 确实会增加您的应用程序大小
添加额外的端点定义通常对包大小的影响很小。
Sources: docs/tutorials/essentials/part-7-rtk-query-basics.md122-129