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

react19【系列实用教程】useReducer(含 useImmerReducer ) —— 升级版的 useState (2026最新版)

useReducer 可看做升级版的 useState ,其强大之处在于,可以自定义复杂的响应式变量修改逻辑。

useReducer 语法

useReducer 是 hook 函数

  • 第一个参数(必要): 自定义的 reducer 函数(详见下文介绍)
  • 第二个参数(必要): 响应式变量的初始值
  • 第三个参数(可选):自定义的 init 函数(详见下文介绍),实现惰性初始化
  • 返回:一个数组,第一项为响应式变量,第二项为 dispatch 方法(详见下文介绍)

范例 – 计数器

import{useReducer}from"react";functioninit(initialCount){return{count:initialCount};}functionreducer(state,action){switch(action.type){case"increment":return{count:state.count+1};case"decrement":return{count:state.count-1};case"reset":returninit(action.payload);default:thrownewError();}}functionCounter({initialCount}){const[state,dispatch]=useReducer(reducer,initialCount,init);return(<>Count:{state.count}<button onClick={()=>dispatch({type:"reset",payload:initialCount})}>Reset</button><button onClick={()=>dispatch({type:"decrement"})}>-</button><button onClick={()=>dispatch({type:"increment"})}>+</button></>);}exportdefaultCounter;

父组件

importCounterfrom"./test.jsx";exportdefaultfunctionIndex(){return(<div><Counter initialCount={0}/></div>);}

范例解析

若用 useState 实现,代码如下:

functionCounter({initialCount}){const[count,setCount]=useState(initialCount);return(<>Count:{count}<button onClick={()=>setCount(initialCount)}>Reset</button><button onClick={()=>setCount(prevCount=>prevCount-1)}>-</button><button onClick={()=>setCount(prevCount=>prevCount+1)}>+</button></>);}

对比可知:

  • useReducer 将响应式变量作为 state 对象的属性来处理
  • setCount 的参数为响应式变量的新值
  • dispatch 的参数为修改响应式变量的逻辑参数,统一在 reducer 中定义具体的处理逻辑

init 函数

用于对响应式变量进行惰性初始化,传入初始值参数,返回响应式变量的初始值。

functioninit(initialCount){return{count:initialCount};}

reducer 函数

描述复杂的响应式变量修改逻辑

  • 第1个参数为:响应式变量
  • 第2个参数为:dispatch 方法传入的参数(内含修改逻辑的关键信息)
  • 返回 state 的新值
functionreducer(state,action){switch(action.type){case"increment":return{count:state.count+1};case"decrement":return{count:state.count-1};case"reset":returninit(action.payload);default:thrownewError();}}

dispatch 方法

用于触发响应式变量的改变

  • 参数为一个对象,内含修改响应式变量的逻辑参数
  • dispatch 方法的执行,实际上是执行 reducer 函数,实现 state 的更新,并触发视图更新。

实战用法 useImmerReducer

实战中使用第三方库 use-immer 中的 useImmerReducer 可以简化写法:

npm i use-immer
import{useImmerReducer}from'use-immer';constinitialState={count:0};functionreducer(draft,action){// 直接修改 draft!switch(action.type){case'ADD':draft.count++;break;case'SUB':draft.count--;}}functionCounter(){const[state,dispatch]=useImmerReducer(reducer,initialState);return(<div>{state.count}<button onClick={()=>dispatch({type:'ADD'})}>+</button></div>);}
http://www.jsqmd.com/news/985226/

相关文章:

  • 单片机毕业设计——基于单片机的太阳能充电照明系统 要怎么设计与实现呢(全程可免费指导)
  • 2026济南黄金回收避坑指南!别再被扣费套路骗钱,内行都选这家正规店 - 奢侈品回收评测
  • 特斯拉行车记录仪视频合并终极指南:一键整合6路摄像头,轻松制作专业行车视频
  • 实测!用NCNN在安卓上跑YOLOv5目标检测,性能优化与内存占用全解析
  • Path of Building PoE2:流放之路2角色构建的终极规划指南
  • 2026免费更换背景软件保姆级教程,手机电脑多款工具手把手教你用 - 办公小帮手
  • 鸡肉调理腌料生产厂家常见问题解答 - 速递信息
  • 从‘装箱问题’到快递打包:用C++模拟优化你的包裹空间(附完整代码)
  • KoboldCPP:如何在Android手机上搭建你的私有AI助手?
  • 如何在GTA5中构建终极安全防护:YimMenu完整使用指南
  • Open UI5 源代码解析之1440:CompVariantSaveAs.js
  • 2026年6月网站制作工具横评:八大产品价格、功能与服务对比 - 比文云BBWEYY餐宝盈
  • 如何在Sublime Text中安装sublime-phpcs?5分钟快速上手教程
  • NanoSAM:边缘计算时代的实时图像分割革命
  • MQTT设置自动重连后,无法自动订阅以前的主题
  • 鞍山黄金回收2026全流程避坑指南 高价变现看这篇 - 润富黄金回收
  • CANN/sip卷积滤波算子API文档
  • 壹家俄餐中央大街店:正宗俄式餐厅/俄餐厅/生日聚会餐厅/网红餐厅/俄餐,深耕哈尔滨,地道风味之选 - 十大品牌榜
  • LLM Engine微调指南:使用自定义数据训练专属大语言模型的完整教程 [特殊字符]
  • Roop换脸终极指南:三步快速上手AI人脸交换技术
  • Lutris游戏安装指南:从零开始,轻松管理您的跨平台游戏库
  • audioMotion-analyzer多实例应用:构建复杂音频可视化系统的最佳实践
  • 3步实战指南:从海量Python库中快速筛选出最适合你的工具
  • gitee 怎么修改用户名和密码
  • JUCE实战指南:如何构建跨平台音频应用的智能元数据管理系统
  • 如何快速上手ER存档编辑器:艾尔登法环玩家的终极工具指南
  • Polyglot-Ko-1.3B安全与伦理考量:防止偏见与敏感内容生成的终极指南 [特殊字符]️
  • 2026年郑州石英石大板源头工厂怎么选?一手货源直供对比与采购避坑指南 - 年度推荐企业名录
  • 2026新疆旅游必看|10位零差评本地持证导游,纯玩靠谱,玩转南北疆不踩坑 - 盛世西域旅行
  • d3-scale-chromatic 在现代Web应用中的集成:React、Vue、Angular框架适配