react学习——26react-redux实现求和案例(完整版)

1、目录结构
在这里插入图片描述
2、components/count/index.js

import React, {Component} from "react";
export default class Count extends Component {//加法increment=()=>{const {value} = this.selectNumthis.props.jia(Number(value))}//减法decrement=()=>{const {value} = this.selectNumthis.props.jian(Number(value))}//奇数加incrementIfOdd=()=>{const {value} = this.selectNumconst {count} = this.propsif(count%2!==0) {this.props.jia(Number(value))}}//异步加incrementAsync=()=>{const {value} = this.selectNumthis.props.jiaAsync(Number(value),500)}render(){console.log('UI组件接收到的props是',this.props)return(<div><h1>当前求和为:{this.props.count}</h1><select ref={(c)=>this.selectNum=c}><option value="1">1</option><option value="2">2</option><option value='3'>3</option></select>&nbsp;<button onClick={this.increment}>+</button>&nbsp;<button onClick={this.decrement}>-</button>&nbsp;<button onClick={this.incrementIfOdd}>当前求和为奇数在加</button>&nbsp;<button onClick={this.incrementAsync}>异步加</button>&nbsp;</div>);}
}

3、containers/Count/index.js

//引入Count的UI组件
import CountUI from '../../components/Count'
import {createIncrementAction, createDecrementAction, createIncrementAsyncAction} from '../../redux/count_action'
//引入conect用于链接UI组件与redux
import {connect} from 'react-redux'
//mapStateToProps函数的返回的对象中的key就作为传递给组件的props的key,value就作为传递给组件的props的value----状态
function mapStateToProps(state){return {count:state}
}
function mapDispatchToProps(dispatch){return {jia:data=>dispatch(createIncrementAction(data)),jian:data=>dispatch(createDecrementAction(data)),jiaAsync:(data,time)=>dispatch(createIncrementAsyncAction(data,time))}
}
//使用connect()()创建
export default connect(mapStateToProps,mapDispatchToProps)(CountUI)

4、redux/constant.js

/*该模块用于定义状态管理的常量名称,目的只有一个:便于管理的同时,防止程序员单词拼写错误
*/
export const INCREMENT = 'increment'
export const DECREMENT = 'decrement'

redux/count_action.js

/*该文件专门为Count组件生成action对象*/
import {INCREMENT,DECREMENT} from './constant'
import store from "./store";
// function createIncrementAction(data){
//     return {type:'increment',data}
// }
export const createIncrementAction = data=>({type:INCREMENT,data})
// function createDecrementAction(data){
//     return {type:'decrement',data}
// }
//同步action,就是形参为data,返回值为action对象
export const createDecrementAction = data=>({type:DECREMENT,data})// export default {
//     createIncrementAction,
//     createDecrementAction
// }
//所谓的异步action,就是指action的值为函数,异步action中一般都会调用同步action,异步action不是必须要用的
export const createIncrementAsyncAction = (data,time)=>{return ()=>{setTimeout(()=>{//通知reduxstore.dispatch(createIncrementAction(data))},time)}
}

redux/count_reducer.js

/*1.该文件是用于创建一个为count服务的reducer,reducer的本质就是一个函数2.reducer函数会接到两个参数,分别为:之前的状态(preState),动作对象(action)
*/
import {INCREMENT,DECREMENT} from "./constant";
const initState = 0
export default function countReducer(preState=initState,action) {console.log('countReducer',preState,action)const {type,data} = action// 根据type决定如何加工数据switch (type){case INCREMENT:console.log('@')return preState + datacase DECREMENT:return preState - datadefault:return preState}
}

redux/store.js

/*该文件专门用于创建一个为Count组件服务的store对象*/
//引入createStore,专门创建redux中最为核心的store对象
import {createStore,applyMiddleware} from 'redux'
//引入cunter.redux.js文件
import countReducer from './count_reducer'
//引入redux-thunk用于支持异步action
import {thunk} from 'redux-thunk'
//暴露store
export default createStore(countReducer,applyMiddleware(thunk))

5、src/App.js

import React, {Component} from "react";
import Count from "./containers/Count";
//引入store
import store from "./redux/store";
export default class App extends Component {render(){return(<div><Count store={store}></Count></div>);}
}

src/index.js

import React from "react";
import ReactDOM from 'react-dom'
import App from './App'
import store from './redux/store'
ReactDOM.render(<App/>,document.getElementById('root'))
//监测redux状态变化
store.subscribe(()=>{ReactDOM.render(<App/>,document.getElementById('root'))
})

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

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

相关文章

一场夏测杀出个“双冠王”,极越01成为纯电SUV标杆

文 | AUTO芯球 作者 | 雷慢 万万没想到&#xff0c;懂车帝夏测运动会杀出一匹最大的黑马&#xff0c;竟然是极越01。 当前正在进行的懂车帝夏测运动会&#xff0c;在“纯电SUV/MPV续航达成率”赛事中&#xff0c;极越01以85.8%的续航达成率获得第一名。并且由于赛制规则限制…

应力 (Stress) 是指单位面积上所承受的力

应力 (Stress) 是指单位面积上所承受的力 flyfish 轴向力 轴向力 (Axial Force) 是指沿着物体的纵轴施加的力。对于一根杆或柱子&#xff0c;轴向力可以是拉力或压力&#xff0c;具体取决于力的方向。 拉力 (Tensile Force)&#xff1a;使物体拉长的力。 压力 (Compressive…

Vue中实现在线画流程图实现

概述 最近在调研一些在线文档的实现&#xff0c;包括文档编辑器、在线思维导图、在线流程图等&#xff0c;前面的文章基于语雀编辑器的在线文档编辑与查看实现了文档编辑器。在本文&#xff0c;分享在Vue框架下基于metaeditor-mxgraph实现在线流程图。 实现效果 实现 1. 添加…

LabVIEW开发CAN总线多传感器液位检测系统

设计并实现了一个基于CAN总线和LabVIEW的多传感器液位检测系统。该系统利用STM32F107单片机进行模拟信号与数字信号的转换&#xff0c;通过TJA1050实现CAN总线通信&#xff0c;并使用USB-CAN分析仪连接PC。LabVIEW用于数据采集、人机交互界面的设计、数据分析和仪器标定。系统能…

Paimon下载使用和基础操作说明

简介 Apache Paimon 是一种湖格式&#xff0c;支持使用 Flink 和 Spark 构建实时湖仓一体架构 用于流式处理和批处理操作。Paimon创新性地将湖格式与LSM&#xff08;Log-structured merge-tree&#xff09;相结合 结构&#xff0c;将实时流式更新引入 Lake 架构。 Paimon提供以…

05_TypeScript 中的数据类型

TypeScript 中的数据类型 一、概述二、详解布尔类型&#xff08;boolean&#xff09; true / false数字类型&#xff08;number&#xff09;字符串类型&#xff08;string&#xff09;数组类型&#xff08;array&#xff09;元组类型&#xff08;tuple&#xff09; 属于数组的一…

linux高级编程(网络)

数据的封包和拆包 封包&#xff1a; 应用层数据&#xff08;例如HTTP请求&#xff09;被传递给传输层。传输层&#xff08;TCP&#xff09;在数据前添加TCP头部&#xff08;包含端口号、序列号等&#xff09;。网络层&#xff08;IP&#xff09;在TCP段前添加IP头部&#xff…

C#Winform窗体中嵌入exe文件

1&#xff0c;效果以嵌入Modbus Slave为例&#xff1a; 2&#xff0c;代码&#xff1a; public partial class Form1 : Form{//设置嵌入exe的常量private const int nIndex -16;private const int dwNewLong 0x10000000;Process m_AppProcess;public Form1(){InitializeCompo…

Python爬虫-requests模块

前戏: 1.你是否在夜深人静的时候&#xff0c;想看一些会让你更睡不着的图片却苦于没有资源... 2.你是否在节假日出行高峰的时候&#xff0c;想快速抢购火车票成功..。 3.你是否在网上购物的时候&#xff0c;想快速且精准的定位到口碑质量最好的商品. …

VIM模式之间的切换

命令行界面下&#xff0c;常用的文本编辑器是 VI / VIM(VI增强版)&#xff0c;VI 是 Linux 最通用的文本编辑器&#xff0c;VIM相较于VI&#xff0c;提供了代码高亮等功能&#xff0c;两者用法完全兼容&#xff1b; 1. 进入 VIM 工作界面 vim 文件名 2. 进入编辑模式 三种方…

modern C++:闭包与匿名函数

最近放假在写一个小项目&#xff0c;用到了闭包和匿名函数的知识&#xff0c;记录一下 What&#xff1f; 匿名函数&#xff1a;匿名函数&#xff08;英语&#xff1a;Anonymous Function&#xff09;在计算机编程中是指一类无需定义标识符&#xff08;函数名&#xff09;的函数…

ENSP中OSPF配置

题目 划分网段&#xff0c;配置ip OSPF配置按照区域划分&#xff0c;这个网段也要按照区域个数划分&#xff0c;如这一题&#xff0c;分成两个区域&#xff0c;所以将192.168.1.0/24划分先为两个网段&#xff0c;然后在具体的划分区域中的网段。 以交换机为中心的三条线属于一…

go语言小练习——基于goroutine实现的Tcp聊天室

前言 博主最近没怎么写go&#xff0c;最近正好放暑假&#xff0c;写了一个小demo来复习一下&#xff0c;源码会放在资源了&#xff0c;大家按需取用。 服务端 package mainimport ("bufio""fmt""github.com/sirupsen/logrus""net"&…

爬虫学习前记----Python

引言 1.语言&#xff1a;python 2.学习资源&#xff1a;【Python爬虫】 3.爬虫日记&#xff1a; python内容 1.字符串输出 (1)引号问题 print("python") 输出&#xff1a;pythonprint(python) 输出&#xff1a;pythonprint(python"学习") 输出&…

[Qt] Qt Creator中,新建QT文件时选择界面模版下的各选项

在Qt Creator中&#xff0c;新建文件时选择界面模版下的各选项具有特定的意义&#xff0c;这些选项主要帮助开发者根据项目需求快速生成不同类型的文件。以下是对这些选项的详细解释&#xff1a; 0. Qt Item Model 意义&#xff1a;列表模型是Qt中用于表示和操作数据的强大抽…

C++多态中的构造函数和析构函数

常见问题 构造函数可以是虚函数吗&#xff1f; 答&#xff1a;构造函数不可以是虚函数。 原因&#xff1a; 构造对象时必须知道对象的实际类型&#xff0c;但是虚函数调用在运行时才能确定对象的实际类型&#xff0c;这会导致编译器无法确定对象的具体类型。 虚函数的执行依赖于…

Android 使用 Debug.startMethodTracing 分析方法耗时

参考 Generate Trace Logs by Instrumenting Your App 官网提供了 trace 工具来分析方法耗时。 生成 trace 文件 package com.test.luodemo.trace;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.os.Debug; import android.uti…

实体类:JavaBean

文章目录 什么是实体类&#xff1f;满足要求应用场景 什么是实体类&#xff1f; 就是仅仅只用来保存数据的Java类有getter setter 方法&#xff0c;就只能用它来存取数据 满足要求 成员变量都是private都有getter setter方法类中必须有public的无参构造函数 应用场景 实体…

js vue table单元格合并

实现效果 关键代码 <table classtable table-bordered><thead><tr><th>检测项目</th><th>详细说明</th><th>检测结果</th><th>检测说明</th></tr></thead><tbody><tr ng-repeatrow in…