react笔记:redux

news2024/11/14 13:40:30
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}=action
    switch (type){
        case INCREMENT:
            return preState+data
        case DECREMENT:
            return preState-data
        default:
            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中的状态的变化,只要变化,就调用render
        store.subscribe(()=>{
            this.setState({})
        })
    }
    // 加
    increment=()=>{
      const {value}=this.selectNumber
      store.dispatch(createIncrementAction(value*1))
    }
    // 减
    decrement=()=>{
        const {value}=this.selectNumber
        store.dispatch(createDecrementAction(value*1))
    }
    // 奇数加
    incrementIfOdd=()=>{
        const {value}=this.selectNumber
        const count=store.getState()
        if(count%2!==0){
            store.dispatch({type:'increment',data:value*1})
        }
    }
    // 异步加
    incrementAsync=()=>{
        const {value}=this.selectNumber
        setTimeout(() => {
            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中,就会使用到。 

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

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

相关文章

MyBatis巧用1=0,再鸡肋也得用

一、问题导向 今天在实现文件上传数据库测试中&#xff0c;发现了一个略微容易被问题。虽然业务层可以约束空字符串的传入。但是测试DAO数据层时&#xff0c;被同事发现&#xff0c;说我&#xff1a;“为什么不加10”。 请看问题。 如果用户账号为空&#xff0c;则有分页输出…

在JavaFx中使用StyledLayerDescriptor(SLD)1.0和1.1版本进行地图美化实践

目录 前言 一、最开始的初始世界 1、默认的样式 二、注册事件让地图实现交互 1、绑定事件及注册处理逻辑 三、地图美化&#xff0c;让地图生动起来 1、POM.xml中引入相应的依赖 2、GeoTools加载不同版本的SLD问题 3、加载1.1.0版本的SLD 四、总结 前言 俗话说&#xff…

超简单理解LSTM和GRU模型

目录 参考资料 RNN在反向传播时容易遭受梯度消失的问题&#xff0c;而梯度是用于更新神经网络权重的关键因子&#xff0c;梯度消失描述的是梯度在时间序列反向传播中逐渐减小的情况。 若梯度过小&#xff0c;它对于网络的学习贡献甚微。结果是&#xff0c;在RNN中&#xff0c;梯…

成功的秘诀:客户推荐推动 SaaS 成功的4个原因

在竞争激烈的SaaS市场中&#xff0c;脱颖而出并非易事。客户推荐合作伙伴关系正是这样一种强大的营销渠道&#xff0c;它利用口碑传播的力量&#xff0c;将满意的客户转变为品牌倡导者&#xff0c;从而显著提升品牌信誉和市场影响力。 您的 SaaS 品牌应该接受客户推荐营销的4 …

进 程

1.进程&#xff1a;进行中的程序。 微观串行&#xff0c;宏观并行。 程序的一次执行过程 进程是程序的一个实例 一个程序可以对应一个或多个进程。 2.为什么需要进程&#xff1f; 3.进程的组成部分&#xff1a; 进程 pcb 块 栈|堆|bss|data|text 其中&#xff1a; 家族…

车载测试与分析的利器之CANoe

连接汽车神经网络的专家 CANoe不仅是一款强大的总线分析工具&#xff0c;它还集成了仿真、标定和诊断功能&#xff0c;为汽车工程师提供了全方位的车载网络解决方案。从基础的信号监测到复杂的网络交互测试&#xff0c;CANoe凭借其灵活性和高效性&#xff0c;成为了车载测试工程…

浏览器后门:保护影子 IT 的新前线

浏览器扩展是网络犯罪分子的主要目标。这不仅仅是消费者的问题&#xff0c;也是企业对抗影子 IT 的新领域。 最终&#xff0c;扩展权限越多&#xff0c;攻击面就越大。研究表明&#xff0c;平均每个企业的生态系统中都有近 1500 个浏览器扩展程序 - 即使是一个不良插件也可能导…

线上o2o商城小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 在数字化时代&#xff0c;线上线下融合&#xff08;O2O&#xff09;的商业模式已成为推动零售业发展的新引擎。为了满足商家快速构建高效、便捷、用户友好的电商平台需求&#xff0c;我们精心研发了一款线上O2O商城小程序源码系统。该系统不仅配备了完整的安装代码包…

面向对象编程-多态

一、多态的引入 1、先看一个问题 2、使用传统的方法类解决 class Food:nameNonedef __init__(self,name):self.namenameclass Fish(Food):passclass Bone(Food):passclass Animal:nameNonedef __init__(self,name):self.namenameclass Cat(Animal):passclass Dog(Animal):pas…

STM32F103-固件库开发-keil一些警告解决-中断机制-NVIC-简单按钮电灯流程及其代码;

1、固件库和HAL库 固件库&#xff08;Standard Peripheral Library&#xff0c;通常被称为SPL&#xff09;和HAL库&#xff08;Hardware Abstraction Layer&#xff0c;硬件抽象层&#xff09;都是STMicroelectronics&#xff08;ST&#xff09;为STM32系列微控制器提供的软件…

腾讯云AI代码助手:智能编程的新篇章,大家的代码开发伙伴

文章目录 一、前言二、开发环境介绍三、腾讯云AI代码助手使用实例1、案例一&#xff1a;代码补全2、案例二&#xff1a;代码注释和解释等3、案例三&#xff1a;与AI对话实现需求 四、获得的帮助与提升五、建议六、结语 一、前言 随着人工智能技术的飞速发展&#xff0c;其在各…

SWIPT综述

TS PS Hybrid TSPS ρ 和 α 的最优值以及确定继电器的最优位置可以最小化系统的 OP。 SWIPT CoR with non-linear EH, the hybrid protocol performs better than TSR as well as PSR protocols in terms OP. 波束成形&#xff1a;多天线 SWIPT CoR NETWORKS 多天线系统在 5…

自制神之嘴: fish-speech 容器镜像 (文本转语音 AI 大模型)

穷, 没有 N 卡 ! 穷, 没有 N 卡 ! 穷, 没有 N 卡 !! (重要的事情说 3 遍. ) 最近发现了一个很新的 AI (神经网络) 文本转语音大模型: https://speech.fish.audio/ fish-speech 可以根据输入的文本, 生成高质量的人类说话声音, 效果挺好的. fish-speech 官方已经提供了容器 (d…

2.3 不同数据库管理系统的比较与应用场景

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

[LitCTF 2024]浏览器也能套娃?

题目有标志SSRF SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能够请求到与它相…

背包九讲(灵魂版)

文章目录 背包九讲[题库 - AcWing](https://www.acwing.com/problem/search/1/?search_content背包九讲&show_algorithm_tags0)01背包朴素代码一维优化代码 完全背包朴素代码一维优化代码 多重背包I 模板题代码 多重背包 II 二进制优化代码 多重背包 III 单调队列优化代码…

[算法题]01 矩阵

题目链接: 01 矩阵 多源BFS类型题, 即给定多个起点, 判断从哪个起点走到终点距离最短, 一般解题思路为将所有起点看成一个"起点", 由此"起点"做bfs得到题解, 实际代码编写将所有起点都入队列, 每次都对所有起点做一层扩展. 题解思路: 从1往0处走寻找最短…

kali-linux 常用命令大集合(目录、文件查看与编辑,登录、电源、帮助等相关命令详解)

目录 目录查看-ls 帮助命令 帮助命令&#xff1a;whatis 帮助命令&#xff1a;help 帮助命令&#xff1a;man 帮助命令&#xff1a;info 登录命令 登录命令&#xff1a;login 登录命令&#xff1a;last 登录命令&#xff1a;exit 切换用户&#xff1a;su/sudo 命令-…

嵌入式学习day17(顺序表)

大纲 线性表是最基本、最简单、也是最常用的一种数据结构&#xff0c;可以存储逻辑关系为线性的数据。线性表&#xff08;linear list&#xff09;是数据结构的一种&#xff0c;一个线性表是n个具有相同特性的数据元素的有限序列。 分类&#xff1a; 顺序表、单向链表、单向循环…

WhatsApp代理地址:如何成功连接WhatsApp?

所有外贸人都非常需要通过WhatsApp与客户沟通&#xff0c;简直是搞钱“生命线”&#xff01;但是&#xff0c;很多老板在后台抱怨说自己一直登不进去&#xff0c;99.99%是你网络问题。很多外贸人找的代理IP来路不明或者滥竽充数&#xff0c;要和很多人一起共用IP或者IP地址总是…