位置: IT常识 - 正文

React--》useReducer的讲解与使用(react reducer详解)

编辑:rootadmin
React--》useReducer的讲解与使用

目录

useReducer的使用

刨析useReducer参数

useReducer的使用


useReducer的使用

推荐整理分享React--》useReducer的讲解与使用(react reducer详解),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:react-resume-site,react reduce,react sentry,react se,react-rewired,react reducers,react se,react reducer,内容如对您有帮助,希望把文章链接给更多的朋友!

在React函数式组件中,我们可以通过useState()来创建state,这种state创建方式会给我们返回两个东西state和setState()。state用来读取数据,而setState()用来设置修改数据,但这种方法也存在着一些不足,因为所有的修改state方式都必须通过setState()来进行,如果遇到一些复杂度比较高的state时,这种方式就变得有些繁琐了。

为了解决复杂state带来的不便,React为我们提供了一个新的使用state方式,当你的state过于复杂时,你就可以使用对state整合的工具 “Reducer” ,其作用就是将那些和同一个state相关的所有函数都整合到一起,方便在组件中进行调用。

注意:Reducer只适合那些比较复杂的state,对于简单的state使用Reducer只能是徒增烦恼,以下都会用简单的例子来说明Reducer的使用。

刨析useReducer参数

useReducer实际上算是useState的升级版,虽然使用比useState复杂,但其能够应付更加繁琐的应用场景,其接收的参数有三个,接下来将详细刨析useReducer这个Hooks的使用,Reducer和State相同也是一个钩子函数,其语法格式如下:

const [state, dispatch] = useReducer(reducer, initialArg, init?)

数组中第一个参数:用来获取state的值;数组中第二个参数:state修改的派发器,通过派发器可以发送操作state的命令,具体的修改行为将会由另外一个函数执行。

reducer参数:用于指定如何更新状态。它必须函数,应该将状态数据和操作方法作为参数,并且应该返回下一个状态。状态和动作可以是任何类型。即:(state,action) => newState

state:是当前最新的状态值

action:用于告诉reducer当前执行的操作,reducer会根据不同的操作执行不同的逻辑

React--》useReducer的讲解与使用(react reducer详解)

newState:返回值,返回一个新的state

initialArg参数:用于计算初始状态的值,即为state的初始值,作用和useState()中的值是一样的,它可以是任何类型的值。如何从中计算初始状态取决于下一个init参数。

init参数:可选参数,本质上是一个函数,参数是初始的state,如果传入这个参数的话,那么初始state就是init(initState)的返回结果。通俗来讲就是:应该返回初始状态的初始值设定项函数。如果未指定,则初始状态设置为initialArg。否则,初始状态被设置为调用init(initialArg)的结果。

useReducer的使用

在 官方文档案例 中,已经很明确的告诉我们如何使用useReducer,如下:

官方文通过将reducer函数抽离出来去管理状态的变化,根据传入action的不同返回新的状态,我们在点击按钮时会调用dispatch函数,并传入一个包含type属性的对象即action,这个对象表示将要进行的状态更新操作。

接下来举一个简单的计数器的案例,来比较一下使用Reducer和未使用的区别在哪里。

传统操作State的方法为:

import React,{ useState } from 'react'const App = () => { const [num,setNum] = useState(0) const addHandler = () =>{ setNum(prenum => prenum + 1) } const subHandler = () =>{ setNum(prenum => prenum -1) } return ( <div style={{fontSize:'30px',padding:'50px'}}> <button onClick={addHandler}>加1</button> {num} <button onClick={subHandler}>减1</button> </div> )}export default App

使用Reducer操作state方法为:

import React,{ useReducer } from 'react'const App = () => { // reducer函数 state:当前最新状态值、action:当前执行的操作 const reducer = (state,action) =>{ switch(action.type){ case 'ADD': return state + 1 case 'SUB': return state - 1 default: return state } } const [num,numDispatch] = useReducer(reducer,0) const addHandler = () =>{ numDispatch({type:'ADD'}) } const subHandler = () =>{ numDispatch({type:'SUB'}) } return ( <div style={{fontSize:'30px',padding:'50px'}}> <button onClick={addHandler}>加1</button> {num} <button onClick={subHandler}>减1</button> </div> )}export default App

当然如果是非常简单的state,使用useState是明智的选择,但在某些场景下,例如 state 逻辑较复杂且包含多个子值,或者下一个 state 依赖于之前的 state 等。useReducer会更加适用,使用 useReducer 还能给那些会触发深更新的组件做性能优化,因为你可以向子组件传递 dispatch 而不是回调函数 。如下:

import { useReducer } from 'react';function reducer(state, action) { switch (action.type) { case 'incremented_age': { return { name: state.name, age: state.age + 1 }; } case 'changed_name': { return { name: action.nextName, age: state.age }; } default: return null }}const initialState = { name: 'Taylor', age: 42 };export default function App() { const [state, dispatch] = useReducer(reducer, initialState); function handleButtonClick() { dispatch({ type: 'incremented_age' }); } function handleInputChange(e) { dispatch({ type: 'changed_name', nextName: e.target.value }); } return ( <> <input value={state.name} onChange={handleInputChange} /> <button onClick={handleButtonClick}> +1 </button> <p>Hello, {state.name}. You are {state.age} years old</p> </> );}

无论是useState还是useReducer,都是为了帮助我们的管理组件的状态 ,但如果你的项目比较复杂,后期要经常加以维护的话,选择useReducer或许是一个不错的选择。

本文链接地址:https://www.jiuchutong.com/zhishi/295380.html 转载请保留说明!

上一篇:Css之使用calc()计算宽高(vw/vh)(css calculate)

下一篇:Segment Anything Model (SAM)——分割一切,具有预测提示输入的图像分割实践(segment anything model github)

  • 电脑密码忘记了怎么解开(电脑密码忘记了找人解开要多少钱?)

    电脑密码忘记了怎么解开(电脑密码忘记了找人解开要多少钱?)

  • 苹果13怎么设置电源键关机(苹果13怎么设置动态壁纸)

    苹果13怎么设置电源键关机(苹果13怎么设置动态壁纸)

  • 智行火车票加速包能把钱退回来吗(智行火车票加速包在哪里看)

    智行火车票加速包能把钱退回来吗(智行火车票加速包在哪里看)

  • 支付宝收藏的图片在哪里(支付宝收藏的图片怎么保存到相册)

    支付宝收藏的图片在哪里(支付宝收藏的图片怎么保存到相册)

  • 充电口进水了充不上电(充电口进水了充电烧焦了怎么办)

    充电口进水了充不上电(充电口进水了充电烧焦了怎么办)

  • 12306账号是手机号码吗(12306账号手机号和身份证不符合怎么办)

    12306账号是手机号码吗(12306账号手机号和身份证不符合怎么办)

  • 快手背景图为什么不显示(快手背景图为什么自己变了)

    快手背景图为什么不显示(快手背景图为什么自己变了)

  • 怎么防止烧屏(怎么解决烧屏问题)

    怎么防止烧屏(怎么解决烧屏问题)

  • 完整的计算机系统同时包括( )(完整的计算机系统)

    完整的计算机系统同时包括( )(完整的计算机系统)

  • 苹果手机facetime通话是什么意思(苹果手机facetime通话收费吗)

    苹果手机facetime通话是什么意思(苹果手机facetime通话收费吗)

  • wan端口是什么意思(wan端口都是0)

    wan端口是什么意思(wan端口都是0)

  • 电脑上的聊天记录怎么导入手机(电脑上的聊天记录怎么彻底删除)

    电脑上的聊天记录怎么导入手机(电脑上的聊天记录怎么彻底删除)

  • 微信电费几天更新一次(微信电费什么时候到账)

    微信电费几天更新一次(微信电费什么时候到账)

  • word除号横线怎么打(文档中除号怎么变横线)

    word除号横线怎么打(文档中除号怎么变横线)

  • ps怎么加粗线条(怎样在ps中加粗线条)

    ps怎么加粗线条(怎样在ps中加粗线条)

  • Apple Watch Series5怎么删除应用

    Apple Watch Series5怎么删除应用

  • wps做完没保存怎么找回来(wps做完的文档没保存能找到吗)

    wps做完没保存怎么找回来(wps做完的文档没保存能找到吗)

  • 高德地图怎么开支付分(高德地图怎么开电子发票)

    高德地图怎么开支付分(高德地图怎么开电子发票)

  • 微信双击顶部不能返回是什么原因(微信双击置顶怎么用不了了)

    微信双击顶部不能返回是什么原因(微信双击置顶怎么用不了了)

  • 显示器当电视音响插哪(显示屏变电视如何连接音响)

    显示器当电视音响插哪(显示屏变电视如何连接音响)

  • 解决网卡驱动故障,宽带连接错误651(解决网卡驱动故障的方法)

    解决网卡驱动故障,宽带连接错误651(解决网卡驱动故障的方法)

  • 感知机算法之Python代码实现(感知机算法python)

    感知机算法之Python代码实现(感知机算法python)

  • 应交税费负数调整到其他非流动资产
  • 购物税费怎么算
  • 居民企业参股外国企业信息报告表怎么删除
  • 劳务派遣公司简介模板范文
  • 广告业务增值税税率
  • 银行存款支付现金股利属于什么科目
  • 销售返利增值税按哪个税率
  • 不是单位职工个税怎么算
  • 职工在异地住院怎么报销
  • 工程预收款如何处理
  • 上月暂估收入本月开票增值税实操
  • 应交税费核算的税金有哪些
  • 公司给员工发的工资要交税吗
  • 营改增后停车费税率
  • 清洁服务经营范围有哪些
  • 年收入12万申报人数
  • 税控盘开票流程图解2022
  • 物业管理公司销售岗位职责
  • 非学历教育培训费发票
  • 支票进账对方没钱开户行会打电话叫他存钱吗?
  • 未取得房产证的房子如何迁户口
  • 个人股权转给公司要交个税吗
  • 不征收增值税的项目有哪些
  • 使窗口最小化的快捷键
  • 商贸公司不开发票还要上税吗
  • WIN10显示缩略图
  • win11怎么打开虚拟内存
  • 完税证明和纳税申报表是一种东西吗
  • 电力安装工程辅料有哪些
  • win10投影无反应
  • 预收房租需要缴纳个税么
  • 深度学习模型精度fp16和fp32
  • lmgrd.exe是什么进程
  • redistemplate获取value
  • 解决脱发的8个方法
  • ros机器人自主导航中膨胀地图图层的颜色
  • JavaScript ,18种常用数组方法,快来看看你会吗?
  • vue3.0中的ref
  • 划水划水划水表情包
  • 增值税申报表期初未缴税额
  • 入库单正确填写方法
  • 专项储备计提和使用理解
  • 兼职会计人员的职责
  • 企业取得投资收益要交税吗
  • 技术服务费可以计入成本吗
  • 摊余成本通俗易懂
  • 施工企业预估成本怎么算
  • 预收账款怎么处理
  • 增值税专用发票怎么开
  • 企业计提任意盈余公积的比例
  • 私车公用涉及的税种有哪些
  • 购买材料发生商损怎么算
  • 出差开会总结怎么写
  • 企业发生亏损时,下列各项,( )是弥补亏损的渠道
  • 工业企业生产什么
  • mysql 索引 语句
  • sql必知必会第四版
  • 搜狗拼音输入法xp系统
  • win102021年1月大更新
  • win10系统如何给d盘加密
  • winxp系统界面图片
  • 怎么改电脑windows7
  • Win10 UWP红石版应用商店迎来更新:查找更新再换位置
  • win10系统笔记本怎么连接wifi
  • opengl配置vc6.0
  • mysql如何将查询结果输出到文件
  • shell中判断文件是否存在
  • cd跳转不到目录
  • android检测网络差
  • 世界坐标转换成屏幕坐标
  • unity ui批处理
  • java scripts
  • python3获取本机ip
  • 让你略表情包
  • 高博应诺官网
  • linux中安装python的工具包
  • 四川国税发票查询验证
  • 沈阳地方税务局原局长
  • 税务异常处理
  • 宁波新注册公司什么时候开始报税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设