react 09之状态管理工具1 redux+ react-thunk的使用实现跨组件状态管理与异步操作

news2025/1/11 15:54:05

目录

  • react 09之状态管理工具1 redux+ react-thunk的使用实现跨组件状态管理与异步操作
    • store / index.js store的入口文件
    • index.js 在项目入口文件 引入
    • store / actionType.js 定义action的唯一标识
    • store / reducers / index.js
    • store / actions / form.js
    • store / reducers / form.js
    • store / actions / list.js
    • store / reducers / list.js
    • 使用 App类.jsx
    • ASon.jsx
    • 效果

react 09之状态管理工具1 redux+ react-thunk的使用实现跨组件状态管理与异步操作

  • npm install redux react-redux

  • npm i redux-thunk

  • redux-thunk

    • redux-thunk是一个Redux的中间件,它允许你在Redux中编写异步的action creators。

store / index.js store的入口文件

import { applyMiddleware, legacy_createStore } from 'redux';
// 引入redux-thunk,用于支持异步action
import reduxThunk from 'redux-thunk';
// 引入汇总后的reducer
import reducers from './reducers';

const store = legacy_createStore(reducers, applyMiddleware(reduxThunk))
export default store;

index.js 在项目入口文件 引入

import App from "./7redux/2使用thunk/App类";
import store from "./store/index.js";
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <Provider store={store}>
        <App />
    </Provider>
);

store / actionType.js 定义action的唯一标识

// 常量 唯一标识 标记当前action的唯一性
export const FORM_ADD_COUNT = 'form_addCount'
export const FORM_SUB_COUNT = 'form_subCount'
export const LIST_ADD_LIST = 'list_addList'

store / reducers / index.js

/*
	该文件用于汇总所有的reducer为一个总的reducer
*/
//引入combineReducers,用于汇总多个reducer
import { combineReducers } from "redux";
//引入为form组件服务的reducer
import form from "./form";
//引入为list组件服务的reducer
import list from "./list";

//汇总所有的reducer变为一个总的reducer
export default combineReducers({
  form,
  list,
});

store / actions / form.js

/*
	该文件专门为Form组件生成相关action对象
*/
import { FORM_ADD_COUNT, FORM_SUB_COUNT } from "../actionType";

export const form_addCount = (data) => ({ type: FORM_ADD_COUNT, data });
export const form_subCount = (data) => ({ type: FORM_SUB_COUNT, data });

export const formAddAsync = (data) => {
  return (dispatch) => {
    setTimeout(() => {
      dispatch(form_addCount(data));
    }, 2000);
  };
};

store / reducers / form.js

import { FORM_ADD_COUNT, FORM_SUB_COUNT } from "../actionType";
/**
 * form组件的reducer
 */
// 初始状态
let initSate = {
  count: 0
};
export default function formReducer(state = initSate, action) {
  switch (action.type) {
    case FORM_ADD_COUNT:
      return {
        ...state,
        count: state.count + 1
      }
    case FORM_SUB_COUNT:
      return {
        ...state,
        count: state.count - 1
      }
    default:
      return state;
  }
}

store / actions / list.js

/*
	该文件专门为List组件生成相关action对象
*/
import { LIST_ADD_LIST } from "../actionType";

// 同步action
export const list_addList = (data) => ({ type: LIST_ADD_LIST, data });

store / reducers / list.js

import { LIST_ADD_LIST } from '../actionType'

// 初始状态
const initSate = {
    list:[]
}

export default function listReducer(state=initSate,action){
    switch(action.type){
        case LIST_ADD_LIST:
            return {...state,list:[...state.list,action.data]}
        default:
            return state
    }
}

使用 App类.jsx

import React, { Component } from 'react';
import { connect } from "react-redux";
import { formAddAsync, form_addCount, form_subCount } from "../../store/actions/form";
import { list_addList } from "../../store/actions/list";
import ASon from "./ASon";
class App extends Component {
 state = {
 }
 componentDidMount() {}
 render(){
  // console.log('111',this.props);
  const { count,list } = this.props
  const addList = ()=>{
    let str = list && list.length ? '我是' + (list.length + 1) : '我是1'
    let arr = []
    arr.push(str)
    this.props.list_addList(arr)
  }
   return (
     <div>
      app
      <p>Count: {count}</p>
         <button onClick={this.props.form_addCount}>Increment</button>
         <button onClick={this.props.form_subCount}>Decrement</button>
         <button onClick={this.props.formAddAsync}>异步add</button>
         <div>----</div>
         <ASon></ASon>
         <div>----</div>
         <div>
          {
            list ? list.map((item,idx)=>{
              return (
                <div key={idx}>
                  {item}
                </div>
              )
            }) : ''
          }
         <button onClick={addList}>addList</button>
         </div>
     </div>
   )
 }
}

// 拿到redux的值
const mapStateToProps = (state) => {
  return {
    count: state.form.count,
    list: state.list.list,
  };
};
// 拿到redux 所触发的
const mapDispatchToProps = {
  form_addCount,
  form_subCount,
  formAddAsync,
  list_addList
}
export default connect(mapStateToProps, mapDispatchToProps)(App);

ASon.jsx

import React from 'react';
import { connect } from "react-redux";
import { form_addCount } from "../../store/actions/form";
const ASon = (props) => {
    return (
        <div className='content'>
          ASon 组件 count-{props.count} <br/>
          <button onClick={props.form_addCount}>Increment</button>
        </div>
    )
}

// 拿到redux的值
const mapStateToProps = (state) => {
  return {
    count: state.form.count
  };
};
// 拿到redux 所触发的
const mapDispatchToProps = {
  form_addCount,
}
export default connect(mapStateToProps, mapDispatchToProps)(ASon);

效果

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

关于PMP中的敏捷知识

在此次改版中&#xff0c;题目中增加了大量的敏捷题型&#xff0c;总体比重仍然很高&#xff0c;据我的主观感觉&#xff0c;达到了1/3。与ACP认证相比&#xff0c;PMP对敏捷管理技术的考察相对简单&#xff0c;考察路径也较为集中&#xff0c;主要聚焦于以下两个方面&#xff…

Python-OpenCV中的图像处理-图像特征

Python-OpenCV中的图像处理-图像特征 图像特征Harris角点检测亚像素级精度的角点检测Shi-Tomasi角点检测SIFT(Scale-Invariant Feature Transfrom)SURF(Speeded-Up Robust Features) 图像特征 特征理解特征检测特征描述 Harris角点检测 cv2.cornerHarris(img, blockSize, ks…

Nodejs 第十一章(CSR SSR SEO)

概述 在上一章的时候我们说过在node环境中无法操作DOM 和 BOM&#xff0c;但是如果非要操作DOM 和 BOM 也是可以的我们需要使用第三方库帮助我们jsdom npm i jsdomjsdom 是一个模拟浏览器环境的库&#xff0c;可以在 Node.js 中使用 DOM API 简单案例 const fs require(no…

mfc140u.dll丢失的解决方法-mfc140u.dll是什么文件

在使用计算机过程中&#xff0c;我们经常会遇到各种错误提示和问题&#xff0c;其中一个常见的问题是与mfc140u.dll文件有关的错误。mfc140u.dll是Microsoft Foundation Classes(MFC)的一个动态链接库文件&#xff0c;它提供了许多用于开发Windows应用程序的函数和类。 当mfc1…

不同模块之间解决service层与dao层无法注入的问题

方法一(建议): 方法一是导入其它模块的dao层与service层完成自动注解的问题 方法二: 指定扫码哦基础包,不推荐该方法额原因是因为扫描这么多包 而且每个模块的配置类之间可能存在冲突

CSDN热榜分析:来看看热榜都在写什么

文章目录 数据爬取词云制作滤除停用词 数据爬取 热榜地址是https://blog.csdn.net/rank/list&#xff0c;先进去再说 from selenium import webdriver from selenium.webdriver.common.by import By url https://blog.csdn.net/rank/list driver webdriver.Edge() driver.g…

Java8函数式编程

ISBN: 978-7-115-38488-1 作者&#xff1a;【英】Richard Warburton 页数&#xff1a;132页 阅读时间&#xff1a;2023-08-05 推荐指数&#xff1a;★★★★★ 练习项目&#xff1a;https://github.com/RichardWarburton/java-8-lambdas-exercises 虽然这本书出版于2014年&…

LCP 44.开幕式焰火

目录 一、题目 二、代码 一、题目 二、代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:static i…

UG NX二次开发(C++)-PK函数创建一条圆弧曲线

文章目录 1、前言2、创建一个项目3、添加头文件4、在do_it中添加创建圆曲线的源代码5、调用dll6、再创建一个长方体验证1、前言 采用PK进行UG NX二次开发,现在看到的文章很多是直接创建实体,然后在UG NX的视图区显示出来,对于创建圆曲线的文章不多,本文讲一下PK函数创建圆…

安卓逆向 - Frida Hook(抓包实践)

一、引言 上篇文章&#xff1a;安卓逆向 - 基础入门教程_小馒头yy的博客-CSDN博客 介绍了Frida的安装、基本使用&#xff0c;今天我们来看看Frida常用Hook和基于Frida抓包实践。 二、Frida常用 Hook脚本 1、hook java.net.URL function hook1() {var URL Java.use(java.n…

POI处理excel,根据XLOOKUP发现部分公式格式不支持问题

poi4不支持XLOOKUP函数&#xff0c;但poi最新的5.2.3却已经对此函数做了支持 poi下载地址&#xff1a;Index of /dist/poi/release/bin 公式源码位置&#xff1a;org/apache/poi/ss/formula/atp/XLookupFunction.java 但是在使用此函数过程中&#xff0c;发现有些XLOOKUP函数会…

基于Java+SpringBoot+Vue前后端分离仓库管理系统详细设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

JSON字符串转换

大家好 , 我是苏麟 , 今天带来一个JSON序列化库 Gson . GitHub 地址 : GitHub - google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back java 中 json 序列化库有很多&#xff1a; gson (谷歌的) fastjson (阿里的) jack…

numba 入门示例

一维向量求和&#xff1a; C A B 在有nv 近几年gpu的ubuntu 机器上&#xff0c; 环境预备&#xff1a; conda create -name numba_cuda_python3.10 python3.10 conda activate numba_cuda_python3.10conda install numba conda install cudatoolkit conda install -c nvi…

Java多线程编程中的线程控制:挂起、停止和恢复

Java 线程控制&#xff1a;挂起、停止和恢复 在多线程编程中&#xff0c;对线程进行控制是非常重要的&#xff0c;可以通过挂起、停止和恢复线程来实现对线程的管理。本文将介绍如何使用Java提供的方法对线程进行挂起、停止和恢复操作&#xff0c;以及需要注意的安全性和替代方…

最强自动化测试框架Playwright (27)-跟踪查看器

Playwright Trace Viewer 是一个 GUI 工具&#xff0c;可帮助您在脚本运行后探索记录的 Playwright 跟踪。可以本地打开&#xff0c;也可以在trace.playwright.dev.打开&#xff0c; 录制跟踪文件 使用context.tracing.start进行录制&#xff0c;使用stop方法保存录制文件 b…

【mysql算法】在数据库中储存树形结构

【mysql&算法】在数据库中储存树形结构 【一】常见的使用树的场景【二】方式一&#xff1a;邻接表&#xff08;1&#xff09;方法介绍&#xff08;2&#xff09;优点&#xff08;3&#xff09;缺点&#xff08;4&#xff09;实现案例&#xff1a;生成菜单树结构 【三】方式…

盒子阴影效果与环绕阴影

box-shadow 在前端样式里面&#xff0c;最常见的一中效果之一就是阴影&#xff0c;好的阴影可以瞬间给人一种高端的用户体验&#xff0c;今天简单总结下这个样式的语法与使用方法。 语法 box-shadow的语法其实是比较简单好记的&#xff0c;我们按照最全面的写法来看 x轴偏移…

社区团购商城拼团秒杀接龙分销团长小程序开源版开发

社区团购商城拼团秒杀接龙分销团长小程序开源版开发 功能介绍&#xff1a; 商品管理&#xff1a;增加商品-商品列表-商品分类-商品单/多规格-商品标签 订单管理&#xff1a;订单列表-订单挑选-订单导出-订单打印-批量发货-商品评价 会员管理&#xff1a;会员列表-会员挑选-会员…

1. 基于UDP的TFTP文件传输上传下载完整版本

1&#xff09;tftp协议概述 简单文件传输协议&#xff0c;适用于在网络上进行文件传输的一套标准协议&#xff0c;使用UDP传输 特点&#xff1a; 是应用层协议 基于UDP协议实现 数据传输模式 octet&#xff1a;二进制模式&#xff08;常用&#xff09; mail&#xff1a;…