react18中react-thunk实现公共数据仓库的异步操作

reduxreact-redux都只能实现数据的同步修改更新,有点类似于vue中的mutation,只能做同步操作,异步的话不用actions来实现。由于在项目始终不可避免要实现的异步数据的更新,这明显不够用了。是时候引入我们的异步中间件redux-thunk

实现效果

请添加图片描述

代码实现

  • 安装redux-thunk
npm i redux-thunk
  • store/index.js
import { createStore, applyMiddleware, compose } from "redux";
import { combineReducers } from "redux-immutable";
import { thunk } from "redux-thunk";

import { CounterReducer } from "./CounterReducer";

const reducers = combineReducers({
  count: CounterReducer,
});
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

const store = createStore(reducers, composeEnhancers(applyMiddleware(thunk)));

export default store;
  • CounterReducer.js
    封装了两个异步方法,模拟数据的异步获取,然后导出供其他组件使用
import { fromJS } from "immutable";
const initialState = fromJS({
  counter: 0,
  userInfo: {
    name: "John Doe",
    age: 25,
  },
});
function CounterReducer(state = initialState, action) {
  console.log("🚀 ~ CounterReducer ~ action:", action);
  switch (action.type) {
    case "ADD":
      return state.update("counter", (val) => {
        return val + 1;
      });
    case "ADD_TWO":
      return state.update("counter", (val) => {
        return val + 2;
      });
    case "DEC":
      return state.update("counter", (val) => val - 1);
    case "DEC_TWO":
      return state.update("counter", (val) => val - 2);
    case "CHANGE_NAME":
      return state.setIn(["userInfo", "name"], action.payload);
    default:
      return state;
  }
}

// async action 2s later
function handleDelayAdd() {
  return (dispatch) => {
  // 模拟异步接口
    setTimeout(() => dispatch({ type: "ADD_TWO" }), 2000);
  };
}

// async action 2s later
function handleDelayReduce() {
  return (dispatch) => {
  // 模拟异步接口
    setTimeout(() => dispatch({ type: "DEC_TWO" }), 2000);
  };
}

export { CounterReducer, handleDelayAdd, handleDelayReduce };
  • DemoB.js
    引入两个异步的方法,注意跟同步的dispatch使用方法有点区别,dispatch(handleDelayAdd())dispatch直接调用了该方法
import { useSelector, useDispatch } from "react-redux";
import { Button, Space, Divider } from "antd";
import { handleDelayAdd, handleDelayReduce } from "../../store/CounterReducer";
function DemoB() {
  const count = useSelector((state) => state.getIn(["count", "counter"]));
  const userInfo = useSelector((state) => state.getIn(["count", "userInfo"]));
  const dispatch = useDispatch();
  return (
    <div>
      <p>Demo B</p>
      <div>
        <Space split={<Divider />}>
          <span>name: {userInfo.get("name")}</span>
          <span>age: {userInfo.get("age")}</span>
          <span>count:{count}</span>
        </Space>
      </div>
      <Space>
        <Button type="primary" onClick={() => dispatch({ type: "ADD" })}>
          add count
        </Button>
        <Button type="primary" danger onClick={() => dispatch({ type: "DEC" })}>
          minus count
        </Button>
        <Button type="primary" onClick={() => dispatch(handleDelayAdd())}>
          delay 2s add count
        </Button>
        <Button
          type="primary"
          danger
          onClick={() => dispatch(handleDelayReduce())}
        >
          delay 2s minus count
        </Button>
        <Button
          type="dashed"
          danger
          onClick={() => dispatch({ type: "CHANGE_NAME", payload: "张学友" })}
        >
          change name
        </Button>
      </Space>
    </div>
  );
}
export default DemoB;

这样我们就实现了在react项目中数据的异步更新。整体还是比较简单的。

总结

在这个具有副作用的action中,我们可以看出,函数内部可能极为复杂。如果需要为每一个异步操作都如此定义一个action,显然action不易维护。

action不易维护的原因:

  • action的形式不统一
  • 就是异步操作太为分散,分散在了各个action中

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机组成原理笔记9(指令系统,立即寻址,直接寻址,间接寻址.....)

指令操作码 操作码的位数决定了不同功能指令的多少&#xff0c;位数越多&#xff0c;所能表示的操作功能就越丰富。指令的操作码通常有两种编码格式&#xff1a; 定长操作码 定长操作码对于简化硬件设计&#xff0c;减少指令译码时间非常有利&#xff0c;例如IBM370指令系统&a…

Matlab 火焰识别技术

课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用&#xff0c;森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数&#xff0c;造成重大的损失。如果有一款监测软件&#xff0c;从硬件处获得的图像中监测是否有火焰&#xff0c;从而报警&#xff0…

uv: 一个统一的Python包管理工具

uv是由Astral公司开发的一个极其快速的Python包管理器,完全用Rust编写。它最初在2月份发布,作为pip工作流的替代品。现在,uv已经扩展成为一个端到端的解决方案,可以管理Python项目、命令行工具、单文件脚本,甚至Python本身。可以说,uv就像是Python界的Cargo:一个快速、可靠、易…

XQT_UI 组件|03 |加载组件 XQtLoading

XQtLoading 使用文档 简介 XQtLoading 是一个自定义的加载动画组件&#xff0c;旨在为用户提供可配置的旋转花瓣动画效果。它可以在应用程序中用于指示加载状态&#xff0c;提升用户体验。 特征 可配置性&#xff1a;用户可以根据需求调整旋转周期、缩放周期、最大/最小缩放…

置换环模板题E - Permute K times 2

输入样本 1 6 3 5 6 3 1 2 4样本输出 1 6 1 3 2 4 5每次操作后&#xff0c; P P P 都会发生如下变化&#xff1a; 第一次操作后&#xff0c; P P P 为 ( 2 , 4 , 3 , 5 , 6 , 1 ) (2,4,3,5,6,1) (2,4,3,5,6,1) 。第二次操作后&#xff0c; P P P 为 ( 4 , 5 , 3 , 6 , …

溪源飨提高免疫力治未病:硒+辅酶Q10强力组合

上周我和女友在亲友的见证下举行了庄重的订婚仪式。我和女友是经朋友介绍才认识的&#xff0c;认识时间并不算长。第一次见面&#xff0c;彼此就被对方深深地吸引了&#xff0c;真可谓一见钟情。我喜欢她那恬静的美&#xff0c;难以忘怀她那散发着迷人气息的双眸&#xff1b;她…

CMakeLists.txt 编写规则

目录 1. 注释 1.1 注释行 1.2 注释块 2. CMakeLists.txt的编写 2.1 同意目录下的源文件 2.2 SET指令 2.3 file和aux_source_directory 2.4 包含头文件 2.5 生成动态库和静态库 2.6 链接库文件 2.7 message指令 2.8 移除操作 2.9 find_library和find_package 3. 常…

【瑞吉外卖】-day01

目录 前言 第一天项目启动 获取资料 创建项目 ​编辑 连接本地数据库 连接数据库 修改用户名和密码 ​编辑创建表 创建启动类来进行测试 导入前端页面 创建项目所需目录 检查登录功能 登录界面 登录成功 登录失败 代码 退出功能 易错点 前言 尝试一下企业级项…

部署DNS主从服务器

一。DNS主从服务器作用&#xff1a; DNS作为重要的互联网基础设施服务&#xff0c;保证DNS域名解析服务的正常运转至关重要&#xff0c;只有这样才能提供稳定、快速日不间断的域名查询服务 DNS 域名解析服务中&#xff0c;从服务器可以从主服务器上获取指定的区域数据文件&…

基于Multisim的单双声道音频功率放大电路设计与仿真

1.额定输出功率≥5W&#xff08;fi1KHz,Ui100mV&#xff09; 2.频率响应范围150Hz&#xff5e;13KHz 3.高、低音频端提升或衰减3dB 链接&#xff1a;https://pan.baidu.com/s/1exsBJoXdkb-gPr1IkxNvDg 提取码&#xff1a;jh5j

技术分享 | 大语言模型增强灰盒模糊测试技术探索

大语言模型凭借其庞大的参数规模&#xff0c;能够通过无监督学习从海量文本中获取知识&#xff0c;从而不仅能够深刻理解文本语义&#xff0c;还能准确识别文本的格式和结构。凭借对不同数据结构的深度理解&#xff0c;大语言模型已在众多领域得到广泛应用。其中&#xff0c;尤…

【Vue3】第三篇

Vue3学习第三篇 01. 组件组成02. 组件嵌套关系03. 组件注册方式04. 组件传递数据Props05. 组件传递多种数据类型06. 组件传递Props校验07. 组件事件08. 组件事件配合v-model使用09. 组件数据传递10. 透传Attributes 01. 组件组成 在vue当中&#xff0c;组件是最重要的知识&…

移动开发(五):.NET MAUI中自定义主题设置

目录 一、.NET MAUI主题设置原理 二、.NET MAUI主题设置案例 2.1 创建主题文件 2.2 修改App.xaml 文件 2.3 设置默认主题的三种方式 2.4 通过按钮切换主题 三、.NET MAUI主题设置技巧 四、总结 今天给大家分享.NET MAUI应用中如何自定义主题&#xff0c;提升APP本身个性…

Redis 单机、主从、哨兵和集群架构详解和搭建

目录 前言 单机部署 检查安装 gcc 环境 下载安装 Redis 启动 Redis 关闭 Redis 配置Redis 主从部署 整体架构图 主从复制配置 重启 Redis 验证 主从复制的作⽤ 主从复制缺点 哨兵部署&#xff08;Sentinel&#xff09; 整体架构图 哨兵模式配置 启动哨兵 验证…

Axure简单进度条制作,原型文件可下载

1.先看效果 2.需要用到的主要元件 a动态面板遮挡进度条左侧部分 b进度条底色背景 c百分比数字 3.将进度条、背景、百分比数字设置为隐藏 4.为按钮【选择文件】添加事件&#xff0c;并显示相应的原件 显示进度条process向右侧滑动 5.设置百分比数字及显示时每25毫秒加1 如…

html----图片按钮,商品展示

源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图标</title><style>.box{width:…

MFC的SendMessage与PostMessage的区别

一、SendMessage 同步操作&#xff1a; SendMessage 是一个同步函数&#xff0c;它会将消息发送到指定的窗口&#xff0c;并等待该窗口的消息处理过程完成&#xff0c;然后返回。这意味着它会阻塞当前线程&#xff0c;直到消息处理完成。 直接调用&#xff1a; SendMessage 会…

解决Redis缓存击穿(互斥锁、逻辑过期)

文章目录 背景代码实现前置实体类常量类工具类结果返回类控制层 互斥锁方案逻辑过期方案 背景 缓存击穿也叫热点 Key 问题&#xff0c;就是一个被高并发访问并且缓存重建业务较复杂的 key 突然失效了&#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击 常见的解决方案…

详细解读 CVPR2024:VideoBooth: Diffusion-based Video Generation with Image Prompts

Diffusion Models专栏文章汇总:入门与实战 前言:今天是程序员节,先祝大家节日快乐!文本驱动的视频生成正在迅速取得进展。然而,仅仅使用文本提示并不足以准确反映用户意图,特别是对于定制内容的创建。个性化图片领域已经非常成功了,但是在视频个性化领域才刚刚起步,这篇…

10.28.2024刷华为OD C题型

文章目录 HJ9HJ10HJ11HJ13HJ17 HJ9 HJ10 HJ11 HJ13 HJ17