createAsyncThunk完整用法介绍

createAsyncThunk 是 Redux Toolkit 库中的一个功能,它用于创建处理异步逻辑的 thunk action creator。Redux Toolkit 是一个官方推荐的库,用于简化 Redux 开发过程,特别是处理常见的 Redux 模式,如异步数据流。createAsyncThunk 自动处理了诸如派发不同阶段的 action(如 pending、fulfilled、rejected)、取消正在运行的异步操作等功能,使得编写异步 Redux 逻辑变得更加简洁和高效。

基本用法

首先,确保你已经安装了 @reduxjs/toolkit

bash 复制代码
npm install @reduxjs/toolkit

然后,你可以这样使用 createAsyncThunk

javascript 复制代码
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import axios from 'axios';

// 定义异步操作
const fetchUserById = createAsyncThunk(
  'users/fetchById', // 第一个参数是 action type 的基础名称,Redux Toolkit 会自动为pending、fulfilled、rejected添加后缀
  async (userId, thunkAPI) => {
    try {
      const response = await axios.get(`/api/users/${userId}`);
      return response.data;
    } catch (error) {
      return thunkAPI.rejectWithValue(error.message); // 错误处理,将错误信息传递给 payload
    }
  }
);

// 创建 Slice
const userSlice = createSlice({
  name: 'user',
  initialState: {
    data: null,
    status: 'idle', // 或 'loading', 'succeeded', 'failed'
    error: null,
  },
  extraReducers: (builder) => {
    builder
      .addCase(fetchUserById.pending, (state) => {
        state.status = 'loading';
      })
      .addCase(fetchUserById.fulfilled, (state, action) => {
        state.status = 'succeeded';
        state.data = action.payload;
      })
      .addCase(fetchUserById.rejected, (state, action) => {
        state.status = 'failed';
        state.error = action.error.message;
      });
  },
});

export default userSlice.reducer;

// 在组件中 dispatch 异步 action
import { useDispatch } from 'react-redux';
import { useSelector } from 'react-redux';
import { fetchUserById } from './userSlice';

function UserDetail({ userId }) {
  const dispatch = useDispatch();
  const user = useSelector((state) => state.user.data);
  const status = useSelector((state) => state.user.status);

  useEffect(() => {
    if (status === 'idle') {
      dispatch(fetchUserById(userId));
    }
  }, [status, dispatch, userId]);

  // ...
}

解释

  • createAsyncThunk : 接收两个参数,第一个是action的类型前缀,第二个是一个异步函数,该函数可以访问到 thunkAPI 对象,它提供了 dispatchgetState 和其他有用的方法。
  • extraReducers : 在创建的 slice 中,使用 extraReducers 来处理由 createAsyncThunk 自动生成的不同状态的 action。
  • 状态管理: 异步操作的状态(如 loading、success、failure)通常会反映在 Redux 状态中,以便 UI 能够根据状态展示不同的内容或加载指示器。
  • 组件中使用 : 在需要的地方使用 useDispatchuseSelector 来 dispatch 异步 action 并获取状态。

createAsyncThunk 提供了一种清晰、统一的方式来管理 Redux 中的异步逻辑,减少了样板代码,并提高了代码的可读性和可维护性。

相关推荐
坚定学代码6 分钟前
static在c++中的使用
开发语言·c++
云上工程笔记9 分钟前
AstraFlow + React/Vite:如何用自然语言开发并部署一个 AI 咖啡网站原型
前端·人工智能·react.js
Q一件事32 分钟前
ArcGIS中TypeError: can‘t multiply sequence by non-int of type ‘str‘错误
前端·javascript·arcgis
云雀衔光1 小时前
Java Spring AI MCP:在 Spring 里把 AI 接上你的业务系统
java·开发语言·人工智能·后端·测试工具·spring
美狐美颜SDK开放平台1 小时前
从视频处理到实时渲染:直播APP中视频美颜SDK的关键技术解析
前端·人工智能·架构·实时互动·音视频·视频美颜sdk
重生之小比特1 小时前
【Java SE】数据类型与变量
java·开发语言·python
Yeniden1 小时前
Java 后端从零到企业级:第1篇 Java 基础语法——变量、数据类型与运算符
java·开发语言·apache
WeiXin_DZbishe1 小时前
基于springboot大学生提问箱系统-计算机毕设【课程设计】72593
javascript·vue.js·spring boot·vscode·python·node.js·php
yume_sibai1 小时前
ES6 核心知识点完全总结(变量 + 箭头函数 + 解构 + Promise + 模块化)
前端·ecmascript·es6
luj_17681 小时前
罚球线右移破防新策略
c语言·开发语言·网络·经验分享·算法