2023-02-16 学习记录--React-邂逅Redux(三)

news2024/11/17 2:38:38

React-邂逅Redux(三)

“天道酬勤,与君共勉”——承接React-邂逅Redux(二),让我们一起继续探索Redux的奥秘吧~☺️【今日新知识——异步action

一、什么是异步action

请添加图片描述

  • action有两种形式:
    • 1、Object类型的一般对象【称为同步action: 即刻执行】
    • 2、函数【称为异步action: 延时执行】

相信有些小萝卜儿和我有一样滴疑问❓:为什么函数就是异步action呢?为什么数组、数字等不是呢?

  • 答👄:因为函数能开启异步任务,而数组、数字等不能哦。异步任务是什么呢?比如我们熟知的定时器就是异步任务哦~

二、如何实现异步action

1、封装 📦

在对应action.js里封装并暴露一个返回函数而非对象滴内容就可以啦~ 😁

  • 比如:在 Countaction.js——count_action.js里封装并暴露一个异步action——createIncrementAsyncAction,如下图 👇🏻
    在这里插入图片描述

2、使用 🔧

在对应组件里通过store.dispatch(createIncrementAsyncAction(value值,time))就可以实现啦~,见下图 👇🏻

在这里插入图片描述

But

运行代码后,发现报错啦,让我们来一起看看👁👁发生了什么吧

请添加图片描述

3、报错 💣

在这里插入图片描述

原因 🔑:Actions必须是Object类型的一般对象,而我们的异步action返回的是一个函数,所以报这个错了;
解决方法 💎:引入一个中间件redux-thunk

三、什么是redux-thunk?其作用是什么?

  • 1、什么是redux-thunk
    • redux-thunkreact的一个applyMiddleware(中间件)。
  • 2、其作用是什么❓
    • 没有redux-thunk这个中间件时,内部的actionCreators只能派发一个对象的action,不能做异步操作,所以redux-thunk的作用是支持异步action,没有它,store就不认函数类型的action

四、bug优化

1、安装redux-thunk

npm i redux-thunk

或者

yarn add redux-thunk

2、在store.js里引入redux-thunk

// 引入redux-thunk,用于支持异步action
import thunk from 'redux-thunk'

3、在store.js里引入applyMiddleware(执行中间件)

// 引入`applyMiddleware`(执行中间件)
import {applyMiddleware } from 'redux'

4、applyMiddleware(thunk)作为createStore的第二个参数传入

store.js里的实现步骤如下图:👇🏻

在这里插入图片描述
store.js对应代码: 👇🏻

/* 
    该文件专门用于暴露一个store对象,整个应用只有一个store对象
*/

// 1-1、引入createStore(方法),专门用于创建redux中最为核心的store对象;1-2、引入applyMiddleware(执行中间件),这里用于执行thunk
import { createStore, applyMiddleware } from 'redux'
// 2、引入为Count组件服务的reducer(从count_reducer.js里引入)
import countReducer from './count_reducer'
// 3、引入redux-thunk,用于支持异步action
import thunk from 'redux-thunk'
// 4、暴露store对象
/* 第一种写法:分开写 */
// const store = createStore(countReducer); // 创建一个store对象:createStore是一个创建store对象的方法,指定一个reducer
// export default store; // 暴露store对象,即 将store对象默认暴露出去

/* 第二种方法:合并写,简洁 */
export default createStore(countReducer,applyMiddleware(thunk)); // 暴露store对象,即 将store对象默认暴露出去

五、代码优化

请添加图片描述

count_action.js里还有一个待优化的小细节:不用自己引入store

  • 这个返回的函数本身就是store帮忙调用的,store默认就传了个dispatch进来,所以不用再引入store,直接在函数里接收到dispatch,并调用即可。
    在这里插入图片描述

count_action.js最终对应代码: 👇🏻

/*
    该文件专门为Count组件生成action对象
*/
import { INCREMENT, DECREMENT } from "./constant";

// 返回一个对象(同步action)【同步action,就是指action的值为Object类型的一般对象】
export const createIncrementAction = data => ({ type: INCREMENT, data }); // 创建加法的action对象,并暴露出去
export const createDecrementAction = data => ({ type: DECREMENT, data }); // 创建减法的action,并暴露出去

// 返回一个函数(异步action)【异步action,就是指action的值为函数,异步action中一般都会调用同步action,异步action不是必须要用的】
export const createIncrementAsyncAction = (data, time) => {
    return (dispatch) => {
        // 需要进行的异步任务
        setTimeout(() => {
            // 同步action —— 通知redux 你需要进行的操作,这里是 通知redux加value
            dispatch(createIncrementAction(data));
        },time)
    }
}

六、补充 👄

请添加图片描述

异步action不是必须要写的,完全可以自己等待异步任务的结果了 再去分发同步action,怎么简单怎么来。☺️

比如下面两种写法,最终结果是一样滴哦~ 👇🏻

/** 写法一 */
// 异步任务
setTimeout(() => {
   // 同步action —— 通知redux加value
   store.dispatch(createIncrementAction(value*1));
}, 500);
/** 写法二 */
// 异步action
store.dispatch(createIncrementAsyncAction(value * 1, 500));

七、总结 📚

## 3.求和案例_redux异步action版
		 (1).明确:延迟的动作不想交给组件自身,想交给action
		 (2).何时需要异步action:想要对状态进行操作,但是具体的数据靠异步任务返回。
		 (3).具体编码:
		 			1).yarn add redux-thunk,并配置在store中
		 			2).创建action的函数不再返回一般对象,而是一个函数,该函数中写异步任务。
		 			3).异步任务有结果后,分发一个同步的action去真正操作数据。
		 (4).备注:异步action不是必须要写的,完全可以自己等待异步任务的结果了 再去分发同步action。

上一篇:React-邂逅Redux(二)

These are bilibili尚硅谷React学习视频的 学习笔记~

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

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

相关文章

C#:Krypton控件使用方法详解(第二讲) ——kryptonCheckBox

今天介绍的Krypton控件中的kryptonCheckBox,这个控件和VS中带的CheckBox控件还是不一样的,下面介绍这个控件。kryptonCheckBox控件的外观属性如下图所示:Checked属性:对应的属性值为Bool类型有两个,当属性值为true时kr…

DHCP协议

DHCP协议 文章目录DHCP协议DHCP作用及特点DHCP服务IP分配的三种方式DHCP协议中的报文类型DHCP服务工作流程抓包参考动态主机配置协议 DHCP(Dynamic Host Configuration Protocol),提供了一种 插网即用的技术。DHCP是一个应用层协议。当我们将…

CANoe仿真工程开发

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、网络拓扑图二、数据库文件设计四、Panel设计五、CAPL代码实现六、Automation Sequences七、分析窗口设置八、Trace窗口与Logging九、Desktop布局十、工程运行…

【算法 | 例题简答】相关例题讲解

目录 简答题 计算题 时间复杂度的计算 递归算法计算 背包问题(0-1背包问题) 回溯法 动态规划法 编程题 用回溯法解方程 动态规划法解决蜘蛛吃蚊子 用分治法解决抛硬币问题 用二分法分两边求最大值 简答题 1、什么是算法?算法有哪…

Revit问题:Navisworks中导入的rvt模型角度不正确调整

一、Navisworks中导入的rvt模型角度不正确调整方法 通常情况下,我们做好一个Revit模型,有时候出于成果保护或者鉴于Revit自带的碰撞检测效果不够直观、Revit模型体量太大,需要一个轻量化的模型展示,我们通常情况下会使用Autodesk公…

【python】基于Socket的聊天室Python开发

基于Socket的聊天室Python开发一、Socket简述二、创建服务端Server2.1 创建服务端初始化2.2 监听客户端连接2.3 处理客户端消息三、创建客户端Client3.1 创建服务端初始化3.2 发送消息3.3 接收消息3.3 线程工作3.4 线程工作是不是挺好玩的呢?也可以作为课程设计哦&a…

【C++】Expression的学习笔记

关于不同类别表达式的举例,请参考博文《C 中的值类别》 1. 左值和右值的简单理解 左值对应了具有内存地址的对象,而右值仅仅是临时使用的值对象。(引用自博文《C 中的值类别》)左值有名称(变量或常量名称&#xff09…

RFC7519规范-JWT - json web token

简介 什么是JWT(JSON Web Token) 在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流程: 客户端使用用户名和密码请求登录服务端收到请求,验证用户名和密码验证成功后,服务端会签发一个token,再把这个to…

mybatis-spring-boot-starter中设定多数据源,并实现Durid的监控

实现功能: 1: 配置两个数据源,根据不同的mapper路径使用不同的数据连接 2 :使用Druid连接池 3:Druid 可监控多个数据源的sql执行操作 分析: 查看mybatis_spring_boot_stater中关于自动装配的类可知【如上…

基于动力学模型的无人驾驶车辆主动转向控制

章五 基于动力学模型的无人驾驶车辆主动转向控制 主动转向控制联合仿真 基于动力学模型的无人驾驶车辆主动转向控制 无人驾驶车辆模型预测控制第五章(上) 无人驾驶车辆模型预测控制第五章(下) 北理工无人驾驶车辆模型预测控制第4…

测试新版Android Studio的手机镜像效果

学更好的别人, 做更好的自己。 ——《微卡智享》 本文长度为669字,预计阅读2分钟 前言 春节刚上班,就开始了疯狂出差的节奏,期间发现Android Studio发布新的版本2022.1.1(Electric Eel),里面两个更新的内容蓝牙模拟器和…

ChatGPT 帮我自动编写 Python 爬虫脚本

都知道最近ChatGPT聊天机器人爆火,我也想方设法注册了账号,据说后面要收费了。 ChatGPT是一种基于大语言模型的生成式AI,换句话说它可以自动生成类似人类语言的文本,把梳理好的有逻辑的答案呈现在你面前,这完全不同于…

2023美赛数学建模资料思路模型

美赛我们为大家准备了大量的资料,我们会在比赛期间给大家分析美题目和相关的思路 全文都是干货,大家仔细阅读,资料文末自取! 首先我们来看美赛23年题型的一个变化: 美赛23年题目变化: A题:连…

【C语言】初识指针

目录 一、指针是什么 二、指针和指针类型 三、野指针 四、指针运算 五、指针和数组 六、二级指针 七、指针数组 一、指针是什么 指针就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度…

2023年2月的十篇深度学习论文推荐

本月的论文包括语言模型、扩散模型、音乐生成、多模态等主题。 1、MusicLM: Generating Music From TextPage https://arxiv.org/abs/2301.11325 By Andrea Agostinelli, Timeo I. Denk, et al. 扩散模型和自回归离散模型都在生成音乐/音频显示出令人印象深刻的性能。 与最…

第45期:一条 SQL 语句优化的基本思路

SQL 语句优化是一个既熟悉又陌生的话题。面对千奇百怪的 SQL 语句,虽然数据库本身对 SQL 语句的优化一直在持续改进、提升,但是我们不能完全依赖数据库,应该在给到数据库之前就替它做好各种准备工作,这样才能让数据库来有精力做它…

FreeMarker生成word文档,固定word模板

该方法也就是通过freemarker生成固定的word文档,动态的word模板布局不能用该方法。 也就是必须有一个固定的模板文档是.ftl类型 如果初始文件为 需要手动改为: 也就是所有需要替换的地方,都需要有${XX}替换。 主要步骤为: 将 w…

JVM学习8: 字符串

基本特性 代表不可变字符序列final不可被继承实现了Serializable、Comparable等接口jdk8及以前使用final char[]存储,jdk9开始改为使用byte[]存储通过字面量方式给一个字符串变量赋值,此时字符串对象在字符串常量池里面 字符串常量池 字符串常量池不会…

《论文阅读》PAL: Persona-Augmented Emotional Support Conversation Generation

《论文阅读》PAL: Persona-Augmented Emotional Support Conversation Generation 前言简介思路出发点相关知识coefficient of determination任务定义模型框架实验结果前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到失望?…

企企通:企业供应商风险管理,如何用采购管理软件赋能?

企业采购过程中,最怕/最担心的事情无非是:供应链异常。供应链异常,也就是我们常说的供应链风险,可以简单分为需求风险、供应商风险、物流风险和财务风险四大类。其中,最为突出的风险便是供应商风险。从寻找合适的供应商…