第58节——redux-toolkit中的createAsyncThunk

一、概念

createAsyncThunk 是一个由 Redux Toolkit 提供的函数,用于创建处理异步操作的 thunk action creator。使用 createAsyncThunk 可以简化 Redux 中处理异步操作的流程,使代码更加清晰、简洁。

二、参数说明

import { createAsyncThunk } from "@reduxjs/toolkit";const myAsyncThunk = createAsyncThunk(/*** 一个字符串类型的 action 名称,用于在 Redux 中识别该 action。* 该名称通常包含操作名称和状态*  */"myAsyncOperationStatus",/*** 异步操作函数,该函数接收两个参数* 第一个参数是 thunk 的 payload,也就是调用的时候传过来的* 第二个参数是thunk对象* dispatch* 用于 dispatch 其他 action 的函数* getState* 用于获取当前 Redux store 中的 state 的函数* extra* 性是用于传递额外参数的对象* */async (arg, { dispatch, getState, extra }) => {// 异步操作函数,必须返回一个 Promiseconst response = await fetch("https://example.com/api/someEndpoint");return response.json();},{} // 可选的配置项
);

三、例子

点击按钮age延迟1秒后+1,在延迟的时候,显示loading。偶数的时候显示报错,并显示提示信息

1、在action目录的user.js文件添加一下代码

import { createAction, createAsyncThunk } from "@reduxjs/toolkit";const dely = () => {return new Promise((resolve, reject) => {setTimeout(() => {resolve();}, 1000);});
};export const ageAddAsync = createAsyncThunk("user/ageAddAsync",async (arg, { dispatch, getState, extra }) => {const { user } = getState();console.log(user.age);await dely();// 偶数的时候抛错if (user.age % 2 === 0) {throw new Error("偶数的时候抛错")}}
);

2、修改slice目录里的user.js模块

import { createSlice } from "@reduxjs/toolkit";
import { ageAddAsync } from "./../actions/user";const userSlice = createSlice({// 切片名 必须全局唯一name: "user",// 初始化状态initialState: {age: 1,name: "李四",status: "",error: "",},reducers: {/**** @param {*} state 当前的state* @param {*} action 穿过来的参数*/addAge(state, action) {return {...state,age: state.age + 1,};},},extraReducers: (builder) => {builder.addCase("user/updateName", (state, action) => {state.name = action.payload.name;})// 异步方法的pedding状态.addCase(ageAddAsync.pending, (state) => {state.status = "loading";})// 异步方法的成功的状态.addCase(ageAddAsync.fulfilled, (state, action) => {state.age += 1;state.status = "successed";state.error = ''})/*** state* action 当前的错误信息*/.addCase(ageAddAsync.rejected, (state, action) => {console.log(action)state.status = "error";state.age += 1state.error = action.error.message;});},
});/*** 导出slice模块的reducer*/
export default userSlice.reducer;/*** 直接导出actions模块* 这个actions里面的方法和reducer里的方法名* 一致,直接对象解构*/
export const { addAge } = userSlice.actions;

3、挂载到configureStore

import { configureStore, createSlice } from "@reduxjs/toolkit";
import user from './slice/user';const store = configureStore({reducer: {user},
});export default store;

4、页面中使用

import { useSelector, useDispatch } from "react-redux";
import { ageAddAsync } from "./store/actions/user";export default function LearnReduxToolkit4() {const user = useSelector((state) => state.user);const dispatch = useDispatch();return (<div><div>{user.name}--{user.age}</div><div>{user.status}</div><div>{user.error}</div>{/* <div>偶数抛出错误</div> */}<button onClick={() => dispatch(ageAddAsync())}>延迟一秒+1</button></div>);
}

四、小思考

可以不可以封装一下createSlice和createAsyncThunk,让调用变得更简单🤔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/107800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法题】2903. 找出满足差值条件的下标 I

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 给你一个下标从 0 开始、长度为 n …

Py之trl:trl(一款采用强化学习训练Transformer语言模型和稳定扩散模型的全栈库)的简介、安装、使用方法之详细攻略

Py之trl&#xff1a;trl(一款采用强化学习训练Transformer语言模型和稳定扩散模型的全栈库)的简介、安装、使用方法之详细攻略 目录 trl的简介 1、亮点 2、PPO是如何工作的&#xff1a;PPO对语言模型微调三步骤&#xff0c;Rollout→Evaluation→Optimization trl的安装 t…

4.3 划分子网和构造超网

思维导图&#xff1a; 4.3.1 划分子网 **4.3 划分子网和构造超网笔记&#xff1a;** --- **4.3.1 划分子网** **1. 两级IP地址到三级IP地址的转变&#xff1a;** **关键点&#xff1a;** - **问题背景&#xff1a;** 早期的ARPANET对IP地址的设计存在不足&#xff1a; 1…

LeetCode 63. 不同路径 II

63. 不同路径 II 思路&#xff1a; 动态规划 dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) 有dp[i][j]条不同的路径 根据题意&#xff0c;只能向下或者向右移动一步&#xff0c;则dp[i][j] dp[i - 1][j] dp[i][j - 1] 但是…

第五十九章 学习常用技能 - 将数据从一个数据库移动到另一个数据库

文章目录 第五十九章 学习常用技能 - 将数据从一个数据库移动到另一个数据库 第五十九章 学习常用技能 - 将数据从一个数据库移动到另一个数据库 如果需要将数据从一个数据库移动到另一个数据库&#xff0c;请执行以下操作&#xff1a; 识别包含数据及其索引的Global。 如果…

Android 13.0 首次开机进入Launcher3前黑屏几秒的几种情况问题的总结

1.概述 在13.0的系统产品定制化工作中,对于系统开发确实有些难度,特别是在开机阶段遇到的问题,比如开机动画播放完毕进入锁屏界面黑屏几秒然后进入 锁屏界面,这就需要根据开机日志来分析问题所在,在工作中遇到的几种黑屏情况做下记录,然后供以后解决问题做参考 2.首次开…

Java String之正则表达式

Java String之正则表达式 导言 最近做项目时&#xff0c;遇到了限制输入字符格式的问题&#xff0c;采用了Java String的正则表达式&#xff0c;下面针对正则表达式使用进行概述 正则表达式 正则表达式类似可以通俗的理解为字符模板&#xff0c;通过符号的方式进行表述&…

uni-app--》基于小程序开发的电商平台项目实战(五)

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

Fetch与Axios数据请求

什么是Polyfill? Polyfill是一个js库&#xff0c;主要抚平不同浏览器之间对js实现的差异。比如&#xff0c;html5的storage(session,local), 不同浏览器&#xff0c;不同版本&#xff0c;有些支持&#xff0c;有些不支持。Polyfill&#xff08;Polyfill有很多&#xff0c;在Gi…

IDEA spring-boot项目启动,无法加载或找到启动类问题解决

问题描述&#xff1a;找不到或无法加载主类 xxx.xxx.xxx.Classname 解决方案&#xff1a; 1.检查启动设置&#xff1a; 启动类所在包运行环境&#xff08;一般选择默认即可&#xff09;设置完成即可进行运行测试 2.如果第一步没有解决问题&#xff0c;试着第二步&#xff1a…

常见三维建模软件有哪些?各自的特点是什么?

常见的三维建模软件包括以下这些&#xff1a; 1. 3DS Max 3D Studio Max&#xff0c;简称3DS MAX&#xff0c;是当今世界上销售量最大的三维建模、动画及渲染软件。它的应用范围广泛&#xff0c;包括计算机游戏中的动画制作、影视片的特效制作等。3DS MAX的操作相对容易&#…

【学习笔记】RabbitMQ02:交换机,以及结合springboot快速开始

参考资料 RabbitMQ官方网站RabbitMQ官方文档噼咔噼咔-动力节点教程 文章目录 四、RabbitMQ &#xff1a;Exchange 交换机4.1 交换机类型4.2 扇形交换机 Fanout Exchange4.2.1 概念4.2.1 实例&#xff1a;生产者4.2.1.1 添加起步依赖4.2.1.2 配置文件4.2.1.3 JavaBean进行配置4.…

iMazing 3中文版功能介绍免费下载安装教程

iMazing 3中文版免费下载是一款兼容Win和Mac的iOS设备管理软件。iMazing 3能够将音乐、文件、消息和应用等数据从任何 iPhone、iPad 或 iPod 传输到 Mac 或 PC 上。 使用iMazing 3独特的 iOS 备份功能保证数据安全:设定自动无线备份时间并支持快照;将备份保存到外接驱动器和网…

Halcon Camera-calibration 相关算子(二)

(1) set_calib_data( : : CalibDataID, ItemType, ItemIdx, DataName, DataValue : ) 功能&#xff1a;在标定数据模型中设置数据。 控制输入参数1&#xff1a;CalibDataID&#xff1a;标定数据模型句柄&#xff1b; 控制输入参数2&#xff1a;ItemType&#xff1a;标定数据…

HFSS中激励方式学习笔记(总)

HFSS中激励方式 文章目录 HFSS中激励方式波端口激励&#xff08;Wave Port&#xff09;集总端口激励&#xff08;Lumped Port&#xff09;floquet端口激励&#xff08;floquet Port&#xff09;入射波激励&#xff08;Incident Port&#xff09;电压源激励&#xff08;Voltage …

17 - 并发容器的使用:识别不同场景下最优容器

在并发编程中&#xff0c;我们经常会用到容器。今天我要和你分享的话题就是&#xff1a;在不同场景下我们该如何选择最优容器。 1、并发场景下的 Map 容器 假设我们现在要给一个电商系统设计一个简单的统计商品销量 TOP 10 的功能。常规情况下&#xff0c;我们是用一个哈希表…

如何通过Photoshop将视频转换成GIF图片

一、应用场景 1、将视频转有趣动图发朋友圈 2、写CSDN无法上传视频&#xff0c;而可以用GIF动图替代 3、其他 二、实现步骤 1、打开Photoshop APP 2、点击文件——导入——视频帧到图层 3、选择视频文件 4、配置视频信息&#xff0c;按照图片提示配置完毕之后点击确定&…

c#调用CUDA执行YOLOV5对象检测

c#使用调YOLOV5对象检测&#xff0c;并调用CUDA进行计算 1.CUDA版本11.2 2.cuDNN用cudnn-windows-x86_64-8.9.3.28_cuda11-archive 记得把压缩包的三个文件夹放到cuda根目录下覆盖 3.Microsoft.ML.OnnxRuntime.Gpu要使用1.13.1,如果版本太新&#xff0c;SessionOptions会报…

C# Winform编程(4)多文档窗口(MDI)

多文档窗口&#xff08;MDI&#xff09; 添加菜单&#xff0c;IsMdiContainer设为True: From窗口添加菜单 Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using S…

snk-给github界面加一个有趣的动画

How to enable GitHub Actions on your Profile README for a snake-eating contribution graph &#x1f40d; - DEV Community Platane/Platane (github.com) ① 创建New repository 名字和你自己的Github 用户名一样。 ② 创建之后&#xff0c;再这个Zero-coder仓库下创建…