Redux中进行异步操作(网络请求)的方案

news2025/2/28 6:25:42

文章目录

      • Redux中的异步操作
        • 组件中进行异步操作
        • redux中进行异步操作

Redux中的异步操作

在之前简单的案例中,redux中保存的counter是一个本地定义的数据

我们可以直接通过同步的操作来dispatch action,state就会被立即更新。

但是真实开发中,redux中保存的很多数据可能来自服务器,我们需要进行异步的请求,再将数据保存到redux中。

在之前学习网络请求的时候我们讲过,发生网络请求我们有两种方案, 可以直接在组件的钩子函数中发送网络请求, 再将数据存放到store中; 也可以直接在store中发生网络请求


组件中进行异步操作

网络请求可以在class组件的生命周期函数componentDidMount中发送,所以我们可以有这样的结构:

在这里插入图片描述

我现在完成如下案例操作:

创建一个组件Category, 在该组件中发送网络请求, 获取banners和recommends的数据;

在About组件中展示banners和recommends的数据;

首先需要创建要派发的action, 以及对应的reducer

// store/actionCreators.jsx

import { CHANGE_BANNERS, CHANGE_RECOMMENDS } from "./constants"

export const changeBannersAction = (banners) => ({
  type: CHANGE_BANNERS,
  banners
})
export const changeRecommendsAction = (recommends) => ({
  type: CHANGE_RECOMMENDS,
  recommends
})
// store/reducer.jsx

import { CHANGE_BANNERS, CHANGE_RECOMMENDS } from "./constants"

const initialState = {
  banners: [],
  recommends: []
}

export default function reducer(state = initialState, action) {
  switch(action.type) {
    case CHANGE_BANNERS:
      return {...state, [banners: action.banners}
    case CHANGE_RECOMMENDS:
      return {...state, recommends: action.recommends}
    default: 
      return state
  }
}

在Categroy组件中发送网络请求, 并将store中的banners和recommends修改为网络请求后的数据

import React, { PureComponent } from 'react'
import axios from 'axios'
import { connect } from 'react-redux'
import { changeBannersAction, changeRecommendsAction } from '../store/actionCreators'

export class Category extends PureComponent {

  componentDidMount() {
    // 发送网络请求, 获取到banners和recommends数据
    axios.get("http://123.207.32.32:8000/home/multidata").then(res => {
      const banners = res.data.data.banner.list
      const recommends = res.data.data.recommend.list
      console.log(banners, recommends)

      // 调用映射过来的方法, 修改banners和recommends 
      this.props.changeBanners(banners)
      this.props.changeRecommends(recommends)
    })
  }

  render() {
    return (
      <div>Category</div>
    )
  }
}

// 映射方法用于修改store中的banners和recommends
const mapDispatchToProps = (dispatch) => ({
  changeBanners(banners) {
    dispatch(changeBannersAction(banners))
  },
  changeRecommends(recommends) {
    dispatch(changeRecommendsAction(recommends))
  }
})

export default connect(null, mapDispatchToProps)(Category)

目前, store中存放的就是网络请求获取到的数据, 接下来就在About页面进行展示

import React, { PureComponent } from 'react'
import { connect } from 'react-redux'

export class About extends PureComponent {

  render() {
    // 在props中获取到映射过来的数据
    const { banners, recommends } = this.props

    return (
      <div>
        <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.banners,
  recommends: state.recommends
})

// 表示将数据映射到About组件中
export default connect(mapStateToProps)(About)

redux中进行异步操作

上面的代码有一个缺陷:

我们必须将网络请求的异步代码放到组件的生命周期中来完成;

事实上,网络请求到的数据也属于我们状态管理的一部分,更好的一种方式应该是将其也交给redux来管理;

在这里插入图片描述

但是在redux中如何可以进行异步的操作呢?

答案就是使用中间件(Middleware), 如果学习过Express或Koa框架的小伙伴对中间件的概念一定不陌生;

由于在正常情况下, store.dispatch()只能派发一个对象, 不能派发函数; 如果dispatch想要派发函数, 我们必须要使用中间件对该store进行增强

使用中间件, 在redux中发送网络请求

首先安装redux-thunk库, 引入中间件

安装redux-thunk库: npm i redux-thunk, 在该库中有一个中间件thunk, 如下方式应用thunk中间件

import { createStore, applyMiddleware } from "redux";
import reducer from "./reducer";
// 导入中间件
import thunk from "redux-thunk";

// 应用中间件
const store = createStore(reducer, applyMiddleware(thunk))

export default store

应用之后, store.dispatch()就可以派发函数了

// 定义一个返回函数的action
export const fetchHomeMultidataAction = () => {
  function foo() {
    console.log("aaa")
  }

  return foo
}
// 派发action
const mapDispatchToProps = (dispatch) => ({
  fetchHomeMultidata() {
    // 派发一个函数, 内部返回的函数自动执行
    dispatch(fetchHomeMultidataAction())
  }
})

自动执行action中的返回的函数时, 会传给这个函数一个dispatch函数和getState函数;

dispatch函数: 用于我们之后再次派发action;

getState函数: 考虑到我们之后的一些操作需要依赖原来的状态,调用getState函数可以让我们可以获取之前的一些状态;

我们就可以在返回的该函数中, 编写异步的网络请求相关代码

import axios from "axios"

export const changeBannersAction = (banners) => ({
  type: CHANGE_BANNERS,
  banners
})
export const changeRecommendsAction = (recommends) => ({
  type: CHANGE_RECOMMENDS,
  recommends
})

export const fetchHomeMultidataAction = () => {
  // 派发时返回的该函数自动执行, 且传入两个参数dispatch, getState
  return (dispatch, getState) => {
    axios.get("http://123.207.32.32:8000/home/multidata").then(res => {
      const banners = res.data.data.banner.list
      const recommends = res.data.data.recommend.list

      // 获取到数据后在派发action
      dispatch(changeBannersAction(banners))
      dispatch(changeRecommendsAction(recommends))
    })
  }
}

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

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

相关文章

Vue3 项目创建

安装 1、安装node vue 3需要node10以上版本 node官网下载地址以往的版本 | Node.js 2、安装vue/cli 如果已经全局安装过旧版本的vue-cli npm uninstall vue-cli -g //yarn global remove vue-cli 然后安装 npm install -g vue/cli //yarn global add vue/cli 为什…

使用vue,实现前端导入excel数据

文章目录 前言一、引入组件二、封装导入功能的组件 1.编写组件template2.获取数据3.调用接口把数据传给后端三、总结前言 继前边的vue的导出功能后&#xff0c;自己又去在网上搜了vue导入excel一些文章&#xff0c;自己通过对代码的整理和调整&#xff0c;实现了vue导入excel的…

Vue3报错:Property “xxx“ was accessed during render but is not defined on instance.

Vue3报错&#xff1a;Property “xxx” was accessed during render but is not defined on instance. 翻译&#xff1a;属性“xxx”在呈现期间被访问&#xff0c;但没有在实例上定义。 其实就是在模板上有&#xff0c;但是在script上没有定义 很多同学跟说这不是报错&#…

Vue2-基础知识

目录 一.vue简介 1.概念 2.特性 (1)数据驱动视图 (2)双向数据绑定 3.MVVM 4.基本使用步骤 5.调试工具 二.vue基础 1.指令 (1)内容渲染指令 (2)属性绑定指令 (3)事件绑定指令 (4)双向绑定指令 ​编辑(5)条件渲染指令 (6)列表渲染指令 2.过滤器 (1)概念 (2)分…

HTML5设计注册/登录界面

学习目标&#xff1a; 掌握 HTML5入门知识掌握 CSS入门知识学习内容&#xff1a; 掌握 HTML5基本语法掌握CSS基本语法HTML5网页设计掌握块级标签掌握行内标签表单的使用方法iput常用属性学习时间&#xff1a; 周一至周五早上 7 点—晚上9点周六上午 9 点-晚上9点周日下午 3 …

Redux的基本使用过程详解

文章目录Redux的使用过程Redux测试项目的搭建Redux的基本使用步骤Redux目录的结构划分React的三大原则Redux的使用过程 Redux测试项目的搭建 1.创建一个新的项目文件夹:learn-redux # 执行初始化操作 npm init -y或yarn init -y # 安装redux:npm install redux --save或yarn …

Tomcat使用教程(超详细)

文章目录Tomcat学习笔记1、Tomcat概述2、Tomcat的基本使用2.1 基本操作2.1.1 安装2.1.2 卸载2.1.3 配置2.1.4 启动2.1.5 部署2.1.6 关闭3、IDEA中使用Maven创建Web项目3.0 Web项目目录结构介绍3.1 使用骨架创建Web项目3.2 直接创建web项目4、Web项目部署4.1 集成本地的Tomcat4.…

别找了诸位 【十二款超级好用的谷歌插件都在这】(确定不来看看?)

目录 &#x1f30c;前言&#xff1a; &#x1f307;第一款、油猴插件 &#x1f307;第二款、Adblock Plus - 免费的广告拦截器 &#x1f307;第三款、谷歌清理大师&#xff08;CleanMaster&#xff09; &#x1f307;第四款、google翻译 &#x1f307;第五款、OneTab &a…

vue的双击事件(dbclick的使用)

双击事件(dblclick) vue事件中基于点击事件&#xff0c;有一个双击事件&#xff0c;通过dblclick事件触发。 语言&#xff1a;vue3/Ts 函数库&#xff1a;vueuse 1、需求分析 双击事件触发&#xff1b; 在双击时隐藏对应文字元素&#xff1b; 展示输入框&#xff1b; 输入…

Vue系列之插槽(slot)详解

文章の目录1、什么是插槽了2、插槽的分类3、默认插槽的使用3.1、语法3.2、示例4、具名插槽的使用4.1、什么是具名插槽4.2、语法4.3、示例4.4、缩写5、作用域插槽的使用5.1、什么是作用域插槽了5.2、语法5.3、示例6、动态插槽名6.1、什么是动态插槽名6.2、示例写在最后Vue 版本&…

Node.js | 从前端到全栈的必经之路

&#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;即将大三的学生&#xff0c;一个不甘平庸的平凡人&#x1f36c; &#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三…

在uni-app中使用手机号一键登录

1、首先需要在dcloud开发者控制台开通一键登录 https://dev.dcloud.net.cn/uniLogin 开通一键登录服务, 获取关键最关键的两个参数 ApiKey 和 ApiSecret 真机调试无需添加应用&#xff0c;如需打包使用请添加。一键登录应用ID为离线打包时配置的appid 2、登录云服务空间&#x…

HTML零基础入门教程(详细)

首先我们先介绍一下网页&#xff1a; 网页时构成网站的基本元素&#xff0c;它通常由图片&#xff0c;链接&#xff0c;文字&#xff0c;声音&#xff0c;视频等元素组成。通常我们看到的网页&#xff0c;常见以.htm或.html后缀结尾的文件&#xff0c;因此我们把它俗称为HTML文…

webpack看这一篇就够了

文章目录今日学习目标1. webpack基本概念webpack能做什么2. webpack的基本使用2.0 创建项目2.1 解决多次引入资源文件2.2 webpack使用2.3_webpack 更新打包3. webpack的配置3.0_webpack-入口和出口3.1_打包流程图3.2_插件-自动生成html文件3.3_mode模式3.3_webpack开发服务器-为…

微信小程序转uniapp的迁移步骤及遇到的问题

目录 前言 一、迁移步骤 第一步:安装miniprogram-to-uniapp 插件 第二步:查看是否安装成功 第三步:使用插件进行转换

vue实现input输入模糊查询(三种方式)

vue实现input输入模糊查询(三种方式) 目录 vue实现input输入模糊查询(三种方式) 1 计算属性实现模糊查询 演示&#xff1a; 2 watch 监听实现模糊查询 3 通过按钮点击实现模糊查询 演示&#xff1a; 1 计算属性实现模糊查询 vue 中通过计算属性实现模糊查询,创建 html …

微信小程序面试题大全(持续更新)

1.请谈谈微信小程序主要目录和文件的作用&#xff1f; project.config.json&#xff1a;项目配置文件&#xff0c;用的最多的就是配置是否开启https校验App.js&#xff1a;设置一些全局的基础数据等App.json&#xff1a;底部tab&#xff0c;标题栏和路由等设置App.wxss&#x…

呕心沥血 JavaScript知识点梳理大全,超详细 建议收藏!!!

呕心沥血 JavaScript知识点梳理大全&#xff0c;超详细 建议收藏&#xff01;&#xff01;&#xff01; ✴️大家好,我是王同学&#xff0c;爆肝三天三夜王同学把JavaScript 知识点梳理了一遍&#xff0c;文章没有一点套路&#xff0c;只有满满的干货 ✴️如果对你有帮助就给我…

vite.config.js配置-解决跨域问题,以及@vitejs/plugin-vue等报错

开发环境 在配置的过程中踩了很多坑&#xff0c;还是太菜&#xff0c;有些东西弄不明白什么意思。 运行项目时的报错可直接到最下面看vite.config.js文件的注释 目前项目用到的模块并不多&#xff0c;package.json文件如下 {"name": "PsWebV3Abb",&quo…

Vue vue.config.js 的详解与配置

Vue vue.config.js 的详解与配置 1. 为什么要配置 vue.config.js 由于 vue-cli 3 也学习了 rollup 的零配置思路&#xff0c;所以项目初始化后&#xff0c;没有了以前熟悉的 build 目录&#xff0c;也就没有了 webpack.base.config.js、webpack.dev.config.js 、webpack.prod…