Redux 工具包 - createAsyncThunk()
**createAsyncThunk()** 是 Redux Toolkit 中的一个函数,用于处理异步操作,例如 API 调用。此函数自动处理三个主要阶段:
本文是上一篇文章的续篇,您可以在此处阅读。
创建 postSlice
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import axios from 'axios';
interface Post {
id: number;
title: string;
body: string;
}
interface PostState {
posts: Post[];
loading: boolean;
error: string | null;
}
const initialState: PostState = {
posts: [],
loading: false,
error: null,
};
// Create a thunk to fetch data
export const fetchPosts = createAsyncThunk('posts/fetchPosts', async () => {
const response = await axios.get(
'https://jsonplaceholder.typicode.com/posts'
);
return response.data;
});
// Create slice
const postSlice = createSlice({
name: 'posts',
initialState,
reducers: {},
extraReducers: (builder) => {
builder
.addCase(fetchPosts.pending, (state) => {
state.loading = true;
})
.addCase(fetchPosts.fulfilled, (state, action) => {
state.loading = false;
state.posts = action.payload;
})
.addCase(fetchPosts.rejected, (state, action) => {
state.loading = false;
state.error = action.error.message || 'Failed to fetch posts';
});
},
});
export default postSlice.reducer;帖子/fetchPosts
“posts/fetchPosts” 是 “createAsyncThunk” 生成的动作的类型。
通用格式:''/“”
为什么要使用这种格式?
Reducer 和 extraReducers 之间的区别
什么是 builder 和 addCase
`builder` 是 Redux Toolkit 的一个特殊 API,用于 `extraReducers` 中,用来有组织地添加 action handlers。其中最主要的方法是 `addCase`,通过指定 action type 和对应的 Reducer 函数来处理具体的 action。
更新 store.ts
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './slice/counterSlice';
import storage from 'redux-persist/lib/storage';
import { persistReducer, persistStore } from 'redux-persist';
import postsReducer from './slice/postSlice';
const persistConfig = {
key: 'root',
storage,
};
const persistedCounterReducer = persistReducer(persistConfig, counterReducer);
export const store = configureStore({
reducer: {
counter: persistedCounterReducer,
posts: postsReducer,
},
});
export const persistor = persistStore(store);
export type RootState = ReturnType;
export type AppDispatch = typeof store.dispatch; 在组件中使用
import { useDispatch, useSelector } from 'react-redux';
import { AppDispatch, RootState } from './state/store';
import {
decrement,
increment,
incrementByAmount,
} from './state/slice/counterSlice';
import { useEffect } from 'react';
import { fetchPosts } from './state/slice/postSlice';
export default function App() {
const count = useSelector((state: RootState) => state.counter.value);
const { posts, error, loading } = useSelector(
(state: RootState) => state.posts
);
const dispatch: AppDispatch = useDispatch();
useEffect(() => {
dispatch(fetchPosts());
}, [dispatch]);
return (
{count}
{loading ? (
Loading...
) : error ? (
Error: {error}
) : (
{posts.map((post) => {
return (
-
{post.title.length > 20
? post.title.slice(0, 20) + '...'
: post.title}
{post.body.length > 150 ? post.body + '...' : post.body}
);
})}
)}
);
}结果

如果收到此错误,请更新 store.ts 并添加中间件。

添加中间件
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './slice/counterSlice';
import storage from 'redux-persist/lib/storage';
import { persistReducer, persistStore } from 'redux-persist';
import postsReducer from './slice/postSlice';
const persistConfig = {
key: 'root',
storage,
};
const persistedCounterReducer = persistReducer(persistConfig, counterReducer);
export const store = configureStore({
reducer: {
counter: persistedCounterReducer,
posts: postsReducer,
},
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({
serializableCheck: {
ignoredActions: ['persist/PERSIST'],
},
}),
});
export const persistor = persistStore(store);
export type RootState = ReturnType;
export type AppDispatch = typeof store.dispatch; 结论
通过在 Redux Toolkit 中使用 `createAsyncThunk()`,管理 API 调用等异步操作变得更加轻松、更有条理。这种方法简化了数据获取,同时确保了干净且可扩展的 Redux 状态管理结构。
希望本指南能帮助您更好地了解 Redux Toolkit,尤其是其异步处理功能。如果您有任何问题或反馈,请随时发表评论!
GitHub 仓库:https://github.com/rfkyalf/redux-toolkit-learn
此外,如果您有兴趣,请随时访问我的投资组合网站 www.rifkyalfarez.my.id 以探索我的更多项目。感谢您的阅读。