react-redux搭建及不同版本间的对比

一.经典版

1. 安装Redux和React Redux
 npm install redux react-redux
2. 创建action
// actions/counterActions.js
export const increment = () => {return {type: 'INCREMENT'};
};export const decrement = () => {return {type: 'DECREMENT'};
};export const add = (amount) => ({type: 'ADD',payload: amount,
});
3. 创建reduce
// reducers/counterReducer.js
const counterReducer = (state = 0, action: any) => {switch (action.type) {case 'INCREMENT':return state + 1;case 'DECREMENT':return state - 1;case "ADD":return state + 5;default:return state;}
};export default counterReducer;
4. 在项目的src目录中创建store.js
// store.js
import { legacy_createStore as createStore, combineReducers, applyMiddleware, compose } from 'redux';// 引入 reducer
import counterReducer from './reducer';// 使用 combineReducers 组合多个 reducer
const rootReducer = combineReducers({counter: counterReducer,// 这里可以添加更多的 reducer
});// 为 Redux DevTools 扩展设置
const composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;// 创建 Redux store,添加中间件支持,同时启用 Redux DevTools
const store = createStore(rootReducer,/* preloadedState, */composeEnhancers(applyMiddleware(// 这里是将来可能添加的中间件))
);export default store;
5. 在React组件中使用
a. 首先,在应用的最顶层组件(App.js)中使用<Provider>组件包裹你的应用,将store传递给它
// src/App.js
import React from 'react';
import { Provider } from 'react-redux';
import store from './store';
import MyComponent from './MyComponent';function App() {return (<Provider store={store}><div className="App"><MyComponent /></div></Provider>);
}export default App;
b. 然后,在需要访问Redux store的组件中使用useSelector来读取状态,使用useDispatch来分发action
// Counter.jsx
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement,add } from '../store/action';const Counter = () => {const count = useSelector((state:any) => state.counter);const dispatch = useDispatch();return (<div><h2>Counter: {count}</h2><button onClick={() => dispatch(increment())}>Increment</button><button onClick={() => dispatch(decrement())}>Decrement</button><button onClick={() => dispatch(add(5))}>Add 5</button></div>);
};export default Counter;

二、旧版

这种方法在react-redux版本5及之前非常流行,随着react-redux版本6和7的发布,这种方法已经被淘汰了。但是企业中仍有很多旧项目保持着这种写法,所以学会这项技术的使用也是必须的。

1.安装
npm install redux react-redux
2Action
// src/actions/index.js
export const increment = () => {return {type: 'INCREMENT',};
};export const decrement = () => {return {type: 'DECREMENT',};
};
3.创建Reducer
// src/reducers/counterReducer.js
const counterReducer = (state = { count: 0 }, action) => {switch (action.type) {case 'INCREMENT':return { count: state.count + 1 };case 'DECREMENT':return { count: state.count - 1 };default:return state;}
};export default counterReducer;
4.创建Store
// src/store.js
import { createStore, combineReducers } from 'redux';
import counterReducer from './reducers/counterReducer';const rootReducer = combineReducers({counter: counterReducer,
});const store = createStore(rootReducer);export default store;
5.组件中使用
a. 使用 Provider from react-redux 把 Redux store 提供给 React 应用
// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import store from './store';
import App from './App';ReactDOM.render(<Provider store={store}><App /></Provider>,document.getElementById('root')
);
b. 然后,在需要访问Redux store的组件中使用
// src/App.js
import React from 'react';
import { connect } from 'react-redux';
import { increment, decrement } from './actions';// 定义并导出函数式组件
const App = (props) => {return (<div><h2>Counter: {props.count}</h2><button onClick={props.increment}>+</button><button onClick={props.decrement}>-</button></div>);
};// mapStateToProps remains unchanged
const mapStateToProps = (state) => {return {count: state.counter.count,};
};// mapDispatchToProps remains unchanged as well
const mapDispatchToProps = { increment,decrement,
};// 在组件中使用 connect() 去连接 Redux store
export default connect(mapStateToProps, mapDispatchToProps)(App);

三、最新版

@reduxjs/toolkit 是 Redux 团队推荐的方式来编写 Redux 逻辑的工具集。它旨在提供更简便的 API,帮助开发者解决 Redux 应用中经常遇到的一些常见问题,如配置 store、添加中间件、编写 reducer 逻辑等。Redux Toolkit 引入了几个核心概念,如“切片(slices)”来简化 reducer 和 action creators 的编写,以及创建异步逻辑的“createAsyncThunk”等工具。

1.安装
npm install @reduxjs/toolkit react-redux
2.使用 createSlice 创建一个包含了 reducer 函数和 actions 的切片(slice)
// slices/counterSlice.js
import { createSlice } from '@reduxjs/toolkit';export const counterSlice = createSlice({name: 'counter',initialState: { value: 0 },reducers: {increment: state => {state.value += 1;},decrement: state => {state.value -= 1;},add: (state,pa) => {state.value += pa.payload;},},
});export const { increment, decrement,add } = counterSlice.actions;export default counterSlice.reducer;
3.通过 Redux Toolkit 的 configureStore 来创建和配置 store
// store.js
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './slices/counterSlice';export const store = configureStore({reducer: {counter: counterReducer,},
});
4.组件中使用
a. 首先,在应用的最顶层组件(App.js)中使用<Provider>组件包裹你的应用,将store传递给它
// index.js 或 App.js,根据你的项目结构来决定
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import App from './App'; // 这是你的应用组件
import { store } from './store'; // 确保从 store.js 正确导入 storeReactDOM.render(<Provider store={store}><App /></Provider>,document.getElementById('root')
);
b. 然后,在需要访问Redux store的组件中使用useSelector来读取状态,使用useDispatch来分发action
// Counter.jsx
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement, add } from '../store/reducer';const Counter = () => {const count = useSelector((state: any) => state.counter.value);const dispatch = useDispatch();return (<div><h2>Counter: {count}</h2><button onClick={() => dispatch(increment())}>Increment</button><button onClick={() => dispatch(decrement())}>Decrement</button><button onClick={() => dispatch(add(9))}>Decrement</button></div>);
};export default Counter;

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

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

相关文章

atmega8 上传程序

使用icsp 烧写时先关闭串口程序&#xff0c;与串口uart连接相关的电路勿于电脑连接 接触不良 1.使用icsp 上传 1&#xff09;可以直接上传程序 如官方示例blink 或是 serial示例 2&#xff09;可以先烧录bootload 方便下次使用串口上传程序代码 A)使用专门的icsp 上传器上传…

关于二分法的理解(以JS为例)

算法介绍 基本概念 二分查找算法&#xff0c;又称折半查找算法&#xff0c;是一种在有序数组中查找特定元素的高效方法。它的核心思想是将数组分成两半&#xff0c;然后根据目标值与中间元素的比较结果来决定是继续在左半部分还是右半部分进行搜索。 工作原理 初始化&#…

【iOS】如何断点看系统方法在哪一个库

如何断点看系统方法在哪一个库 开源网站如何断点看系统方法在哪一个库1 下符号断点2 符号断点中输入 load &#xff0c;并且开启断点&#xff08;Enable&#xff09;。3 运行程序&#xff0c;触发断点&#xff0c;在堆栈信息中找到load方法&#xff0c;可以看到其在libobjc.A.d…

程序员的wsl2

坑 wsl无法打开 上班时打开wsl2提示 WSL 正在完成升级... Could not write value to key \SOFTWARE\Classes\Directory\shell\WSL. Verify that you have sufficient access to that key, or contact your support personnel. 原因未知&#xff0c;之前并没有更新过&#xff…

【AI+编程】工作日常场景随时可以AI编程,记一个问答SQL快速导出数据日常示例

今天有个场景&#xff0c;我们有个老项目&#xff0c;由于历史原因差不多1年多没使用了&#xff0c;恰巧客户紧急情况要使用。因为当时没有需求&#xff0c;所以V1.0上线后 就没做更新。 需求很简单&#xff1a;我们假定 项目问题表、客户表、问题答案表&#xff0c; 实时查询…

TCP协议报头详解

目录 前言 TCP特点 TCP报头 1.源端口和目的端口 2.序号 3.确认号 4.数据偏移 5.保留 6.控制位 ① 紧急URG&#xff08;URGent&#xff09; ② 确认ACK&#xff08;ACKnowledgment&#xff09; ③ 推送PSH&#xff08;PuSH&#xff09; ④复位RST&#xff08;ReSeT&…

tornado.httputil.HTTPFile

tornado.httputil.HTTPFile 在 Tornado web 框架中并不是直接提供的一个类或者对象。但是&#xff0c;当你提到与文件上传相关的功能时&#xff0c;通常我们是在谈论 Tornado 的 tornado.web.RequestHandler 类中处理文件上传的方法。 在 Tornado 中&#xff0c;文件上传通常是…

【React】《React 学习手册 (第2版) 》笔记-Chapter1-初识 React

一、初识 React 在 package.json 文件中提供具体的版本信息&#xff0c;以便安装各个包的正确版本。 官方文档&#xff1a;https://zh-hans.react.dev/ 建议安装 React 开发者工具&#xff0c;来辅助开发 React 项目。这些工具可通过扩展 Chrome 和 Firefox 中安装&#xff0…

Android获取CPU的使用率

Android获取CPU的使用率 1、参考博客2、使用读取/proc/stat方案2.1 读取/proc/stat权限2.2 CPU使用率获取代码 1、参考博客 android系统之获取CPU的使用率 安卓性能测试之cpu占用率统计方法总结 CPU使用率指标内核源码分析 Android获取CPU&#xff0c;内存&#xff0c;磁盘使用…

Hexo 搭建个人博客(ubuntu20.04)

1 安装 Nodejs 和 npm 首先登录NodeSource官网&#xff1a; Nodesource Node.js DEB 按照提示安装最新的 Node.js 及其配套版本的 npm。 &#xff08;1&#xff09;以 sudo 用户身份运行下面的命令&#xff0c;下载并执行 NodeSource 安装脚本&#xff1a; sudo curl -fsSL…

【牛客面试必刷TOP101】Day32.BM68 矩阵的最小路径和和BM69 把数字翻译成字符串

文章目录 前言一、BM68 矩阵的最小路径和题目描述题目解析二、BM69 把数字翻译成字符串题目描述题目解析总结 前言 一、BM68 矩阵的最小路径和 题目描述 描述&#xff1a; 给定两个字符串str1和str2&#xff0c;输出两个字符串的最长公共子序列。如果最长公共子序列为空&#x…

C++中符号常量与预处理器的行为

C中符号常量与预处理器的行为 以头文件 climits 为例来说明&#xff0c;该头文件定义了符号常量来表示类型的限制。如前所述&#xff0c;INTMAX表示类型int 能够存储的最大值&#xff0c;对于 Windows7系统&#xff0c;为2147483 647。编译器厂商提供了 climits 文件&#xff…

webpack逆向

声明&#xff1a;个人总结记录一下&#xff0c;避免忘记 1、webpack 类型 单文件 直接可以在文件顶部找到加载器 多文件 顶部找不到加载器 如图所示 多文件的这话&#xff0c;全局搜所 69725 找到类似n(69725) ,单点n进去&#xff0c;可以找到加载器 2、调用 通过赋值的方…

企业开源免费和开源的堡垒机选型方案

企业在选择堡垒机时&#xff0c;通常会考虑其安全性、功能性、易用性以及成本。以下是一些免费和开源的堡垒机解决方案&#xff0c;适合希望在保障安全的前提下控制成本的企业&#xff1a; 1. Jumpserver GitHub 地址: https://github.com/jumpserver/jumpserver特点:支持Web…

13.零拷贝

零拷贝:不需要将数据放入到java的缓存中。 更少的用户态与内核态的切换。不利用cpu计算,减少cpu缓存伪共享。零拷贝适合小文件传输。需求 读取服务器的一个文件,通过socket的API发送到客户端。 伪代码 File f = new File("D:/data.txt"); RandomAccessFile fi…

Linux 并发与竞争实验学习

Linux 并发与竞争实验学习 原子操作实验 这里原子操作就是采用原子变量来保护一个程序运行的完整过程&#xff0c;使用atomic 来实现一次只能允许一个应用访问 LED&#xff0c;创建atomic.c文件&#xff0c;其实改动内容就是添加原子变量&#xff0c; 要在设备结构体数据添加…

探索算法的时间复杂度:五种不同时间复杂度的算法介绍

探索算法的时间复杂度&#xff1a;五种不同时间复杂度的算法介绍 在计算机科学中&#xff0c;理解和分析算法的时间复杂度是非常重要的&#xff0c;它可以帮助我们预测算法在处理不同规模数据时的性能表现。本文将介绍五种不同时间复杂度的算法&#xff0c;并解释每个算法如何…

vue2 + element-ui,前端配置化表单封装(2024-06-14)

技术栈是 vue2 element-ui&#xff0c;主要能解决的问题就是 提高代码复用能力、提升开发效率&#xff0c;特别是需要开发多个大型表单系统的&#xff0c;配置化可以极大的提升效率&#xff0c;让你上班摸鱼不再是梦想&#xff01;为了早点下班&#xff0c;我们接着往下看吧&a…

(Java微服务项目实战)dtpay聚合支付系统对账管理模块系统设计

1 聚合支付系统对账流程 dtpay聚合支付系统对账模块主要涵盖商户侧对账和渠道侧对账、平台侧对账&#xff0c;本文主要分析渠道侧对账。dtpay聚合支付系统通过支付渠道微信、支付宝等产生的支付退款交易数据需要和平台侧产生的数据进行交易数据比对。接下来我们具体分析对账流…

第十五章:基于BERT模型的LoRA训练与resume方法(huggingface)

文章目录 前言一、LoRA训练与Resume方法Demo1、LoraConfig配置文件介绍2、PEFT的LoRA训练的完整Demo3、LoRA训练与LoRA的resume训练1、LoRA训练2、LoRA的resume训练4、PEFT的LoRA训练方法二、权重载入1、参数2、文件路径获取3、config加载更新4、权重文件加载1、不同条件权重载…