Redux Toolkit 中的 RTK Query 快速入门指南
什么是 RTK Query
RTK Query 是 Redux Toolkit 提供的一个强大的数据获取和缓存工具,专门用于简化 Web 应用程序中常见的数据加载场景。作为 Redux Toolkit 的附加功能,它基于 Redux Toolkit 的核心 API(如 createSlice
和 createAsyncThunk
)构建,为开发者提供了一套完整的解决方案。
核心优势
- 自动缓存管理:自动处理数据缓存,避免重复请求
- 请求状态跟踪:提供完整的加载、错误和成功状态
- 请求去重:相同请求只会发送一次
- 自动重新获取:支持缓存失效和自动刷新机制
- React 钩子集成:自动生成 React 钩子,简化组件集成
快速开始
1. 创建 API 服务
首先我们需要定义一个 API 服务。这里以 PokeAPI 为例:
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'
export const pokemonApi = createApi({
reducerPath: 'pokemonApi',
baseQuery: fetchBaseQuery({ baseUrl: 'https://pokeapi.co/api/v2/' }),
endpoints: (builder) => ({
getPokemonByName: builder.query<Pokemon, string>({
query: (name) => `pokemon/${name}`,
}),
}),
})
export const { useGetPokemonByNameQuery } = pokemonApi
关键点说明:
createApi
是创建 API 服务的核心函数reducerPath
指定了在 Redux store 中的存储位置baseQuery
配置了基础请求设置endpoints
定义了具体的 API 端点
2. 配置 Redux Store
接下来需要将 API 服务集成到 Redux store 中:
import { configureStore } from '@reduxjs/toolkit'
import { setupListeners } from '@reduxjs/toolkit/query'
import { pokemonApi } from './services/pokemon'
export const store = configureStore({
reducer: {
[pokemonApi.reducerPath]: pokemonApi.reducer,
},
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware().concat(pokemonApi.middleware),
})
setupListeners(store.dispatch)
注意事项:
- 必须添加 API 中间件以启用缓存等功能
setupListeners
用于实现自动重连等高级功能
3. 在组件中使用
定义好服务后,可以在组件中使用自动生成的钩子:
import { useGetPokemonByNameQuery } from './services/pokemon'
function App() {
const { data, error, isLoading } = useGetPokemonByNameQuery('bulbasaur')
if (isLoading) return <div>Loading...</div>
if (error) return <div>Error occurred!</div>
return (
<div>
<h3>{data.species.name}</h3>
<img src={data.sprites.front_shiny} alt={data.species.name} />
</div>
)
}
钩子返回的对象包含:
data
: 响应数据error
: 错误信息isLoading
: 首次加载状态isFetching
: 任何请求状态refetch
: 手动重新获取函数
高级特性
请求去重与共享
RTK Query 会自动处理相同请求的去重。多个组件请求相同数据时,只会发送一个实际请求,所有组件共享同一份数据。
缓存生命周期管理
数据默认会在组件卸载后保留一段时间(默认60秒),之后如果没有组件订阅该数据,则会从缓存中清除。
标签失效机制
可以通过定义标签关系实现跨端点的缓存失效和自动重新获取:
endpoints: (builder) => ({
getPosts: builder.query({
query: () => 'posts',
providesTags: ['Posts']
}),
addPost: builder.mutation({
query: (body) => ({
url: 'posts',
method: 'POST',
body
}),
invalidatesTags: ['Posts']
})
})
最佳实践
- 单一API切片原则:每个基础URL对应一个API切片
- 端点拆分:大型项目可以将端点拆分到不同文件
- 类型安全:充分利用TypeScript提供类型支持
- 错误处理:统一处理API错误响应
总结
RTK Query 为 Redux 应用提供了一套完整的数据获取解决方案,显著减少了样板代码,简化了数据管理流程。通过自动处理缓存、请求状态和组件订阅,开发者可以更专注于业务逻辑的实现。对于使用 Redux Toolkit 的项目,RTK Query 是一个值得考虑的数据层解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考