迁移到 RTK Query
- 如何将使用 Redux Toolkit +
createAsyncThunk
实现的传统数据获取逻辑转换为使用 Redux Toolkit Query
概述
在 Redux 应用中,最常见的副作用用例是获取数据。Redux 应用通常使用像 thunks、sagas 或 observables 这样的工具来发出 AJAX 请求,并根据请求的结果派发动作。然后,reducers 会监听这些动作来管理加载状态并缓存获取的数据。
RTK Query 是专门为解决数据获取用例而构建的。虽然它不能替代所有你会使用 thunks 或其他副作用方法的 情况,但使用 RTK Query 应该能消除大部分手写副作用逻辑的需要。
RTK Query 预计将覆盖用户以前可能已经使用 createAsyncThunk
的很多重叠行为,包括缓存目的,和请求生命周期管理(例如 isUninitialized
、isLoading
、isError
状态)。
为了将数据获取特性从现有的 Redux 工具迁移到 RTK Query,应该将适当的端点添加到 RTK Query API 切片中,并删除之前的特性代码。这通常不会包括两者之间保留的大量公共代码,因为这些工具的工作方式不同,一个将替代另一个。
如果你想从头开始使用 RTK Query,你可能也希望查看 RTK Query 快速入门
。
示例 - 从 Redux Toolkit 迁移到 RTK Query 的数据获取逻辑
一个常用的方法是使用 createSlice
设置一个切片,状态包含查询的相关 data
和 status
,使用 createAsyncThunk
来处理异步请求生命周期。下面我们将探讨这样一个实现的例子,以及我们如何可以后来将该代码迁移到 RTK Query。
RTK Query 还提供了比下面显示的 thunk 示例创建的更多功能。这个例子只是为了演示如何用 RTK Query 替换特定的实现。
设计规格
对于我们的例子,工具所需的设计规格如下:
- 提供一个钩子来使用 api 获取
pokemon
的数据:https://pokeapi.co/api/v2/pokemon/bulbasaur,其中 bulbasaur 可以是任何 pokemon 名称 - 对任何给定的名称的请求只应在尚未为该会话发送过的情况下发送
- 钩子应为我们提供供应的 pokemon 名称的当前请求状态;无论它是处于 'uninitialized'、'pending'、'fulfilled' 还是 'rejected' 状态
- 钩子应为我们提供供应的 pokemon 名称的当前数据
考虑到以上规格,让我们首先看一下如何使用 createAsyncThunk
和 createSlice
传统地实现这个。