createAsyncThunk
是 Redux Toolkit 中的一个非常有用的工具,它用于创建异步的 Redux Thunk 动作创建器。这些动作创建器可以帮助你以一种更简洁、更可预测的方式来处理异步逻辑,比如 API 调用。
Redux Thunk: 是一个中间件,允许你在 Redux 中编写异步逻辑。Thunk 是一个函数,它可以延迟函数的执行,通常用于处理异步操作。
createAsyncThunk: 是 Redux Toolkit 提供的一个函数,用于创建异步 Thunk。它会自动生成一系列的动作类型,并提供一个 Thunk 函数,该函数会自动分发这些动作。
createSlice
)无缝集成。createAsyncThunk
返回一个 Thunk 函数,该函数接受一个参数并返回一个 Promise。它还会生成三个动作类型:
{actionName}/pending
{actionName}/fulfilled
{actionName}/rejected
假设我们有一个 API 端点 /api/data
,我们想要获取数据并在 Redux store 中保存。
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import axios from 'axios';
// 创建一个异步 Thunk
export const fetchData = createAsyncThunk(
'data/fetchData', // 动作名称
async (_, { rejectWithValue }) => {
try {
const response = await axios.get('/api/data');
return response.data;
} catch (error) {
return rejectWithValue(error.response.data);
}
}
);
// 创建一个 slice 来处理异步操作的状态
const dataSlice = createSlice({
name: 'data',
initialState: {
entities: [],
loading: 'idle',
error: null,
},
reducers: {},
extraReducers: (builder) => {
builder
.addCase(fetchData.pending, (state) => {
state.loading = 'pending';
})
.addCase(fetchData.fulfilled, (state, action) => {
state.loading = 'fulfilled';
state.entities = action.payload;
})
.addCase(fetchData.rejected, (state, action) => {
state.loading = 'rejected';
state.error = action.payload;
});
},
});
export default dataSlice.reducer;
问题: 如果 fetchData
Thunk 没有正确触发或状态没有更新。
原因:
fetchData
。dataSlice
的 reducer。解决方法:
useDispatch
来分发 fetchData
。useDispatch
来分发 fetchData
。dataSlice.reducer
被包含在内。dataSlice.reducer
被包含在内。createAsyncThunk
中添加适当的错误处理逻辑,并在组件中显示错误信息。通过以上步骤,你可以有效地使用 createAsyncThunk
来管理 Redux 应用中的异步操作。
领取专属 10元无门槛券
手把手带您无忧上云