位置: 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怎么登不上去了)(秦腔的代表人物)

  • iqoo8pro分辨率怎么调(vivo iqoo pro 分辨率)

    iqoo8pro分辨率怎么调(vivo iqoo pro 分辨率)

  • 荣耀x10指纹解锁方式是什么(荣耀x10指纹解锁怎么没有了)

    荣耀x10指纹解锁方式是什么(荣耀x10指纹解锁怎么没有了)

  • AirPods连不上macbook(AirPods连不上手机)

    AirPods连不上macbook(AirPods连不上手机)

  • cpu加法运算是由什么完成的(cpu加法器工作原理)

    cpu加法运算是由什么完成的(cpu加法器工作原理)

  • 拼多多商家提现规则?(拼多多商家提现提不了怎么回事)

    拼多多商家提现规则?(拼多多商家提现提不了怎么回事)

  • 照片打不开显示内存已满(照片打不开显示内存不足)

    照片打不开显示内存已满(照片打不开显示内存不足)

  • p40能不能无线充电(p40能无线充电么)

    p40能不能无线充电(p40能无线充电么)

  • iPhone11边玩边充电伤电池吗(苹果11边充边玩会爆炸吗)

    iPhone11边玩边充电伤电池吗(苹果11边充边玩会爆炸吗)

  • 已停机的号码怎么恢复(已停机的号码怎么查询电话号码)

    已停机的号码怎么恢复(已停机的号码怎么查询电话号码)

  • 电话停机多久会被注销(电话停机多久会空号)

    电话停机多久会被注销(电话停机多久会空号)

  • win10翻盖自动开机(win10翻盖自动开机怎么取消)

    win10翻盖自动开机(win10翻盖自动开机怎么取消)

  • 抖音极速版不能私信吗(抖音极速版不能发布作品吗)

    抖音极速版不能私信吗(抖音极速版不能发布作品吗)

  • 在window7中回收站是(在win 7中回收站是什么区域)

    在window7中回收站是(在win 7中回收站是什么区域)

  • 苹果手机怎么屏蔽广告短信(苹果手机怎么屏幕不旋转)

    苹果手机怎么屏蔽广告短信(苹果手机怎么屏幕不旋转)

  • 手机如何将繁体字换成简体(手机如何将繁体字转化为简体字)

    手机如何将繁体字换成简体(手机如何将繁体字转化为简体字)

  • 小米9se具备防水吗(小米9se是否防水)

    小米9se具备防水吗(小米9se是否防水)

  • 华为p30pro电话卡从哪装(华为p30pro电话卡怎么插)

    华为p30pro电话卡从哪装(华为p30pro电话卡怎么插)

  • CAD图形界限怎么取消(cad图形界限怎么设置)

    CAD图形界限怎么取消(cad图形界限怎么设置)

  • 开了移动数据不能上网(开移动数据不用会变少吗)

    开了移动数据不能上网(开移动数据不用会变少吗)

  • 苹果7home键按着咯吱响(苹果7home键按着清脆响)

    苹果7home键按着咯吱响(苹果7home键按着清脆响)

  • 苹果账户设置页(苹果账户设置页取消订阅服务)

    苹果账户设置页(苹果账户设置页取消订阅服务)

  • 借条和欠条的区别,分辩不好让你损失惨重(借条和欠条的区别 法律效力)

    借条和欠条的区别,分辩不好让你损失惨重(借条和欠条的区别 法律效力)

  • 【GoF 23】23种设计模式与OOP七大原则概述

    【GoF 23】23种设计模式与OOP七大原则概述

  • 非居民企业享受协定待遇
  • 研发费用加计扣除是什么意思啊
  • 一般风险准备是留存收益吗
  • 购买金税盘维护费会计分录
  • 收到扶贫款怎么做会计分录
  • 分期收款方式确认销售收入
  • 发票未到暂估账务处理
  • 上期留抵税额会计分录
  • 冲红发票怎么写备注
  • 购买金蝶软件多少钱
  • 企业发生的技术转让费应计入
  • 购买增值税专用发票罪
  • 外商投资企业啥意思
  • 票据背书转让常见的错误
  • 兼营行为的税务处理办法
  • 直系亲属之间转账要交税吗
  • 增值税申报和开票不一致怎么做账
  • 收到电费发票做账摘要怎么写
  • 调整交易性金融资产
  • 企业计提短期借款利息费用应贷记的会计科目是
  • 外汇风险管理的贸易融资法
  • 公司和个人大额往来怎么办
  • 公司一般根据什么裁员
  • 小微企业从业人数包括
  • 银票贴现需要发票嘛
  • 公司股权转让协议标准范本
  • 出口转内销的销项税怎么计算
  • 如何编制固定资产折旧计算表
  • linux如何用root用户登录
  • 企业销售应如何做
  • 企业所得税汇算清缴会计分录
  • 有关预收账款的说法正确的是
  • 增值税务发票怎么作废
  • php后端技术栈
  • php数据导出到excel
  • 伦索伊斯马拉赫塞斯国家公园
  • 水青冈是常绿还是落叶
  • 结转工资费用
  • 一般纳税人收到小规模专票怎么抵扣
  • 累计摊销属于什么类科目
  • 以银行存款支付业务招待费
  • 腾讯产品面经
  • php知识点汇总与解答
  • 买商品赠送赠品怎么做账
  • 银行利息增值税发票
  • 个税申报本期收入是填应发还是实发
  • phpcms怎么样
  • 避税的形式
  • 固定资产处置的净收入计入
  • 分公司是否能开劳务发票
  • 专用发票什么意思
  • 如何提取十位数
  • 加计扣除所得税怎么算
  • 计提本月应交增值税
  • 预存返现活动规则
  • 未支付房租怎么做账
  • 理财利息计入什么科目
  • 房地产企业如何结转成本
  • 异地预缴增值税多交了怎么办,可以退吗
  • 投资收益科目在利润表中怎么填
  • 小微企业a201010表怎么填
  • 账面价值,账面净值,账面余额三者的区别
  • win7旗舰版系统激活码
  • xp磁盘检测命令
  • 宏基aspire s3适用固态硬盘
  • win7设置路由器上网
  • linux发布项目
  • 电脑照片应用使用不了
  • jquery 瀑布流
  • android view动画
  • jquery教程w3school
  • promise实例方法
  • unity shaderlab新手宝典
  • python里!
  • linux运行nginx
  • JavaScript+html5 canvas实现图片破碎重组动画特效
  • 你真的了解摩羯座吗
  • 安卓模拟器测试
  • Python的装饰器用法学习笔记
  • 2023车船税收费价格表图片
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设