位置: 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)

  • 营销型网站应该具备的功能(营销型网站建设应该考虑哪些因素)

    营销型网站应该具备的功能(营销型网站建设应该考虑哪些因素)

  • 支付宝银行卡余额查询(支付宝银行卡余额查询手机怎么查)

    支付宝银行卡余额查询(支付宝银行卡余额查询手机怎么查)

  • 雅迪dq6怎么绑定手机(雅迪dq6怎么绑定苹果手机nfc)

    雅迪dq6怎么绑定手机(雅迪dq6怎么绑定苹果手机nfc)

  • 苹果手机静音怎么打电话才能响(苹果手机静音怎么不震动)

    苹果手机静音怎么打电话才能响(苹果手机静音怎么不震动)

  • ipad第五代是哪款(iPad第五代是哪年生产的)

    ipad第五代是哪款(iPad第五代是哪年生产的)

  • 苹果11屏幕左侧一条绿线(苹果11屏幕左侧出现一条阴影怎么回事呢)

    苹果11屏幕左侧一条绿线(苹果11屏幕左侧出现一条阴影怎么回事呢)

  • 优酷上传视频审核要多久(优酷上传视频审核时间多久)

    优酷上传视频审核要多久(优酷上传视频审核时间多久)

  • 苹果截屏是白色是怎么回事(苹果截屏白色的看不到)

    苹果截屏是白色是怎么回事(苹果截屏白色的看不到)

  • 电脑打印需要下载什么软件(电脑打印需要下什么驱动)

    电脑打印需要下载什么软件(电脑打印需要下什么驱动)

  • 录屏最多录多长时间(录屏最多录多长时间华为)

    录屏最多录多长时间(录屏最多录多长时间华为)

  • 微信只有打开才能接收到消息(微信只有打开才能接收到消息和视频)

    微信只有打开才能接收到消息(微信只有打开才能接收到消息和视频)

  • soul聊天状态异常 消息发送失败(soul当前聊天状态异常消息发送失败什么情况啊)

    soul聊天状态异常 消息发送失败(soul当前聊天状态异常消息发送失败什么情况啊)

  • nova属于华为高端机吗(nova系列属于)

    nova属于华为高端机吗(nova系列属于)

  • com.tencent.mm是什么文件夹(com.tencent.mm可以删吗)

    com.tencent.mm是什么文件夹(com.tencent.mm可以删吗)

  • 一个手机号能注册几个lofter(一个手机号能注册几个QQ)

    一个手机号能注册几个lofter(一个手机号能注册几个QQ)

  • 升级驱动会不会影响电脑(升级驱动有什么好处)

    升级驱动会不会影响电脑(升级驱动有什么好处)

  • 微博怎么关注通讯录好友(如何在微博关注通讯录好友)

    微博怎么关注通讯录好友(如何在微博关注通讯录好友)

  • ip53防水等级什么概念(ip53 防水等级)

    ip53防水等级什么概念(ip53 防水等级)

  • 华为手机儿童模式在哪

    华为手机儿童模式在哪

  • iphone怎么换qq主题(苹果怎么换qq)

    iphone怎么换qq主题(苹果怎么换qq)

  • 从哪里申请快手商家号(从哪里申请快手号)

    从哪里申请快手商家号(从哪里申请快手号)

  • iphone怎么截长图(iphone怎么截长图聊天记录)

    iphone怎么截长图(iphone怎么截长图聊天记录)

  • pr如何给视频添加音频(pr如何给视频添加背景)

    pr如何给视频添加音频(pr如何给视频添加背景)

  • 淘宝乡村版怎么设置(淘宝乡村版怎么返回标准版)

    淘宝乡村版怎么设置(淘宝乡村版怎么返回标准版)

  • 燕秀工具箱有什么功能(燕秀工具箱使用教程)

    燕秀工具箱有什么功能(燕秀工具箱使用教程)

  • iphoneX的屏幕是玻璃吗(iphonex的屏幕是什么屏)

    iphoneX的屏幕是玻璃吗(iphonex的屏幕是什么屏)

  • 应交税费是什么科目
  • 销售不动产营业税纳税义务发生时间
  • 合并报表逆流抵消
  • 建筑公司跨区域迁入
  • 个人所得税定额扣除怎样理解
  • 买入空调会计分录
  • 弥补上年度亏损
  • 企业稳岗补贴怎么查
  • 土建工程管理费取费基数
  • 不进行工商登记会怎样
  • 行政事业单位凭证培训课件
  • 公司收的保证金可以打入私人账户吗
  • 长期投资计提减值准则
  • 进项税额转出后续处理
  • 购买的厂房怎样交税
  • 房地产不可销售的物业有哪些
  • 本月只有红字发票该怎么申报小规模
  • 停车场如何申领车牌号
  • 所得税按利润总额的25%计算缴纳
  • 记账凭证的分类和基本内容
  • 补缴以前年度税款
  • 车船使用税计缴标准
  • 公司注销了是不是就不能用了
  • 企业利息收入如何做分录
  • 全额抵免的计算
  • win10如何删除windows账户
  • bios设置密码有什么用
  • 如何安装react
  • 以前年度的费用可以入在当年吗?
  • 笔记本怎么开wifi
  • 设置bios 密码
  • 发票跨年作废很麻烦吗
  • 企业支付银行的贷款利息可以税前扣除吗为什么
  • 特种商品劳务税
  • php基于正则批量输出
  • php对象的概念
  • php调试函数
  • 天猫提现到对公账户怎么做账
  • 所得税季报本月数是指
  • 其他综合收益科目有哪些
  • 合同补充协议印花怎么写
  • 残保金的计费依据
  • 垃圾费放在哪个会计科目
  • 什么是企业年报 汇算 加计
  • 暂估入库会计
  • 专票信息开户行少了一个字
  • 汽车折旧年限是几年如何计算
  • mysql数据库最新版
  • 国税联网状态怎么没显示
  • 增值税发票过了两个月怎么作废
  • 支出应计入管理费用,而且要根据其发生额
  • 跨年发生退货税务处理
  • 年度亏损计提所得税吗
  • 房租收入如何缴纳增值税
  • 冲销上年多计提费用
  • 个体工商户生产经营所得税优惠政策
  • 进项转出分录需要盖章吗
  • 涉外收入申报单怎么填
  • 企业薪资制度
  • 外币应收账款汇兑损失计入财务费用吗
  • 工程招标费用由谁支付
  • 公司有主营业务收入没有主营业务成本
  • 私企银行有哪几家
  • mysql的用户管理与权限管理
  • windows8怎么用
  • win10系统玩游戏卡
  • windows8怎么使用
  • win8.1锁屏壁纸设置
  • node链接数据库
  • linux查找目录的命令
  • 一键删除通讯录联系人
  • jquery的实现原理
  • 如何进行arp病毒防范
  • 用vue做项目加入购物车是怎么做到的
  • jquery获取值的几种方法
  • ansible客户端需要装python
  • jquery 列表实现
  • 税务官网怎么登录账号
  • 电子税务局app扫脸认证
  • 2014年房产税征收标准
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设