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

  • qq怎么加入黑名单(qq怎么加入黑名单 但不删除)

    qq怎么加入黑名单(qq怎么加入黑名单 但不删除)

  • qq怎么取消被赞动画(qq如何取消赞我的人)

    qq怎么取消被赞动画(qq如何取消赞我的人)

  • 硬盘不读盘怎么修复(硬盘不读盘怎么解决是不是坏了)

    硬盘不读盘怎么修复(硬盘不读盘怎么解决是不是坏了)

  • switch底座怎么充电(switch底座怎么充手柄)

    switch底座怎么充电(switch底座怎么充手柄)

  • 云计算技术的服务类型分为(云计算技术的服务模式有哪些)

    云计算技术的服务类型分为(云计算技术的服务模式有哪些)

  • 微信显示对方无法接收(微信显示对方无法接收消息是什么意思)

    微信显示对方无法接收(微信显示对方无法接收消息是什么意思)

  • 画图字体怎么调横竖(画图如何调整字体大小)

    画图字体怎么调横竖(画图如何调整字体大小)

  • 华为mate30的悬浮球在哪里设置(华为mate30的悬浮窗怎么设置)

    华为mate30的悬浮球在哪里设置(华为mate30的悬浮窗怎么设置)

  • 手机如何设置流量短信提醒(手机如何设置流量定时关闭)

    手机如何设置流量短信提醒(手机如何设置流量定时关闭)

  • vivos1充电速度(vivos10充电速度)

    vivos1充电速度(vivos10充电速度)

  • breeno语音怎么卸载(breeno语音图标怎么关闭)

    breeno语音怎么卸载(breeno语音图标怎么关闭)

  • 淘宝会员截图在哪(淘宝会员码截图怎么弄)

    淘宝会员截图在哪(淘宝会员码截图怎么弄)

  • 苹果xs处理器是什么型号(苹果XS处理器是多少)

    苹果xs处理器是什么型号(苹果XS处理器是多少)

  • 手机淘宝怎么没有红包签到(手机淘宝怎么没有我的工具)

    手机淘宝怎么没有红包签到(手机淘宝怎么没有我的工具)

  • vivoz5x多重(vivoz5x多重多少克)

    vivoz5x多重(vivoz5x多重多少克)

  • wps云空间已满怎么删除(wps云空间已满怎么删除后电脑上的文件会删除吗)

    wps云空间已满怎么删除(wps云空间已满怎么删除后电脑上的文件会删除吗)

  • 电脑的用户名和密码怎么查看(电脑的用户名和ip怎么查)

    电脑的用户名和密码怎么查看(电脑的用户名和ip怎么查)

  • 谷歌浏览器如何截屏(谷歌浏览器如何设置中文简体)

    谷歌浏览器如何截屏(谷歌浏览器如何设置中文简体)

  • 陌陌被拉黑了发信息还能收到么(陌陌被拉黑发动态对方还能看到吗)

    陌陌被拉黑了发信息还能收到么(陌陌被拉黑发动态对方还能看到吗)

  • win10桌面一片空白(win10桌面一片空白怎么恢复左侧有一栏)

    win10桌面一片空白(win10桌面一片空白怎么恢复左侧有一栏)

  • 又一款Windows11要来,微软 Win11 SE 版本曝光(现在windows11)

    又一款Windows11要来,微软 Win11 SE 版本曝光(现在windows11)

  • FONTVIEW.EXE是什么进程 作用是什么 FONTVIEW进程查询(fontpackages-filesystem)

    FONTVIEW.EXE是什么进程 作用是什么 FONTVIEW进程查询(fontpackages-filesystem)

  • 刷题日常计~JS①(刷题是啥意思啊)

    刷题日常计~JS①(刷题是啥意思啊)

  • 印花税税源明细表怎么填
  • 销项税额是指
  • 支付的工会经费现金流量项目是什么?
  • 社保公积金计提是本月计提下月
  • 分公司可以参股其他公司吗
  • 金融服务征税范围包括哪些
  • 开发票税前税后
  • 企业所得税查增值税吗
  • 增值税普通发票可以抵扣吗
  • 现金支票存根如何填写
  • 往年预付账款错了,应如何调?
  • 公司如何向税务部门举报
  • 兼营免税减税项目
  • 7.1增值税普通发票怎么开?
  • 无形资产盘盈
  • 法人给公司基本户打款
  • 普通发票单张限额
  • 长期股权投资采用成本法核算,被投资单位实现的净利润
  • 车位销售代理合同
  • 全年一次性奖金计税方式2023
  • 如何测试网络延迟
  • 农业生产用水水资源税
  • 固定资产不入账是谁的责任
  • 授课培训公司免责协议
  • 法人车无偿给公司使用合法吗
  • 如何防御黑客入侵
  • linux系统文件压缩命令
  • linux安装linux
  • 苹果macOS 11开发者预览版发布
  • 我告诉你windows7旗舰版
  • 科尼西卡神庙在哪里
  • 政府会计制度下财务会计包含几要素
  • 理财收益如何计税
  • 利息发票如何做账务处理
  • 库存现金清零
  • 民间非营利组织如何纳税
  • split命令用法
  • 无形资产的转让
  • 年末应交税费怎么算
  • 发票收件人信息
  • 购进小汽车自用为什么可以抵扣进项税
  • 研发企业所得税税率
  • 融资租赁有免租金吗
  • mybatis拦截器执行顺序
  • 公司设计费会计分录
  • 纳税人可以享受六项专项附加扣除
  • 一个人可以做多个担保人吗
  • 个体工商户税收新政策
  • 出售捐赠物资
  • 未付工程款范围内承担
  • 收到国税退税收怎么做账
  • 代开发票预缴税款的比例是多少呢?
  • 外出参加会议费用怎么做账
  • 未开票收入如何记账
  • 兼职人员属于雇佣人吗
  • 资金结存属于资产类吗
  • 小微企业增值税起征点是多少
  • 单位车辆保险费
  • 领导出差差旅费怎么报销
  • 净利润和毛利润的区别公式
  • 新公司成立建账流程
  • 工业企业进项税和销项税均为17%
  • mysql5.7.21安装
  • bios设置光盘启动图解
  • win7怎么把桌面图标显示出来
  • 软件无法卸载怎么办,安装的软件卸载不了怎么办
  • linux带桌面
  • win7语言栏不见了 各种方法都试过了
  • win10一年更新一次
  • win8电脑wifi功能消失了
  • cocos2d android 游戏开发学习——CCAction(一)
  • JavaScript中的NaN代表什么
  • 如何用dos命令删除程序
  • js兼容ie
  • js无限极分类
  • 湖南增值税普通发票查询系统官网
  • 家庭农场有什么用途
  • 消费税申报流程图
  • 四川税控
  • 统一社会信用代码有什么用
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设