位置: IT常识 - 正文

Redux工具包(二) - Redux Toolkit的异步操作(发送网络请求)(redux reducer使用教程)

编辑:rootadmin
Redux工具包(二) - Redux Toolkit的异步操作(发送网络请求) Redux Toolkit异步操作

推荐整理分享Redux工具包(二) - Redux Toolkit的异步操作(发送网络请求)(redux reducer使用教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:redux 教程,redux-toolkit,redux 教程,redux 教程,redux-tookit,redux tool,redux-toolkit,redux tool,内容如对您有帮助,希望把文章链接给更多的朋友!

在之前的开发中,我们通过redux-thunk中间件让dispatch中可以进行异步操作, 其实Redux Toolkit工具包默认已经给我们集成了Thunk相关的功能, 我们可以通过createAsyncThunk函数创建一个异步的action

createAsyncThunk函数有参数:

参数一: 传入事件类型type

参数二: 传入一个函数, 该函数可以执行异步操作, 甚至可以直接传入一个异步函数

export const fetchHomeMultidataAction = createAsyncThunk("fetch/homemultidata", async () => { const res = await axios.get("http://123.207.32.32:8000/home/multidata") const banners = res.data.data.banners.list const recommends = res.data.data.recommends.list})f

当createAsyncThunk创建出来的action被dispatch时,会存在三种状态:

pending: action被发出,但是还没有最终的结果;

fulfilled: 获取到最终的结果(有返回值的结果);

rejected: 执行过程中有错误或者抛出了异常;

Redux工具包(二) - Redux Toolkit的异步操作(发送网络请求)(redux reducer使用教程)

我们可以在createSlice的entraReducer中监听这些结果:

注意: 我们创建的一部action: fetchHomeMultidataAction返回的结果, 会被传到下面监听函数的actions参数中,

通过actions.payload获取(也可以对actions进行结构, 直接获取payload)

// extraReducers中针对异步action, 监听它的状态extraReducers: { // 处于padding状态时回调 [fetchHomeMultidataAction.pending](state, actions) { console.log("正处于pending状态") }, // 处于fulfilled状态时回调 [fetchHomeMultidataAction.fulfilled](state, actions) { console.log("正处于fulfilled状态") }, // 处于rejected状态时回调 [fetchHomeMultidataAction.rejected](state, actions) { console.log("正处于rejected状态") }}

演示网络请求的流程:

方式一:

在home.js中, 通过createAsyncThunk函数创建一个异步的action

再在extraReducers中监听这个异步的action的状态, 当他处于fulfilled状态时, 获取到网络请求的数据, 并修改原来state中的数据

import { createSlice, createAsyncThunk } from "@reduxjs/toolkit"import axios from "axios"// 创建一个异步的actionexport const fetchHomeMultidataAction = createAsyncThunk("fetch/homemultidata", async () => { const res = await axios.get("http://123.207.32.32:8000/home/multidata") // 返回结果会传递到监听函数的actions中 return res.data})const homeSlice = createSlice({ name: "home", initialState: { banners: [], recommends: [] }, // extraReducers中针对异步action, 监听它的状态 extraReducers: { [fetchHomeMultidataAction.fulfilled](state, { payload }) { // 在fulfilled状态下, 将state中的banners和recommends修改为网络请求后的数据 state.banners = payload.data.banner.list state.recommends = payload.data.recommend.list } }})export default homeSlice.reducer

方式二:

如果我们不想通过在extraReducers在监听状态, 再修改state这种方法的话, 还有另外的一种做法

我们创建的fetchHomeMultidataAction这个异步action是接受两个参数的

参数一, extraInfo: 在派发这个异步action时, 如果有传递参数, 会放在extraInfo里面参数二, store: 第二个参数将store传递过来

这样我们获取到结果后, 通过dispatch修改store中的state, 无需再监听异步action的状态

import { createSlice, createAsyncThunk } from "@reduxjs/toolkit"import axios from "axios"// 创建一个异步的actionexport const fetchHomeMultidataAction = createAsyncThunk( "fetch/homemultidata", // 有传递过来两个个参数, 从store里面解构拿到dispatch async (extraInfo, { dispatch }) => { // 1.发送网络请求获取数据 const res = await axios.get("http://123.207.32.32:8000/home/multidata") // 2.从网络请求结果中取出数据 const banners = res.data.data.banner.list const recommends = res.data.data.recommend.list// 3.执行dispatch, 派发action dispatch(changeBanners(banners)) dispatch(changeRecommends(recommends)) })const homeSlice = createSlice({ name: "home", initialState: { banners: [], recommends: [] }, reducers: { changeBanners(state, { payload }) { state.banners = payload }, changeRecommends(state, { payload }) { state.recommends = payload } }})export const { changeBanners, changeRecommends } = homeSlice.actionsexport default homeSlice.reducer

不管是哪种方式, 都需要在页面的componentDidMount生命周期中, 通过派发异步的action发送网络请求

import React, { PureComponent } from 'react'import { connect } from 'react-redux'import { fetchHomeMultidataAction } from '../store/features/home'export class About extends PureComponent { // 生命周期中, 调用映射的方法派发异步的action componentDidMount() { this.props.fetchHomeMultidata() } render() { const { banners, recommends } = this.props return ( <div> <h2>About</h2> <h2>轮播图数据</h2> <ul> { banners.map(item => { return <li key={item.acm}>{item.title}</li> }) } </ul> <h2>推荐数据</h2> <ul> { recommends.map(item => { return <li key={item.acm}>{item.title}</li> }) } </ul> </div> ) }}const mapStateToProps = (state) => ({ banners: state.home.banners, recommends: state.home.recommends})// 派发异步的actionconst mapDispatchToProps = (dispatch) => ({ fetchHomeMultidata() { dispatch(fetchHomeMultidataAction()) }})export default connect(mapStateToProps, mapDispatchToProps)(About)
本文链接地址:https://www.jiuchutong.com/zhishi/296202.html 转载请保留说明!

上一篇:【微信小程序】如何获得自己当前的定位呢?本文利用逆地址解析、uni-app带你实现(微信小程序怎么制作自己的小程序)

下一篇:html旅游网站设计与实现——绿色古典旅游景区 HTML+CSS+JavaScript(html5旅游网页设计)

  • 如何让自己的微博每天增加1000粉丝(如何让自己的微信从对方微信中消失)

    如何让自己的微博每天增加1000粉丝(如何让自己的微信从对方微信中消失)

  • spring 面试题(spring面试题2021)

    spring 面试题(spring面试题2021)

  • 华为5z和5i的区别有哪些(华为5z怎么样,好用吗)

    华为5z和5i的区别有哪些(华为5z怎么样,好用吗)

  • 候补以后还能抢票吗(候补购票后还能抢当天其他车的票吗)

    候补以后还能抢票吗(候补购票后还能抢当天其他车的票吗)

  • 水冷主机用换水冷液吗(水冷主机用换水管吗)

    水冷主机用换水冷液吗(水冷主机用换水管吗)

  • 电脑快速查找是哪个键(电脑查找是哪个快捷键)

    电脑快速查找是哪个键(电脑查找是哪个快捷键)

  • 笔记本多久清一次灰(笔记本多久清一次灰多少钱)

    笔记本多久清一次灰(笔记本多久清一次灰多少钱)

  • 抖音设为私密账号别人能看到吗(抖音设为私密账号能看到访客吗)

    抖音设为私密账号别人能看到吗(抖音设为私密账号能看到访客吗)

  • 回收站的照片删除了怎么恢复(回收站的照片删除了还能恢复吗电脑)

    回收站的照片删除了怎么恢复(回收站的照片删除了还能恢复吗电脑)

  • 快手头像有个对号什么意思(快手头像有一个1)

    快手头像有个对号什么意思(快手头像有一个1)

  • 显卡有哪些(无矿显卡有哪些)

    显卡有哪些(无矿显卡有哪些)

  • 笔记本键盘不能用了怎么回事(笔记本键盘不能用了,是锁住什么了吗)

    笔记本键盘不能用了怎么回事(笔记本键盘不能用了,是锁住什么了吗)

  • iphone5是什么处理器(苹果5c是什么)

    iphone5是什么处理器(苹果5c是什么)

  • ipadwlan是什么型号(ipad wlan款什么意思)

    ipadwlan是什么型号(ipad wlan款什么意思)

  • ipad版本低微信装不上怎么办(ipad版本低微信下载完登录不了)

    ipad版本低微信装不上怎么办(ipad版本低微信下载完登录不了)

  • a10fusion和a10的区别(a10fusion和a11的区别)

    a10fusion和a10的区别(a10fusion和a11的区别)

  • 1000兆等于多少mb(网速1000兆等于多少mb)

    1000兆等于多少mb(网速1000兆等于多少mb)

  • 手机微信支付不了怎么回事(手机微信支付不绑定银行卡可以吗)

    手机微信支付不了怎么回事(手机微信支付不绑定银行卡可以吗)

  • 华为小e在哪里打开(怎么打开华为小e)

    华为小e在哪里打开(怎么打开华为小e)

  • 删除sku权重多久会恢复(删除sku会降权吗)

    删除sku权重多久会恢复(删除sku会降权吗)

  • 微信里删除的人还能找到吗(微信里删除的人怎么找回)

    微信里删除的人还能找到吗(微信里删除的人怎么找回)

  • p30pro功能介绍(p30pro有哪些强大功能)

    p30pro功能介绍(p30pro有哪些强大功能)

  • vivox27有没有nfc(vivox27有没有指纹解锁)

    vivox27有没有nfc(vivox27有没有指纹解锁)

  • 金山文档小程序怎么用(金山文档小程序删除内容怎样恢复)

    金山文档小程序怎么用(金山文档小程序删除内容怎样恢复)

  • yolov5——detect.py代码【注释、详解、使用教程】(yolo object detection)

    yolov5——detect.py代码【注释、详解、使用教程】(yolo object detection)

  • 小微企业所得税优惠政策最新2022
  • 增值税申报表如何打印
  • 子公司之间股权转让
  • 完工产品成本计入什么科目
  • 出口货物关税完税价格
  • 信息采集需要填两个家庭成员,但只能有一个监护人
  • 出差加油算什么费用
  • 预付和预收可以合并吗
  • 购入土地使用权以什么为计税依据
  • 生产成本结转主营业务成本本币公式怎么弄
  • 增值税一般纳税人资格登记表
  • 个体工商户2023年税收政策
  • 外地预交的附加税金在申报的时候怎么填
  • 定期定额户个人所得税怎么申报
  • 固定资产投资会计处理
  • 增值税即征即退政策适用范围
  • 传媒公司的成本构成有哪些
  • 不需要缴纳企业所得税的企业类型
  • 零售产品的进项税怎么算
  • 耕地占用税和契税什么时候交
  • 体检合同属于什么合同
  • 营改增后房屋出租税率
  • 零售超豪华小汽车交消费税吗
  • 如何确定旧机器的折旧年限?
  • 业务招待费怎么调整应纳税所得额
  • 年数总和折旧计算方法
  • 消防安装工程会计核算
  • 公司给员工发工资用途怎么写
  • 适用增值税简易计税的项目
  • 餐厨垃圾处理有哪些设备
  • 个人所得税应纳税额计算表图片
  • 英雄联盟电脑软件图片
  • 购买半成品计入什么科目
  • 电器维修公司买什么保险
  • 劳务费个税扣税
  • 要约与要约邀请的主要区别
  • 公司收到的应收股利需要分配利润吗
  • u深度u盘启动盘制作工具官网
  • 住房公积金余额查询
  • steam怎么退款申请退款要多久
  • realshed.exe - realshed是什么进程 有什么用
  • php的数组函数
  • uniapp怎么运行到手机模拟器
  • 承包安装工程怎么报价
  • canvas画线条
  • 手写发票可以报税吗
  • vue springboot
  • Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)
  • 计提和发放工资金额不一致
  • 私人帐户可以转账给对公账户吗
  • 个税由公司承担怎么计算工资
  • 工商营业执照年检网上怎么年检
  • 修改数据库为多个数据
  • 公积金由个人全部交,单位违法吗法吗
  • 企业清算未分配利润怎么个税
  • 在建工程里面的费用最后怎样结转
  • 城市综合配套
  • 企业内部银行转账怎么记账
  • 公司员工抽奖活动
  • 总账建账要遵循的原则
  • 零售商品销售的具体核算步骤
  • mysql写错了怎么结束
  • c盘的windows
  • 中兴新支点操作系统安装教程
  • centos文档
  • VirtualBox安装64位系统报错的处理方法
  • SIMETER.EXE - SIMETER是什么进程 有什么用
  • win10系统中怎么设置搜狗输入
  • Lesson02_04 表单标签(2)
  • eclipse从本地导入项目
  • javascript常用语法
  • content provider
  • jquery中哪个属性判断按钮是否被选择?
  • python 中 range
  • linux shutdown命令详解
  • js实现聊天框
  • 什么是出口退税政策
  • 江阴市税务局电话号码
  • 非房地产企业土地增值税清算
  • 农副产品批发价
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设