使用 Redux 管理 React 应用状态

news2025/1/19 17:16:03

使用 Redux 管理 React 应用状态

在复杂的 React 应用中,管理组件状态变得越来越复杂,这时候引入 Redux 可以帮助我们更好地管理状态。Redux 是一个可预测状态容器,它可以帮助我们统一管理应用的状态,使得状态变化更加可控。本文将介绍如何在 React 应用中使用 Redux。

Redux 简介

Redux 是一个状态管理库,它提供了一种可预测的状态管理方案。Redux 的核心思想是将应用的状态存储在一个单一的 Store 中,并通过定义纯函数的方式来修改状态。Redux 的状态管理遵循以下三个原则:

  1. 单一数据源:整个应用的状态被存储在一个单一的 JavaScript 对象中。
  2. 状态是只读的:不能直接修改状态,只能通过派发 Action 来修改。
  3. 使用纯函数修改状态:使用纯函数(Reducers)来根据旧的状态和 Action 来计算新的状态。

Redux 基本概念

在 Redux 中,有几个核心概念需要理解:

  1. Store:存储应用的状态,提供了一些方法来获取状态、派发 Action 和注册监听器。
  2. Action:描述状态变化的对象,必须包含一个 type 属性来指明要执行的操作。
  3. Reducer:纯函数,接收旧的状态和 Action,返回新的状态。
  4. Dispatch:派发 Action 的方法,用于触发状态变化。
  5. Subscribe:订阅状态变化的方法,可以注册监听器,监听状态的变化。

Redux 使用示例

下面是一个使用 Redux 的示例,实现了一个简单的加法功能:

// actions/count.js
import { COUNT_ADD } from "../constant";

export const createAddAction = data => ({ type: COUNT_ADD, data })

// reducers/count.js
import { COUNT_ADD } from '../constant';

const initState = 0;

export default function CountReducer(preState = initState, action) {
  const { type, data } = action;
  switch (type) {
    case COUNT_ADD:
      const { value1, value2 } = data;
      return value1 + value2;
    default:
      return preState;
  }
}

// store.js
import { createStore } from 'redux';

import countReducer from './reducers/count';

export default createStore(countReducer);
// ReduxDemo.js
import React, { Component } from 'react';
import { InputNumber, Button } from 'antd';

import { createAddAction } from './actions/count';
import Store from './store';

export default class ReduxDemo extends Component {
  state = {
    value1: 0,
    value2: 0,
  }

  componentDidMount() {
    Store.subscribe(() => {
      this.forceUpdate();
    });
  }

  add = () => {
    const { value1, value2 } = this.state;
    Store.dispatch(createAddAction({ value1, value2 }));
  }


  render() {
    const { value1, value2 } = this.state;
    const total = Store.getState();

    return (
      <div>
        <h2>加法</h2>
        <InputNumber value={value1} onChange={ val => this.setState({ value1: val }) } /> +
        <InputNumber value={value2} onChange={ val => this.setState({ value2: val }) } />
        <Button type="link" onClick={this.add}>=</Button>
        {total}
      </div>
    )
  }
}

在这里插入图片描述

在这个示例中,我们首先定义了一个 Action 和一个 Reducer,然后使用 createStore 方法创建了一个 Store,并将 Reducer 注册到 Store 中。在 React 组件中,通过调用 Store.dispatch 方法派发 Action,然后通过订阅 Store 的状态变化来更新组件的状态。

总结

Redux 是一个强大的状态管理库,可以帮助我们更好地管理复杂应用的状态。本文介绍了 Redux 的基本概念和使用方法,并通过一个简单的示例演示了如何在 React 应用中使用 Redux。希望本文对你理解 Redux 的使用有所帮助!

参考

  • 使用 Redux 管理 React 应用状态
  • 完整代码
  • Redux文档

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

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

相关文章

WEB搭建LNMP环境-Discuz论坛

目录 一、安装PHP并修改配置文件(nginx自行安装) 二、安装MySQL数据库并配置文件 三、 搭建discuz论坛 一、安装PHP并修改配置文件(nginx自行安装) yum install php php-gd php-fpm php-mysqlnd php-xml -y vim /etc/nginx/nginx.conf #配置nginx和PHP交互location …

Spring-Mybatis字段映射

MybatisComfig.xml文件设置 <settings><setting name"mapUnderscoreToCamelCase" value"true"/> </settings> 完成全局配置将数据库下划线映射为驼峰式命名

STM32CubeMX学习笔记24---FreeRTOS(消息队列)

一. 队列简介 队列是为了任务与任务、任务与中断之间的通信而准备的&#xff0c;可以在任务与任务、任务与中 断之间传递消息&#xff0c;队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之 间要交流的数据保存在队列中&#xff0c;叫做队列项目。队列…

SQLiteC/C++接口详细介绍sqlite3_stmt类(一)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类简介 下一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;二&#xff09; ​ 序言&#xff1a; 本文开始了SQLite的第二个类的详细介绍…

JavaScript实现简单的表单验证

关键代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

基于python企业办公文件分类系统flask-django-nodejs-php

系统内容可以随时更新&#xff0c;这点对于现代企业通知与文件分享管理来说是很重要&#xff0c;但传统的管理方式都无法做到的。企业办公文件分类系统就可以每天更新&#xff0c;随时反映您企业通知与文件分享的最新情况。 网络的广泛应用给生活带来了十分的便利。所以把企业…

React - 实现菜单栏滚动

简介 本文将会基于react实现滚动菜单栏功能。 技术实现 实现效果 点击菜单&#xff0c;内容区域会自动滚动到对应卡片。内容区域滑动&#xff0c;指定菜单栏会被选中。 ScrollMenu.js import {useRef, useState} from "react"; import ./ScrollMenu.css;export co…

Springboot笔记-04

1.PropertySource&ImportResource&Bean PropertySource&#xff1a;加载指定的配置文件&#xff0c;只能用于properties文件&#xff0c;不支持yml文件&#xff1b; 以person为例子: ConfigurationProperties:告诉springboot将本类中所有属性和配制文件相关的配制进行…

【RabbitMQ | 第七篇】RabbitMQ实现JSON、Map格式数据的发送与接收

文章目录 7.RabbitMQ实现JSON、Map格式数据的发送与接收7.1消息发送端7.1.1引入依赖7.1.2yml配置7.1.3RabbitMQConfig配置类——&#xff08;非常重要&#xff09;&#xff08;1&#xff09;创建交换器方法&#xff08;2&#xff09;创建队列方法&#xff08;3&#xff09;绑定…

牛客NC241 计算器(二)【中等 dfs+双端队列 Java】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/a9c170bfaf7349e3acb475d786ab1c7d 核心 DFS双端队列参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定…

L1-027 出租(PTA)

文章目录 L1-027 出租题目描述模拟哈希表二分查找 L1-027 出租 题目描述 下面是新浪微博上曾经很火的一张图&#xff1a; 一时间网上一片求救声&#xff0c;急问这个怎么破。其实这段代码很简单&#xff0c;index数组就是arr数组的下标&#xff0c;index[0]2 对应 arr[2]1&a…

C#,图论与图算法,有向图(Graph)之环(Cycle)判断的颜色算法与源代码

1 检查该图是否包含循环 给定一个有向图,检查该图是否包含循环。如果给定的图形至少包含一个循环,则函数应返回true,否则返回false。 方法:深度优先遍历可用于检测图中的循环。连接图的DFS生成树。只有当图中存在后缘时,图中才存在循环。后边是从节点到自身(自循环)或…

锂电极片生产中机器视觉系统的多元检测能力

随着新能源行业的快速发展&#xff0c;锂电池作为核心组件&#xff0c;其生产质量受到了前所未有的关注。在锂电极片的生产过程中&#xff0c;机器视觉系统以其高精度、高效率的特点&#xff0c;成为了保障产品质量的关键工具。本文将探讨机器视觉系统在锂电极片生产中可以检测…

竞争优势:大型语言模型 (LLM) 如何重新定义业务策略

人工智能在内容创作中的突破 在当今快节奏的商业环境中&#xff0c;像 GPT-4 这样的大型语言模型 (LLM) 不再只是一种技术新颖性&#xff1b; 它们已成为重新定义跨行业业务战略的基石。 从增强客户服务到推动创新&#xff0c;法学硕士提供了企业不容忽视的竞争优势。 1. 加强…

工业相机采图方式、图像格式(BYTE、HObject和Mat)转换

1、概述 机器视觉项目中&#xff0c;如何采集到合适的图像是项目的第一步&#xff0c;也是最重要的一步&#xff0c;直接关系到后面图像处理算法及最终执行的结果。所以采用不同的工业相机成像以及如何转换成图像处理库所需要的格式成为项目开发中首先要考虑的问题。 2、工业…

【Micropython ESP32】RTC时钟

文章目录 前言一、RTC时钟的介绍1.1 RTC时钟的作用1.2 Micropython中时钟于硬件时钟的区别 二、machine.RTC 类2.1 machine.RTC 类的构造方法2.2 初始化 RTC 设备起始时间2.3 关闭 RTC 设备2.4 获取当前时间 三、示例代码总结 前言 在嵌入式设备开发中&#xff0c;实时时钟&am…

001_【基础篇】SpringBoot入门案例创建与实现

要求&#xff1a;使用 Springboot 开发一个 web 程序&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串 hello springboot 使用 springboot 只需要引入一个起步依赖 <dependency><groupId>org.springframework.boot</groupId><artifac…

Python 自然语言处理库之stanza使用详解

概要 在自然语言处理(NLP)领域,Python Stanza 库是一个备受推崇的工具,它提供了强大的功能和易用的接口,帮助开发者处理文本数据、进行语言分析和构建NLP应用。本文将深入探讨 Stanza 库的特性、用法,并通过丰富的示例代码展示其在实际项目中的应用。 Stanza 简介 Stan…

docker小白第十四天之Portainer与CIG

Portainer简介 Portainer是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便地管理Docker环境&#xff0c;包括单机环境和集群环境。 Portainer命令安装 # 一个容器可以同时起多个-p端口&#xff0c;restartalways表示随时在线&#xff0c;重启机器后也…

Tomcat 服务器部署和 IDEA 配置 Tomcat

(一) Tomcat 简介 Tomcat是Apache软件基金会一个核心项目&#xff0c;是一个开源免费的轻量级Web服务器&#xff0c;支持Servlet/JSP少量JavaEE规范。 概念中提到了JavaEE规范&#xff0c;那什么又是JavaEE规范呢? JavaEE: Java Enterprise Edition,Java企业版。指Java企业级…