当前位置: 首页 > news >正文

react笔记:redux

redux状态管理

安装redux:num i redux

新建redux文件夹:

  • store.js
  • count_reducer.js 
  • count_action.js    
  • constant.js          (常量)
1. store.js文件:
// 该文件专门用于暴露一个store对象,整个应用只有一个store对象
// 引入createStore,专门用于创建redux中最为核心的store对象
import {createStore} from 'redux'
// 引入为count组件服务的reducer
import countReducer from './content_reducer'
//暴露创建的reducer
export default createStore(countReducer)
2.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(preState)const {type,data}=actionswitch (type){case INCREMENT:return preState+datacase DECREMENT:return preState-datadefault:return preState}
}
3.count_action.js文件:
// 该文件撞门为count组件生成action对象
import {INCREMENT,DECREMENT} from './constant'export const createIncrementAction=data=>({type:INCREMENT,data})
export const createDecrementAction=data=>({type:DECREMENT,data})

这里是下面函数的箭头函数的简写:函数返回一个对象

 export function createDecrementAction(data){return {type:DECREMENT,data}
}

写成箭头函数:函数调用后要返回一个对象,需要在对象外包一个括号的写法,就会返回一个对象,否则{}会默认当作函数体处理。-----如: ({type:INCREMENT,data})

4.constant.js文件
// 该模块是用于定义action对象中type类型的常量值
export const INCREMENT='increment'
export const DECREMENT='decrement'
 count组件中:
import React, { Component } from 'react'
import store from '../../redux/store'
import {createIncrementAction,createDecrementAction} from '../../redux/count_action'
export default class index extends Component {componentDidMount(){// 检测redux中的状态的变化,只要变化,就调用renderstore.subscribe(()=>{this.setState({})})}// 加increment=()=>{const {value}=this.selectNumberstore.dispatch(createIncrementAction(value*1))}// 减decrement=()=>{const {value}=this.selectNumberstore.dispatch(createDecrementAction(value*1))}// 奇数加incrementIfOdd=()=>{const {value}=this.selectNumberconst count=store.getState()if(count%2!==0){store.dispatch({type:'increment',data:value*1})}}// 异步加incrementAsync=()=>{const {value}=this.selectNumbersetTimeout(() => {store.dispatch({type:'increment',data:value*1})}, 500);}render() {return (<div><h1>当前求和为:{store.getState()}</h1><select ref={c=>this.selectNumber=c}><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button onClick={this.increment}>+</button><button onClick={this.decrement}>-</button><button onClick={this.incrementIfOdd}>当前求和为奇数再加</button><button onClick={this.incrementAsync}>异步加</button></div>)}
}
关于redux和视图更新:

修改store中的数据并不会触发视图更新,要触发视图更新,可以通过在组件内部订阅store的方式更新组件state。

一般更省事的方法是通过在入口文件中包一层订阅:

 

原理是只要store数据有更新,就触发App组件更新,这里react有diff算法,所以应该对性能的损耗不是特别大,所以这种方法也会更省事一点。

异步任务:

如果以下的业务代码异步加需要放到redux中处理,不想在组件内操作,则需要用到异步action:

dispatch一个异步任务action,传入参数值加的值,和异步时间:store.dispatch(createIncrementAsyncAction(value*1,1000))

   // 异步加incrementAsync=()=>{const {value}=this.selectNumber// setTimeout(() => {//     store.dispatch({type:'increment',data:value*1})// }, 500);// 异步任务:store.dispatch(createIncrementAsyncAction(value*1,1000))}

action中定义异步action:

// 异步action,就是指action的值为函数,因为只有在函数内部才能开启定时器等异步操作
export const createIncrementAsyncAction=(data,time)=>{return()=>{setTimeout(() => {store.dispatch({INCREMENT, data})}, time);}
}

这里dispatch部分也可以写成,调用了上面定义的同步任务,返回一个对象:

  store.dispatch(createIncrementAction(data))

 到这里触发异步操作就会报错:

Actions must be plain objects. Instead, the actual type was: 'function'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions.

因为store不能识别异步任务,所以这里要使用异步任务的话还需要一个中间件:redux-thunk

安装: npm i redux-thunk

使用:在store.js文件中导入thunk和applyMiddleware

此时就能执行异步任务了......

最后。可以发现,其实异步action并不是必须的,可以在业务组件中获取数据后再去修改维护store,但是如果需要抽离到action中,就会使用到。 

相关文章:

react笔记:redux

redux状态管理 安装redux&#xff1a;num i redux 新建redux文件夹&#xff1a; store.jscount_reducer.js count_action.js constant.js (常量&#xff09; 1. store.js文件&#xff1a; // 该文件专门用于暴露一个store对象&#xff0c;整个应用只有一个store对…...

数据结构与算法--图的应用

文章目录 回顾提要连通图生成树最小生成树构造最小生成树的算法普里姆(Prim)算法克鲁斯卡尔(Kruskal)算法 最短路径狄杰斯特拉 (Dijkstra) 算法当前最短路径的更新拓扑排序拓扑排序方法拓扑排序示例总结 回顾 图的遍历方法&#xff1a; 深度优先遍历 (DFS)&#xff1a;从任意…...

【leetcode图文详解】特殊数组II : 空间换时间的“记忆化”,越多越好吗?

题目详解 需求&#xff1a;判断给定区间内的元素是否满足“特殊数组”要求 尝试: 暴力求解? 如果试着直接对每个queries中的区间进行检测而不做其他处理&#xff0c;那么最后不出意外地超时了。。 细想优化策略&#xff0c;不难察觉到其中可能存在大量的重复运算 那还等什…...

离线安装prometheus与Grafana实现可视化监控

简介 prometheus 是一个专为云环境设计的开源系统监控和警报工具&#xff0c;它收集并存储多维度的时间序列数据&#xff0c;通过PromQL查询语言提供强大的数据检索能力&#xff0c;并支持可视化及警报功能。而 Grafana 则是一个开源的数据可视化平台&#xff0c;能够与包括Pr…...

【Python学习-UI界面】PyQt5 小部件7-QSpinBox 计数器

样式如下: 一个 QSpinBox 对象向用户呈现一个文本框&#xff0c;右侧有一个上下按钮&#xff0c;显示一个整数。如果按下上下按钮&#xff0c;文本框中的值将增加/减少。 默认情况下&#xff0c;框中的整数从0开始&#xff0c;最高到99&#xff0c;并以步长1变化。对于浮点数…...

[二次元]个人主页搭建

文章目录 域名买一个免费的 框架HexoHexo-Theme-ParticleX Halo 参考 域名 买一个 有钱人玩这个 免费的 github.io 教程在github官方文档有&#xff1b; 框架 Hexo 静态的 Hexo-Theme-ParticleX Argvchsの小窝 Halo 动态的 halo 参考 基于Hexo框架的GitHub个人主页…...

Spring Data JPA 自动创建时间的相关注解和用法

以Springboot项目为例 在实体类上加上注解 EntityListeners(AuditingEntityListener.class)在相应的字段上添加对应的时间注解 LastModifiedDate 和 CreatedDateApplication启动类中添加注解 EnableJpaAuditing...

Java基础之隐式类型转换

类型转换 基本数据类型表示范围大小排序&#xff1a; 在变量赋值及算术运算的过程中&#xff0c;经常会用到数据类型转换&#xff0c;其分为两类&#xff1a; 隐式类型转换 显式类型转换 1 隐式类型转换 情形1&#xff1a;赋值过程中&#xff0c;小数据类型值或变量可以直…...

【数据结构与算法 | 图篇】Dijkstra算法(单源最短路径算法)

1. 前言 由图&#xff1a; 如果我们想要求得节点1到节点5&#xff08;也可以是其他节点&#xff09;的最短路径&#xff0c;我们可以使用Dijkstra算法。 2. 步骤与思路 1. 将所有顶点标记为未访问(顶点类的visited属性设置为false)。创建一个未访问顶点的集合。 2. 为每个顶…...

windows c转linux c要做的事情。

写在开头&#xff1a; 最近的copy项目要转到windows版本了&#xff0c;一直在跟进做这个事情。 直入主题说下移植过程中可能涉及以下几个方面的调整&#xff1a;‌ 编译器和工具链的更改&#xff1a;‌Windows和Linux使用不同的编译器和工具链&#xff0c;‌因此需要在Windo…...

【高等代数笔记】002.高等代数研究对象(二)

1. 高等代数的研究对象 1.4 一元高次方程的求根 a n x n a n − 1 x n − 1 . . . a 1 x a 0 0 a_{n}x^{n}a_{n-1}x^{n-1}...a_{1}xa_{0}0 an​xnan−1​xn−1...a1​xa0​0 等式左边是一元多项式。 所有一元多项式组成的集合称为一元多项式环。...

ubuntu服务器部署的mysql本地连不上的问题

试过了网上的所有方法,都连不上,可以执行: SELECT user, host, plugin FROM mysql.user WHERE user root; 查一下:plungin这个连接插件是不是auth_socket, auth_socket是只能本地连接的插件,需要修改: ALTER USER root% IDENTIFIED WITH mysql_native_password BY your_pass…...

python redis安装

python redis安装 #方法1、 sudo apt-get install redis-server python 支持包&#xff1a; (其实就一个文件&#xff0c;搞过来就能用) sudo apt-get install python-redis #方法2、 sudo pip install redis...

YJ0043定制版抖音电商卷抢购系统带回收商城抖音电商优惠卷投资理财系统

系统是基于逍遥商城二开的系统&#xff0c;pc手机端都新增了邀请码验证 手机端重新定制的UI&#xff0c;前端产品不至于抖音卷也可以自行更改其他产品 用户前端下单&#xff0c;后台订单可以直接回收&#xff0c;后台支持设置默认邀请码和抢卷时间限制...

如何选择图片和视频

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何选择视频文件"相关的内容&#xff0c;本章回中将介绍如何混合选择图片和视频文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…...

html+css网页制作 电商华为商城首页 ui还原度100%

htmlcss网页制作 电商华为商城首页 ui还原度100% 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码…...

EDAS(企业级应用服务)

1 :介绍 1&#xff1a;edas 提供了应用&#xff0c;开发&#xff0c;部署&#xff0c;监控&#xff0c;运维。同时支持 spring cloud, dubbo ,HSF 2:Ali-Tomcat 基于tomcat改造的Servlet容器。支持原有功能&#xff0c;它在启动时会自动加载Pandora&#xff08;潘多拉&#x…...

简单工厂,工厂方法 和 抽象工厂

这三种模式&#xff0c; 都是创建类型的模式&#xff0c; 将对象的创建流程封装起来供客户调用 简单工厂模式 简介: 和策略模式一样&#xff0c;就是针对不通的参数&#xff0c; 返回不通的实例而已 问题: 没有遵循开闭原则&#xff0c; 如果我们想增加一种类&#xff0c; 那…...

python 压力测试脚本

需求&#xff1a; 生成一个12位不重复的随机数将随机数赋值给Json 串中的 orderCode字段将Json用ECB 指定 key为bJXQezYtR4ZSNK4p进行加密并作为值传给{ “data”: “” }设置每秒30个并发持续1分钟调用接口接口输出测试测试报告 代码示例 import json import random import…...

【Linux】多线程7——线程池

1.线程池的概念 1.1.池化技术 池化技术指的是提前准备一些资源&#xff0c;在需要时可以重复使用这些预先准备的资源。 在系统开发过程中&#xff0c;我们经常会用到池化技术。通俗的讲&#xff0c;池化技术就是&#xff1a;把一些资源预先分配好&#xff0c;组织到对象池中…...

基于Claude API的AI应用开发:claude-toolshed框架实战指南

1. 项目概述与核心价值最近在折腾AI应用开发&#xff0c;特别是围绕Claude API构建一些自动化工具时&#xff0c;发现了一个挺有意思的开源项目——aksh-3141/claude-toolshed。这名字直译过来是“Claude的工具棚”&#xff0c;听起来就挺接地气的。简单来说&#xff0c;它不是…...

085、命令行工具开发:argparse模块实战笔记

085、命令行工具开发:argparse模块实战笔记 昨天帮同事调试一个数据清洗脚本,问题出在参数解析上。脚本接收三个输入路径,结果他少传了一个参数,程序直接崩溃报“IndexError”。这种体验太糟糕了——用户不知道哪里错了,也不知道该怎么用。这就是为什么我们需要专业的命令…...

AI代码智能体突破电话验证瓶颈:从环境模拟到混合架构的实战方案

1. 项目概述&#xff1a;当代码智能体遇上“电话验证墙”最近在折腾Claude这类AI代码助手做自动化任务时&#xff0c;我发现一个挺有意思的瓶颈&#xff1a;它们经常在需要电话验证&#xff08;Phone Verification&#xff09;的环节上“卡壳”。这可不是个小问题&#xff0c;想…...

从零到一:DPDK高性能网络开发实战指南

1. 为什么你需要了解DPDK&#xff1f; 如果你正在开发需要处理高吞吐量网络数据的应用&#xff0c;比如视频流服务器、金融交易系统或者云计算平台&#xff0c;传统的Linux网络栈可能会成为性能瓶颈。我亲身经历过一个项目&#xff0c;用传统方式开发的网关每秒只能处理30万包…...

Apache Arrow图像数据处理终极指南:如何构建高性能计算机视觉应用

Apache Arrow图像数据处理终极指南&#xff1a;如何构建高性能计算机视觉应用 【免费下载链接】arrow Apache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing 项目地址: https://gitcode.com/gh_mirrors/arrow13/arrow …...

基于视觉大模型的桌面自动化:Screen Vision技能实现AI操控电脑

1. 项目概述&#xff1a;让AI成为你的“数字双手” 你有没有想过&#xff0c;有一天你可以像指挥一个真人助手一样&#xff0c;用自然语言告诉AI&#xff1a;“帮我把桌面上的那个PDF文件拖到‘已处理’文件夹里”&#xff0c;或者“打开浏览器&#xff0c;搜索一下今天北京的…...

网络虚拟化如何应对100G性能挑战:从SDN/NFV到DPDK与智能网卡的演进

1. 网络虚拟化与100G浪潮&#xff1a;一场正在发生的架构革命如果你在2015年前后从事网络或云计算相关的工作&#xff0c;大概会对一个词印象深刻&#xff1a;100G。当时&#xff0c;行业媒体和厂商都在热烈讨论一个预测——到2018年&#xff0c;100G将成为网络设备&#xff0c…...

MATLAB程序打包成exe后,发给没有MATLAB的同事/客户怎么用?完整部署指南

MATLAB程序打包成EXE后的完整部署指南&#xff1a;让无MATLAB环境的用户也能顺畅运行 当你花费数周时间在MATLAB中打磨出一个完美的算法工具&#xff0c;最终通过mcc命令将其打包成.exe文件时&#xff0c;那种成就感无与伦比。但现实往往给你当头一棒——同事或客户双击这个exe…...

pdf2pptx:三分钟实现LaTeX幻灯片到PowerPoint的无缝转换

pdf2pptx&#xff1a;三分钟实现LaTeX幻灯片到PowerPoint的无缝转换 【免费下载链接】pdf2pptx Convert your (Beamer) PDF slides to (Powerpoint) PPTX 项目地址: https://gitcode.com/gh_mirrors/pd/pdf2pptx 还在为学术演示的格式兼容问题烦恼吗&#xff1f;你是否需…...

对比不同模型在Taotoken平台上的响应速度与输出质量体感

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比不同模型在Taotoken平台上的响应速度与输出质量体感 在开发与创作过程中&#xff0c;我们常常面临一个选择&#xff1a;是追求…...