在 Redux Toolkit 中编写异步代码,可以使用 `createAsyncThunk` 和 `createSlice` 来简化和统一异步操作的处理。下面是一个使用 Redux Toolkit 编写异步代码的示例:
首先,使用 `createAsyncThunk` 创建一个异步操作的 thunk 函数,该函数可以触发异步请求并处理响应。
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
// 创建异步操作的 thunk 函数
const fetchUserData = createAsyncThunk('user/fetchUserData', async (userId, thunkAPI) => {
try {
// 发起异步请求
const response = await fetch(`/api/user/${userId}`);
const data = await response.json();
return data;
} catch (error) {
// 处理错误
return thunkAPI.rejectWithValue({ error: error.message });
}
});
然后,在 `createSlice` 中定义对应的 reducer,它会自动处理异步操作的不同阶段。
const userSlice = createSlice({
name: 'user',
initialState: {
data: null,
loading: false,
error: null,
},
reducers: {},
extraReducers: (builder) => {
// 处理异步操作的不同阶段
builder
.addCase(fetchUserData.pending, (state) => {
state.loading = true;
})
.addCase(fetchUserData.fulfilled, (state, action) => {
state.loading = false;
state.data = action.payload;
state.error = null;
})
.addCase(fetchUserData.rejected, (state, action) => {
state.loading = false;
state.error = action.payload.error;
});
},
});
在上述示例中,我们使用 `createAsyncThunk` 创建了一个名为 `fetchUserData` 的异步 thunk 函数,用于获取用户数据。然后,在 `extraReducers` 部分使用 `addCase` 方法来处理异步操作的不同阶段。`fetchUserData.pending` 处理异步操作开始的阶段,`fetchUserData.fulfilled` 处理异步操作成功的阶段,`fetchUserData.rejected` 处理异步操作失败的阶段。
这样,在应用中可以直接调用 `dispatch(fetchUserData(userId))` 来触发异步请求,并且状态的更新和错误处理会自动由 Redux Toolkit 处理。
总结来说,Redux Toolkit 提供了 `createAsyncThunk` 和 `createSlice` 来简化和统一异步操作的处理。使用这些工具,可以更轻松地编写和管理异步代码,并提供了更简洁、可读性更好的代码结构。