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

React - React Redux 数据共享、Redux DevTools、React Redux 最终优化

一、React Redux 数据共享1、基本介绍combineReducers 函数用于汇总所有的 Reducer 变为一个总的 Reducer2、演示1reduxconstant// 定义 action 中 type 的常量值exportconstINCREMENTincrement;exportconstDECREMENTdecrement;exportconstADD_PERSONadd_person;action// 该文件专门为 Count 组件生成 actionimport{INCREMENT,DECREMENT}from../constant;// 同步 actionexportconstcreateIncrementAction(data)({type:INCREMENT,data});exportconstcreateDecrementAction(data)({type:DECREMENT,data});// 异步 action就是 action 的值为函数异步 action 中一般都会调用同步 actionexportconstcreateIncrementAsyncAction(data,time){return(dispatch){setTimeout((){dispatch(createIncrementAction(data));},time);};};import{ADD_PERSON}from../constant;exportconstcreateAddPersonAction(data)({type:ADD_PERSON,data});reducer// 该文件是用于创建一个为 Count 组件服务的 Reducer// Reducer 本质就是一个函数// Reducer 会接收到两个参数preState之前的状态、action动作对象// 从 action 中可以获取到 type 和 data根据 type 决定如何加工 dataimport{INCREMENT,DECREMENT}from../constant;constinitState0;// 初始状态exportdefaultfunctioncountReducer(preStateinitState,action){const{type,data}action;switch(type){caseINCREMENT:returnpreStatedata;caseDECREMENT:returnpreState-data;default:returnpreState;}}import{ADD_PERSON}from../constant;constinitState[];exportdefaultfunctionpersonReducer(preStateinitState,action){const{type,data}action;switch(type){caseADD_PERSON:return[...preState,data];default:returnpreState;}}store// 该文件专门用于暴露一个 store 对象整个应用只有一个 store 对象import{createStore,applyMiddleware,combineReducers}fromredux;importcountReducerfrom./reducers/count;importpersonReducerfrom./reducers/person;importthunkfromredux-thunk;// 汇总所有的 Reducer 变为一个总的 ReducerconstreducercombineReducers({count:countReducer,persons:personReducer,});// applyMiddleware 用于应用基于 Redux 的中间件exportdefaultcreateStore(reducer,applyMiddleware(thunk));2containerCount 容器组件import React, { Component } from react; // 引入 action import { createIncrementAction, createDecrementAction, createIncrementAsyncAction } from ../../redux/actions/count; // 引入 connect 函数用于连接组件与 Redux import { connect } from react-redux; class Count extends Component { // 加 increment () { const { value } this.selectNumber; this.props.jia(value * 1); }; // 减 decrement () { const { value } this.selectNumber; this.props.jian(value * 1); }; // 奇数再加 incrementIfOdd () { const { value } this.selectNumber; const { count } this.props; if (count % 2 ! 0) { this.props.jia(value * 1); } }; // 异步加 incrementAsync () { const { value } this.selectNumber; this.props.jiaAsync(value * 1, 500); }; render() { return ( div h2当前人员数量为{this.props.personCount}/h2 h2当前求和为{this.props.count}/h2 select ref{(c) (this.selectNumber c)} option value11/option option value22/option option value33/option /select nbsp; button onClick{this.increment}/buttonnbsp; button onClick{this.decrement}-/buttonnbsp; button onClick{this.incrementIfOdd}当前求和为奇数再加/buttonnbsp; button onClick{this.incrementAsync}异步加/button /div ); } } // 1. mapStateToProps 函数返回的是一个对象 // 2. 返回的对象中key 就作为传递给组件 props 的 keyvalue 就作为传递给组件 props 的 value // 3. mapStateToProps 函数用于传递状态 function mapStateToProps(state) { return { count: state.count, personCount: state.persons.length, }; } // 1. mapDispatchToProps 函数返回的是一个对象 // 2. 返回的对象中key 就作为传递给组件 props 的 keyvalue 就作为传递给组件 props 的 value // 3. mapDispatchToProps 函数用于传递操作状态的方法 function mapDispatchToProps(dispatch) { return { jia: (number) dispatch(createIncrementAction(number)), jian: (number) dispatch(createDecrementAction(number)), jiaAsync: (number, time) dispatch(createIncrementAsyncAction(number, time)), }; } // 创建并暴露一个 Count 的容器组件 export default connect(mapStateToProps, mapDispatchToProps)(Count);Person 容器组件import React, { Component } from react; import { nanoid } from nanoid; import { connect } from react-redux; import { createAddPersonAction } from ../../redux/actions/person; class Person extends Component { addPerson () { const name this.nameNode.value; const age this.ageNode.value; const personObj { id: nanoid(), name, age }; this.props.addPerson(personObj); this.nameNode.value ; this.ageNode.value ; }; render() { return ( div h2求和为 {this.props.count}/h2 input ref{(c) (this.nameNode c)} typetext placeholder输入名字 / input ref{(c) (this.ageNode c)} typetext placeholder输入年龄 / button onClick{this.addPerson}添加/button ul {this.props.persons.map((p) { return ( li key{p.id} {p.name}--{p.age} /li ); })} /ul /div ); } } function mapStateToProps(state) { return { persons: state.persons, count: state.count, }; } // mapDispatchToProps 的简写如果传入的是对象就自动用 dispatch 包裹每个方法 const mapDispatchToProps { addPerson: createAddPersonAction, }; export default connect(mapStateToProps, mapDispatchToProps)(Person);3mainApp 组件import React, { Component } from react; import Count from ./containers/Count; import Person from ./containers/Person; export default class App extends Component { render() { return ( div Count / hr / Person / /div ); } }index.jsimportReactfromreact;// 引入 React 核心库importReactDOMfromreact-dom;// 引入 ReactDOMimportAppfrom./App;// 引入 App 组件importstorefrom./redux/store;import{Provider}fromreact-redux;ReactDOM.render(Provider store{store}App//Provider,document.getElementById(root),);二、Redux DevTools安装 Edge 浏览器插件Redux DevTools安装redux-devtools-extension依赖pnpminstallredux-devtools-extension2.13.8使用redux-devtools-extension依赖// 该文件专门用于暴露一个 store 对象整个应用只有一个 store 对象import{createStore,applyMiddleware,combineReducers}fromredux;importcountReducerfrom./reducers/count;importpersonReducerfrom./reducers/person;importthunkfromredux-thunk;import{composeWithDevTools}fromredux-devtools-extension;// 汇总所有的 Reducer 变为一个总的 ReducerconstreducercombineReducers({count:countReducer,persons:personReducer,});// applyMiddleware 用于应用基于 Redux 的中间件exportdefaultcreateStore(reducer,composeWithDevTools(applyMiddleware(thunk)));三、React Redux 最终优化1、reduxconstantexportconstINCREMENTincrement;exportconstDECREMENTdecrement;exportconstADD_PERSONadd_person;actionimport{INCREMENT,DECREMENT}from../constant;exportconstcreateIncrementAction(data)({type:INCREMENT,data});exportconstcreateDecrementAction(data)({type:DECREMENT,data});exportconstcreateIncrementAsyncAction(data,time){return(dispatch){setTimeout((){dispatch(createIncrementAction(data));},time);};};import{ADD_PERSON}from../constant;exportconstcreateAddPersonAction(data)({type:ADD_PERSON,data});reducerimport{INCREMENT,DECREMENT}from../constant;constinitState0;exportdefaultfunctioncountReducer(preStateinitState,action){const{type,data}action;switch(type){caseINCREMENT:returnpreStatedata;caseDECREMENT:returnpreState-data;default:returnpreState;}}import{ADD_PERSON}from../constant;constinitState[];exportdefaultfunctionpersonReducer(preStateinitState,action){const{type,data}action;switch(type){caseADD_PERSON:return[...preState,data];default:returnpreState;}}import{combineReducers}fromredux;importcountReducerfrom./count;importpersonReducerfrom./person;exportdefaultcombineReducers({countReducer,personReducer,});storeimport{createStore,applyMiddleware}fromredux;importreducerfrom./reducers;importthunkfromredux-thunk;import{composeWithDevTools}fromredux-devtools-extension;exportdefaultcreateStore(reducer,composeWithDevTools(applyMiddleware(thunk)));2、containerCount 容器组件import { Component } from react; import { createIncrementAction, createDecrementAction, createIncrementAsyncAction } from ../../redux/actions/count; import { connect } from react-redux; class Count extends Component { // 加 increment () { const { value } this.selectNumber; this.props.increment(value * 1); }; // 减 decrement () { const { value } this.selectNumber; this.props.decrement(value * 1); }; // 奇数再加 incrementIfOdd () { const { value } this.selectNumber; const { countReducer } this.props; if (countReducer % 2 ! 0) { this.props.increment(value * 1); } }; // 异步加 incrementAsync () { const { value } this.selectNumber; this.props.incrementAsync(value * 1, 500); }; render() { return ( div h2当前人员数量为{this.props.personCount}/h2 h2当前求和为{this.props.countReducer}/h2 select ref{(c) (this.selectNumber c)} option value11/option option value22/option option value33/option /select nbsp; button onClick{this.increment}/buttonnbsp; button onClick{this.decrement}-/buttonnbsp; button onClick{this.incrementIfOdd}当前求和为奇数再加/buttonnbsp; button onClick{this.incrementAsync}异步加/button /div ); } } export default connect( (state) ({ countReducer: state.countReducer, personCount: state.personReducer.length, }), { increment: createIncrementAction, decrement: createDecrementAction, incrementAsync: createIncrementAsyncAction, }, )(Count);Person 容器组件import { Component } from react; import { nanoid } from nanoid; import { connect } from react-redux; import { createAddPersonAction } from ../../redux/actions/person; class Person extends Component { addPerson () { const name this.nameNode.value; const age this.ageNode.value; const personObj { id: nanoid(), name, age }; this.props.addPerson(personObj); this.nameNode.value ; this.ageNode.value ; }; render() { return ( div h2求和为 {this.props.countReducer}/h2 input ref{(c) (this.nameNode c)} typetext placeholder输入名字 / input ref{(c) (this.ageNode c)} typetext placeholder输入年龄 / button onClick{this.addPerson}添加/button ul {this.props.personReducer.map((p) { return ( li key{p.id} {p.name}--{p.age} /li ); })} /ul /div ); } } export default connect( (state) ({ countReducer: state.countReducer, personReducer: state.personReducer, }), { addPerson: createAddPersonAction, }, )(Person);3、mainApp 组件import{Component}fromreact;importCountfrom./containers/Count;importPersonfrom./containers/Person;exportdefaultclassAppextendsComponent{render(){return(divCount/hr/Person//div);}}index.jsimportReactDOMfromreact-dom;importAppfrom./App;importstorefrom./redux/store;import{Provider}fromreact-redux;ReactDOM.render(Provider store{store}App//Provider,document.getElementById(root),);

相关文章:

React - React Redux 数据共享、Redux DevTools、React Redux 最终优化

一、React Redux 数据共享 1、基本介绍 combineReducers 函数用于汇总所有的 Reducer 变为一个总的 Reducer 2、演示 (1)redux constant // 定义 action 中 type 的常量值export const INCREMENT "increment"; export const DECREMENT "…...

多任务学习进阶:从MMoE到PLE的模型演进与实战解析

1. 多任务学习基础与核心挑战 多任务学习(Multi-Task Learning, MTL)是机器学习领域的一个重要分支,它让单个模型同时学习多个相关任务。想象一下,你正在教一个学生同时学习数学和物理。如果这两个学科有共同的基础概念&#xff0…...

别再只看波形了!用Maxwell+Matlab深度分析电机空载气隙磁密的谐波极对数分布

电机电磁设计进阶:从Maxwell FFT到Matlab谐波极对数分析的工程实践 在电机设计领域,空载气隙磁密的谐波分析一直是评估电磁性能的核心手段。传统方法往往止步于波形观察和简单频谱分析,却忽略了谐波极对数分布这一关键维度——它直接关联着电…...

BEYOND REALITY Z-Image避坑指南:解决生成图片模糊、全黑的常见问题

BEYOND REALITY Z-Image避坑指南:解决生成图片模糊、全黑的常见问题 1. 为什么你的Z-Image生成效果不理想? 当你第一次使用BEYOND REALITY Z-Image时,可能会遇到这样的困扰:明明输入了详细的提示词,生成的图片却要么…...

ComfyUI-FramePackWrapper终极指南:3种AI视频生成模型加载方案深度对比

ComfyUI-FramePackWrapper终极指南:3种AI视频生成模型加载方案深度对比 【免费下载链接】ComfyUI-FramePackWrapper 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-FramePackWrapper 在AI视频生成领域,ComfyUI-FramePackWrapper是一款革…...

网络通信技术基础知识,网络通信技术数据包介绍

网络通信技术是关键技术之一,对于网络通信技术,我们应对其有所了解。为增加大家对网络通信技术的认识,本文将对网络通信技术的数据包结构和原理予以介绍。如果你对网络通信技术存在兴趣,不妨继续往下阅读哦。 在网络通信中, "…...

代码驱动图表:重新定义技术可视化的开源工具革命

代码驱动图表:重新定义技术可视化的开源工具革命 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …...

如何3分钟制作专业证件照?HivisionIDPhotos免费AI工具全攻略

如何3分钟制作专业证件照?HivisionIDPhotos免费AI工具全攻略 【免费下载链接】HivisionIDPhotos ⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。 项目地址: https://gitcode.com/GitHub_Trending/hiv/Hi…...

利用快马平台快速构建技能评估系统原型:以skill-vetter为例

利用快马平台快速构建技能评估系统原型:以skill-vetter为例 最近在做一个前端开发技能评估系统,需要快速验证产品原型。传统开发流程从搭建环境到功能实现至少需要1-2周,但通过InsCode(快马)平台的AI辅助和现成模板,我只用了3天就…...

良久团购报单查单小程序开发

需求分析与规划 明确小程序的核心功能:报单(提交订单)、查单(查询订单状态)、团购管理(商品展示、拼团进度)。 确定用户角色:普通用户(参与团购)、管理员&…...

终极B站界面美化指南:如何用BewlyBewly插件快速打造个性化体验

终极B站界面美化指南:如何用BewlyBewly插件快速打造个性化体验 【免费下载链接】BewlyBewly Just make a few small changes to your Bilibili homepage. (English | 简体中文 | 正體中文 | 廣東話) 项目地址: https://gitcode.com/gh_mirrors/be/BewlyBewly …...

重塑机械键盘体验:ZMK固件的革新之旅与实践指南

重塑机械键盘体验:ZMK固件的革新之旅与实践指南 【免费下载链接】zmk ZMK Firmware Repository 项目地址: https://gitcode.com/gh_mirrors/zm/zmk 在机械键盘的世界里,固件如同键盘的灵魂,决定着它的响应速度、功能拓展性和个性化程度…...

Java中如何实现Excel跨工作表数据复制

本文介绍了如何在Java程序中有效地复制Excel工作表中的数据。许多Java开发人员需要将数据从一个工作表复制到另一个工作表。本文提供了一个代码示例来帮助您解决这个问题。核心是如何在Java中有效地复制Excel工作表中特定区域的数据。下面的例子是使用Java库(具体的…...

Win11Debloat:5分钟解决Windows 11卡顿的终极优化指南

Win11Debloat:5分钟解决Windows 11卡顿的终极优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and cu…...

THE LEATHER ARCHIVE快速体验:一键生成杂志级AI皮衣大片,小白也能当设计师

THE LEATHER ARCHIVE快速体验:一键生成杂志级AI皮衣大片,小白也能当设计师 1. 项目介绍与核心价值 想象一下,你不需要专业的设计技能,就能创造出媲美时尚杂志封面的皮衣设计作品。THE LEATHER ARCHIVE正是这样一个让创意触手可及…...

Wan2.2-I2V-A14B镜像免配置:SSH直连后cd /workspace即可执行全部命令

Wan2.2-I2V-A14B镜像免配置:SSH直连后cd /workspace即可执行全部命令 1. 镜像概述与核心优势 Wan2.2-I2V-A14B私有部署镜像是一款专为文生视频模型定制的开箱即用解决方案。这个镜像最大的特点就是"免配置"——通过SSH连接后,只需进入/works…...

深耕纪实创作 AVG Media 以专业能力赋能纪录片产业发展

在全球内容产业快速迭代的当下,纪录片凭借真实的叙事力量、深厚的人文价值与多元的传播场景,成为内容领域中兼具艺术价值与商业价值的重要载体。国内纪录片行业历经多年发展,形成了多元主体参与、创作方向细分、国际合作深化的行业格局&#…...

Galaxy UI组件库深度解析:3000+开源UI元素的完整实践手册

Galaxy UI组件库深度解析:3000开源UI元素的完整实践手册 【免费下载链接】galaxy The largest Open-Source UI Library! Community-made and free to use. Made with either CSS or Tailwind. 项目地址: https://gitcode.com/gh_mirrors/gal/galaxy 在当今快…...

如何跨越语言盲区,让学术表达精准落地

当我们完成了精妙的实验设计,获得了宝贵的数据,准备向世界展示科研成果时,却常常在“最后一公里”遭遇阻碍。这种阻碍并非源于科研本身的深度,而是来自于语言表达的信心不足与自查盲区。你是否也有过这样的经历:对着屏…...

如何在3分钟内为你的项目生成真实可信的测试姓名数据?

如何在3分钟内为你的项目生成真实可信的测试姓名数据? 【免费下载链接】uinames A simple tool to generate names for use in designs and mockups. 项目地址: https://gitcode.com/gh_mirrors/ui/uinames 你是否曾经为测试数据而烦恼?在开发用户…...

基于WebRTC的P2P文件传输系统:架构设计与实现原理

基于WebRTC的P2P文件传输系统:架构设计与实现原理 【免费下载链接】filepizza :pizza: Peer-to-peer file transfers in your browser 项目地址: https://gitcode.com/GitHub_Trending/fi/filepizza 在当今数字时代,文件传输已成为日常工作和协作…...

Linux性能优化之上下文切换

写在前面 上下文切换因为会导致消耗大量的CPU资源,导致CPU升高,所以上下文切换也是最常见的性能杀手之一。本文就一起来看下这部分内容吧。 1:基础内容介绍 1.1:什么是上下文切换? CPU在执行的时候需要两部分的内容…...

CloudFlare Workers实现高级邮箱转发:过滤垃圾邮件+自动分类实战

CloudFlare Workers实现高级邮箱转发:过滤垃圾邮件自动分类实战 邮箱已经成为现代人工作和生活中不可或缺的工具,但随之而来的垃圾邮件、广告推广和各类通知也让收件箱变得杂乱无章。对于开发者和技术爱好者来说,传统的邮箱转发功能往往不能满…...

让老旧Mac焕发新生:OpenCore Legacy Patcher完整指南

让老旧Mac焕发新生:OpenCore Legacy Patcher完整指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 您的Mac是否被苹果官方"抛弃"&…...

打造企业级 AI Agent:任务编排 + 多工具系统(Python 深度实战)

如果你已经写过简单的 AI Agent,你很快会遇到一个问题:❌ 能跑 Demo,但一到真实业务就崩为什么?因为你缺的不是模型,而是这三样东西:任务编排(Workflow)多工具系统(Tool …...

从静态到动态:开源AI视频生成工具如何用3分钟改变你的创作方式

从静态到动态:开源AI视频生成工具如何用3分钟改变你的创作方式 【免费下载链接】stepvideo-ti2v 项目地址: https://ai.gitcode.com/StepFun/stepvideo-ti2v 在AI技术日新月异的今天,视频创作正经历着一场前所未有的革命。阶跃星辰推出的Step-Vi…...

2026降AI工具实测:性价比/效果/安全选品指南

花了整整一周时间把市面5款主流降AI工具全维度测了一遍,从处理效果、定价、安全性三个核心维度做了横向对比。结论放在最前面:综合实力最强、毕业生首选的是SpeedAI科研小助手,性价比拉满,新手还能免费试用,完全适配绝…...

千问3.5-2B快速部署:Docker镜像一键run,7860端口自动监听,无需端口映射配置

千问3.5-2B快速部署:Docker镜像一键run,7860端口自动监听,无需端口映射配置 1. 千问3.5-2B模型介绍 千问3.5-2B是Qwen系列的小型视觉语言模型,它能够同时理解图片和生成文本。这个模型特别适合需要结合视觉和语言理解的任务场景…...

Pinocchio库初体验:用Python快速验证你的双足机器人模型正逆解

Pinocchio库实战:Python双足机器人正逆运动学快速验证指南 当你第一次打开Pinocchio的文档时,可能会被那些复杂的数学公式和术语吓到。但别担心,我们今天要做的,就是抛开理论直接上手——用不到50行代码,让你的双足机…...

2026年实测10款降AI工具:毕业论文降AIGC哪款最靠谱?

2026年毕业季临近,降低论文AI生成痕迹、通过学校AIGC检测已经成为所有毕业生的必过关卡。但当前降AI工具市场鱼龙混杂:不少用户花了高价处理,AI率却纹丝不动;还有的工具改完的论文语句生硬、逻辑混乱,反而过不了答辩。…...