位置: 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旅游网页设计)

  • swf文件怎么打开(如何打开swf文件怎么打开)

    swf文件怎么打开(如何打开swf文件怎么打开)

  • qq浮屏如何取消(qq悬浮怎么关闭)

    qq浮屏如何取消(qq悬浮怎么关闭)

  • vivoy93是哪年的(vivoy93是哪年上市的)

    vivoy93是哪年的(vivoy93是哪年上市的)

  • 抖音作品隐藏会限流吗(抖音作品隐藏会不会影响播放量)

    抖音作品隐藏会限流吗(抖音作品隐藏会不会影响播放量)

  • 无损音乐有必要吗(无损音乐有什么好处)

    无损音乐有必要吗(无损音乐有什么好处)

  • 联想笔记本关机快捷键(联想笔记本关机后电源灯闪烁)

    联想笔记本关机快捷键(联想笔记本关机后电源灯闪烁)

  • 抖音火苗是怎么来的(抖音火苗怎么兑换)

    抖音火苗是怎么来的(抖音火苗怎么兑换)

  • 葡萄视频下载的视频在哪里(葡萄视频在哪儿下载)

    葡萄视频下载的视频在哪里(葡萄视频在哪儿下载)

  • vivo手机怎样把即刻天气添加到桌面(vivo手机怎样把游戏隐藏起来)

    vivo手机怎样把即刻天气添加到桌面(vivo手机怎样把游戏隐藏起来)

  • acin接口是什么意思(ac接口是什么意思)

    acin接口是什么意思(ac接口是什么意思)

  • 苹果云备份有必要开吗(苹果云备份有必要开启吗)

    苹果云备份有必要开吗(苹果云备份有必要开启吗)

  • 华为手机出厂有贴膜吗(华为手机出厂有瑕疵)

    华为手机出厂有贴膜吗(华为手机出厂有瑕疵)

  • 苹果11演示机和正常机区别(苹果演示机和官换机哪个好)

    苹果11演示机和正常机区别(苹果演示机和官换机哪个好)

  • 华为mate30支持无线充电么(华为mate30支持无线充电怎么充)

    华为mate30支持无线充电么(华为mate30支持无线充电怎么充)

  • 苹果6开不了机怎么办啊(苹果6开不了机怎么解决)

    苹果6开不了机怎么办啊(苹果6开不了机怎么解决)

  • 手机qq群怎么发公告(手机qq群怎么发群文件)

    手机qq群怎么发公告(手机qq群怎么发群文件)

  • 单下划线怎么设置(怎么设置单线条下划线边框)

    单下划线怎么设置(怎么设置单线条下划线边框)

  • 怎么删除抖音里的作品(怎么删除抖音里的收藏)

    怎么删除抖音里的作品(怎么删除抖音里的收藏)

  • 为什么苹果id头像显示不出来(为什么苹果ID头像加载不出来)

    为什么苹果id头像显示不出来(为什么苹果ID头像加载不出来)

  • 苹果怎么锁定后台(iphone如何锁定)

    苹果怎么锁定后台(iphone如何锁定)

  • 抖音里边的大头视频怎么拍的?(抖音里面的大头贴在哪)

    抖音里边的大头视频怎么拍的?(抖音里面的大头贴在哪)

  • 华为蓝牙耳机设置在哪(华为蓝牙耳机设备已复位请开启运动健康)

    华为蓝牙耳机设置在哪(华为蓝牙耳机设备已复位请开启运动健康)

  • qq怎么设置陌生人不可以发信息(qq怎么设置陌生人不可以看空间)

    qq怎么设置陌生人不可以发信息(qq怎么设置陌生人不可以看空间)

  • Windows11激活密钥/激活码/序列号分享 附激活工具(windows11激活密钥多少钱)

    Windows11激活密钥/激活码/序列号分享 附激活工具(windows11激活密钥多少钱)

  • 第四季新星计划即将开启,博客之星取消拉票你怎么看?(新星计划片头好可爱啊)

    第四季新星计划即将开启,博客之星取消拉票你怎么看?(新星计划片头好可爱啊)

  • 契税印花税会计怎么做账务处理
  • 公司端午礼盒
  • 月初领票后还能作废申报吗
  • 销项税现金流量指定
  • 资产损失税前扣除
  • 固定资产原价的结余额
  • 材料成本会计的主要内容
  • 有支出没有发票应怎么整改
  • 营业外支出结转损益
  • 商场交的质保金做什么会计科目?
  • 营改增后小规模纳税人所得税
  • 国税是负税需要缴税吗
  • 第三方支付模式的交流流程
  • 进口商品合同
  • 建筑成本百分比如何确定?
  • 环评费用计入哪个会计科目
  • 异地项目预缴个人所得税
  • linux虚拟机怎么输入中文
  • 计算土地增值税时契税可以扣除吗
  • 合同作废印花税法规定
  • 股票溢价净收入计入
  • 在windows7中用来存放硬盘中被删除的文件或文件夹的是
  • 防伪税控开票系统技术维护费
  • 加班餐费税前扣除问题
  • 如何把itunes的音乐导入ipod
  • 计提房租记什么科目
  • 退货 会计
  • 自创商誉可确认为商誉且在资产负债表中列报
  • 拉马克是哪国人
  • php远程下载图片
  • 什么是动态表单
  • 浅谈php中其他类的使用
  • phpcrawl
  • java使用循环结构输出九九乘法表
  • deformable detr代码
  • 集团公司如何收管理费
  • 开具农产品收购发票需要什么资料
  • python中input转换
  • 发票退票和废票的区别
  • 如何访问一台网络上的电脑
  • 资产负债表中的货币资金包括哪些
  • 无形资产出售当月是否摊销
  • 旅游业营改增会计分录
  • 企业汇总纳税的原则
  • 存货发出的计价方式有哪些
  • 一般纳税人注销公司麻烦吗
  • 个人开发者要缴税吗
  • 医生规培补助
  • 发票金额与付款金额不一致情况说明
  • 项目回款是什么意思
  • 返利开红字发票怎么做账
  • mysql查询分组后 组内数据
  • Linux环境mysql5.7.12安装教程
  • mysql查询慢的优化方案
  • 神州战神bios怎么进
  • linux怎么用命令
  • linux给root权限
  • win10的ghost
  • 注册表.bak
  • 怎么设置pe系统
  • linux日期与时间
  • win8应用商店怎么卸载
  • 联想笔记本win7装win10
  • win10盘符怎么看
  • 安卓软件集
  • ubuntu重新安装网卡驱动
  • angularjs4
  • python爬虫框架怎么画
  • vue cli mock
  • js中的div标签怎么用
  • 深入探讨英文
  • Android调用系统摄像头
  • jQuery基本选择器总结
  • jquery知识点总结
  • 成品油消费税税目
  • 河北国家税务局官网站
  • 税收优惠政策有哪些企业
  • 买车购置税去哪里交钱
  • 优化营商环境关于人才工作
  • 法治税务示范基地枫桥
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设