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

react|redux状态管理

react|redux状态管理

参考官网:https://cn.redux-toolkit.js.org/tutorials/quick-start

状态管理使用流程

1、安装:

npm install react-redux @reduxjs/toolkit

2、创建store.js

通过configureStore的hook对reducer(或slice)进行统一管理。

import { configureStore } from '@reduxjs/toolkit';
import counterReducer from '../features/counter/counterSlice';export const store = configureStore({reducer: {counter: counterReducer,// ...},
});

3、编写我们的Reducer(或slice)

通过createSlice创建slice;需要创建异步的action方法的时候需要引入createAsyncThunk的hook。

createSlice核心属性:name、initialState、reducers、extraReducers。

import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import { fetchCount } from './counterAPI';const initialState = {value: 0,status: 'idle',
};// 下面的函数称为thunk,它允许我们执行异步逻辑。
// 它可以像常规操作一样被调度:'dispatch(incrementAsync(10))'。
// 这将使用'dispatch'函数作为第一个参数来调用thunk。
// 然后可以执行异步代码,并可以分派其他操作。
// Thunks 通常用于发出异步请求.
export const incrementAsync = createAsyncThunk('counter/fetchCount',async (amount) => {const response = await fetchCount(amount);// 我们返回的值成为“已完成”的操作负载(action.payload)return response.data;}
);export const counterSlice = createSlice({name: 'counter',initialState,// 'reducers'字段允许我们定义reducers并生成相关的操作(action)reducers: {increment: (state) => {// Redux Toolkit允许我们在reducer中编写“状态变化”的逻辑。 // 它实际上不会改变状态,因为它使用了Immer库,// 它检测到“状态”的变化,并根据这些变化产生一个全新的不可变状态state.value += 1;},decrement: (state) => {state.value -= 1;},// 使用PayloadAction类型来声明' action.payload '的内容。incrementByAmount: (state, action) => {state.value += action.payload;},},// 'extraReducers'字段允许切片处理在其他地方定义的动作,// 包括由createAsyncThunk或其他切片生成的动作。extraReducers: (builder) => {builder.addCase(incrementAsync.pending, (state) => {state.status = 'loading';}).addCase(incrementAsync.fulfilled, (state, action) => {state.status = 'idle';state.value += action.payload;});},
});export const { increment, decrement, incrementByAmount } = counterSlice.actions;// 下面的函数被称为选择器,它允许我们从状态中选择一个值。
// 选择器也可以内联定义,而不是在片文件中使用。
// 比如: `useSelector((state: RootState) => state.counter.value)`
export const selectCount = (state) => state.counter.value;// 我们也可以手工编写脚本,其中可能包含同步和异步逻辑。
// 下面是一个基于当前状态有条件地调度操作的示例。
export const incrementIfOdd = (amount) => (dispatch, getState) => {const currentValue = selectCount(getState());if (currentValue % 2 === 1) {dispatch(incrementByAmount(amount));}
};export default counterSlice.reducer;

4、提供redux store给react

使用Provider高阶组件包裹App,并传递store属性。

import React from 'react'
import ReactDOM from 'react-dom/client'
import './index.css'
import App from './App'// 提供redux store给react,需要引入的工具store、provider
import store from './app/store'
import { Provider } from 'react-redux'// As of React 18
const root = ReactDOM.createRoot(document.getElementById('root'))root.render(<Provider store={store}><App /></Provider>
)

5、react组件中操作redux的state和action

通过redux提供的useSelector和useDispatch的hook去操作state和action即可。

import './App.css';import { useSelector, useDispatch } from 'react-redux';
import { incremented, decremented } from './store/slices/counterSlice';function App() {const count = useSelector((state) => {return state.value;});const dispatch = useDispatch();return (<div className="App"><header className="App-header"><h3>count: {count}</h3><div><button style={{width: '130px',height: '40px',fontSize: '20px',cursor: 'pointer',marginRight: '10px'}} onClick={() => dispatch(incremented())}>incremented</button><button style={{width: '130px',height: '40px',cursor: 'pointer',fontSize: '20px'}} onClick={() => dispatch(decremented())}>decremented</button></div><p>Edit <code>src/App.js</code> and save to reload.</p></header></div>);
}export default App;

相关文章:

react|redux状态管理

react|redux状态管理 参考官网&#xff1a;https://cn.redux-toolkit.js.org/tutorials/quick-start 状态管理使用流程 1、安装&#xff1a; npm install react-redux reduxjs/toolkit2、创建store.js 通过configureStore的hook对reducer&#xff08;或slice&#xff09;进行…...

Python之旅----判断语句

布尔类型和比较运算符 布尔类型 布尔类型的定义 布尔类型的字面量&#xff1a; True 表示真&#xff08;是、肯定&#xff09; False 表示假 &#xff08;否、否定&#xff09; 也就是布尔类型进行判断&#xff0c;只会有2个结果&#xff1a;是或否 定义变量存储布尔类型…...

【JavaEE】文件操作和IO

1 什么是文件&#xff1f; 针对硬盘这种持久化存储的I/O设备&#xff0c;当我们想要进行数据保存时&#xff0c;往往不是保存成一个整体&#xff0c;而是独立成一个个的单位进行保存&#xff0c;这个独立的单位就被抽象成文件的概念 2 文件路径 文件路径就是指咱们文件系统中…...

python使用dataset快速使用SQLite

目录 一、官网地址 二、安装 三、 快速使用 一、官网地址 GitHub - pudo/dataset: Easy-to-use data handling for SQL data stores with support for implicit table creation, bulk loading, and transactions. 二、安装 pip install dataset 如果是mysql&#xff0c;则…...

Python 练习100实例(21-40)

Python 练习实例21 题目&#xff1a;猴子吃桃问题&#xff1a;猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不瘾&#xff0c;又多吃了一个第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天…...

“创新启变 聚焦增长”极狐(GitLab)媒体沟通会,共话智能时代软件开发新生态

10 月 18 日 北京 昨日&#xff0c;全球领先 AI 赋能 DevSecOps 一体化平台极狐(GitLab) 在北京举办了主题为“创新启变 聚焦增长”的媒体沟通会。极狐(GitLab) CEO 柳钢就“中国企业数字化转型、软件研发、技术自主可控等热点问题&#xff0c;以及 AI 大模型时代下&#xff0c…...

【ChatGLM2-6B】在只有CPU的Linux服务器上进行部署

简介 ChatGLM2-6B 是清华大学开源的一款支持中英双语的对话语言模型。经过了 1.4T 中英标识符的预训练与人类偏好对齐训练&#xff0c;具有62 亿参数的 ChatGLM2-6B 已经能生成相当符合人类偏好的回答。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&…...

Xilinx IP 10 Gigabit Ethernet Subsystem IP

Xilinx IP 10 Gigabit Ethernet Subsystem IP 10 Gb 以太网子系统在 10GBASE-R/KR 模式下提供 10 Gb 以太网 MAC 和 PCS/PMA,以提供 10 Gb 以太网端口。发送和接收数据接口使用 AXI4 流接口。可选的 AXI4-Lite 接口用于内部寄存器的控制接口。 • 设计符合 10 Gb 以太网规范…...

ubuntu下yolox tensorrt模型部署

TensorRT系列之 Windows10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速…...

外汇天眼:外汇投资入门必看!做好3件事,任何人都能提高交易胜率

近年来外汇市场愈来愈热络&#xff0c;许多投资人看准世界金融变化的趋势&#xff0c;纷纷开始入场布局&#xff0c;期望把握行情大赚一笔。 如果你之前没有做过外汇交易&#xff0c;建议最好先透过「外汇天眼学院」学习各种相关的知识与技术分析&#xff0c;等到对外汇有一定的…...

idea dubge 详细

目录 一、概述 二、debug操作分析 1、打断点 2、运行debug模式 3、重新执行debug 4、让程序执行到下一次断点后暂停 5、让断点处的代码再加一行代码 6、停止debug程序 7、显示所有断点 8、添加断点运行的条件 9、屏蔽所有断点 10、把光标移到当前程序运行位置 11、单步跳过 12、…...

短视频矩阵系统/pc、小程序版独立原发源码开发搭建上线

短视频剪辑矩阵系统开发源码----源头搭建 矩阵系统源码主要有三种框架&#xff1a;Spring、Struts和Hibernate。Spring框架是一个全栈式的Java应用程序开发框架&#xff0c;提供了IOC容器、AOP、事务管理等功能。Struts框架是一个MVC架构的Web应用程序框架&#xff0c;用于将数…...

Linux不同格式的文件怎么压缩和解压

Linux不同格式的文件怎么压缩和解压 tar介绍不同格式文件压缩和解压 tar介绍 tar&#xff08;tape archive&#xff09;是一个在Unix和类Unix操作系统中用于文件打包和归档的命令行工具。它通常与其他工具&#xff08;例如gzip、bzip2、xz&#xff09;一起使用来创建归档文件并…...

Java 领域模型之失血、贫血、充血、胀血模型

1.失血模型 失血模型仅仅包含数据的定义和getter/setter方法&#xff0c;业务逻辑和应用逻辑都放到服务层中。这种类在Java中叫POJO。 action service&#xff1a; 核心业务&#xff08;复杂度&#xff1a;重&#xff09; model&#xff1a;简单Set Get dao &#xff1a;数据持…...

ifndef是什么,如何使用?

引言 使用HbuilderX uni-ui模板创建的uni-app项目&#xff0c;main.js文件中看到有如下的注释&#xff1a; // #ifndef VUE3 ...... // #endif // #ifdef VUE3 ...... // #endif 相信很多没有uini-app项目开发经验的朋友&#xff0c;初次接触uni-app项目&#xff0c;可…...

PXIE板卡,4口QSFP+,PCIE GEN3 X8,XILINX FPGA XCVU3P设计

PXIE板卡&#xff0c;4口QSFP&#xff0c;PCIE GEN3 X8&#xff0c;基于XILINX FPGA XCVU3P设计。 1&#xff1a;电路拓扑 ● 支持利用 EEPROM 存储数据&#xff1b; ● 电源时序控制和总功耗监控&#xff1b; 2&#xff1a;电路调试 3&#xff1a;测试 PCIE gen3 x8&#…...

数据分析:密度图

目前拥有的数据如图&#xff0c;三列分别对应瑕疵种类&#xff0c;对应的置信 度&#xff0c;x方向坐标。 现在想要做的事是观看瑕疵种类和置信度之间的关系。 要显示数据分布的集中程度&#xff0c;可以使用以下几种常见的图形来观察&#xff1a; 1、箱线图&#xff08;Box P…...

docker load and build过程的一些步骤理解

docker load 命令执行原理 “docker load” command, the following steps are followed to load an image from a specified tar file to the local image repository: Parsing the tar file: Docker first parses the tar file to check its integrity and verify the form…...

批量处理图像模板

以下是一个Python模板&#xff0c;用于批量处理图像并将处理后的图像保存在另一个文件夹中。在此示例中&#xff0c;将使用Pillow库来处理图像&#xff0c;可以使用其他图像处理库&#xff0c;根据需要进行修改。   首先&#xff0c;确保已经安装了Pillow库&#xff0c;可以使…...

2023_Spark_实验十四:SparkSQL入门操作

1、将emp.csv、dept.csv文件上传到分布式环境&#xff0c;再用 hdfs dfs -put dept.csv /input/ hdfs dfs -put emp.csv /input/ 将本地文件put到hdfs文件系统的input目录下 2、或者调用本地文件也可以。区别&#xff1a;sc.textFile("file:///D:\\temp\\emp.csv&qu…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...