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

  • iphone11可以升级ios15吗(iphone11可以升级ios16.1.1吗)

    iphone11可以升级ios15吗(iphone11可以升级ios16.1.1吗)

  • iphone12双卡短信怎么区分(iphone12双卡短信收不到)

    iphone12双卡短信怎么区分(iphone12双卡短信收不到)

  • 花呗升级入口在哪(花呗升级入口在哪儿)

    花呗升级入口在哪(花呗升级入口在哪儿)

  • 网易邮箱绑定手机号怎么解绑(网易邮箱绑定手机号失败是怎么回事)

    网易邮箱绑定手机号怎么解绑(网易邮箱绑定手机号失败是怎么回事)

  • 钉钉直播时可以分享手机屏幕吗(钉钉直播时可以听歌吗)

    钉钉直播时可以分享手机屏幕吗(钉钉直播时可以听歌吗)

  • 1660ti和2060差距(1660ti和2060区别)

    1660ti和2060差距(1660ti和2060区别)

  • 户户通模块异常m11怎么办(户户通模块异常m11怎么处理)

    户户通模块异常m11怎么办(户户通模块异常m11怎么处理)

  • 华为手机怎么查询是不是新的(华为手机怎么查型号)

    华为手机怎么查询是不是新的(华为手机怎么查型号)

  • 淘宝直播在哪里取消关注(淘宝直播在哪里看回放)

    淘宝直播在哪里取消关注(淘宝直播在哪里看回放)

  • 当前通话对方网络不佳是怎么回事(当前通话对方网络不佳微信)

    当前通话对方网络不佳是怎么回事(当前通话对方网络不佳微信)

  • 微信证件号格式是什么(微信证件号格式怎么写)

    微信证件号格式是什么(微信证件号格式怎么写)

  • 微博好友圈在哪(微博好友圈在哪里看)

    微博好友圈在哪(微博好友圈在哪里看)

  • 朋友圈仅聊天还能看到对方朋友圈吗(朋友圈仅聊天还能看到背景图吗?)

    朋友圈仅聊天还能看到对方朋友圈吗(朋友圈仅聊天还能看到背景图吗?)

  • 淘宝购物分怎么算(淘宝购物分怎么加)

    淘宝购物分怎么算(淘宝购物分怎么加)

  • 怎么让手机不震动(怎么让手机不震动也没声音小米)

    怎么让手机不震动(怎么让手机不震动也没声音小米)

  • 微信属于腾讯大王卡吗(微信是属于腾讯的)

    微信属于腾讯大王卡吗(微信是属于腾讯的)

  • 电脑睡眠后怎么唤醒(电脑休眠后黑屏怎么唤醒)

    电脑睡眠后怎么唤醒(电脑休眠后黑屏怎么唤醒)

  • 程序的基本结构(程序的基本结构包括)

    程序的基本结构(程序的基本结构包括)

  • 访客网络和主人网络区别(访客网络和主人网络ip一样吗)

    访客网络和主人网络区别(访客网络和主人网络ip一样吗)

  • 华为p9有OTG功能吗(华为p9手机ot g在哪儿打开)

    华为p9有OTG功能吗(华为p9手机ot g在哪儿打开)

  • 隐藏会话关联qq看得到吗(隐藏会话关联qq会显示未读吗)

    隐藏会话关联qq看得到吗(隐藏会话关联qq会显示未读吗)

  • 手机优酷在哪加好友(手机优酷在哪加字幕)

    手机优酷在哪加好友(手机优酷在哪加字幕)

  • 苹果x屏幕不灵敏是什么原因(苹果x手机屏不灵敏怎么办)

    苹果x屏幕不灵敏是什么原因(苹果x手机屏不灵敏怎么办)

  • 如何打出题目中的下横线(题目怎么打)

    如何打出题目中的下横线(题目怎么打)

  • 如何在手机上登录智慧团建(如何在手机上登录两个微信)

    如何在手机上登录智慧团建(如何在手机上登录两个微信)

  • 怎么查看亲属卡余额(怎么查看亲属卡消费明细)

    怎么查看亲属卡余额(怎么查看亲属卡消费明细)

  • ipad电池寿命检测(ipad电池寿命度怎么看)

    ipad电池寿命检测(ipad电池寿命度怎么看)

  • 海贝音乐怎么用(海贝音乐怎么用自己的封面)

    海贝音乐怎么用(海贝音乐怎么用自己的封面)

  • 苹果7home键不会震动了(iphone7home键没反应)

    苹果7home键不会震动了(iphone7home键没反应)

  • 跨年的所得税会计分录
  • 广告费的明细
  • 单位参加社保必须全员全额申报吗
  • 转让名额协议
  • 消费税的征收方式是代收代缴
  • 免税企业取得增值税专用发票怎么处理
  • 个人开机械租赁发票需要什么
  • 以现金形式发放的员工餐费补贴,可并入职工福利费
  • 印花税按主营业务成本计算吗
  • 票据贴现手续费发票可以抵扣吗
  • 企业为职工负担的个人所得税是什么意思
  • 电商平台收取的手续费
  • 一般纳税人增值税结转账务处理
  • won11安全启动
  • 建筑业 分包
  • 土地使用税如何终止申报
  • 中投公司投资的股票
  • PHP:stream_get_meta_data()的用法_Stream函数
  • 微软win11预览版
  • 私营公司股权转让
  • php获取文件名
  • php新手入门教程
  • php1 zybdjx
  • 购入旧的固定资产的入账价值
  • 武陵山脉海拔
  • 对于个体工商户不需要满足累计经营三个月以上的条件
  • 购买支票费用计入
  • PHP new static 和 new self详解
  • 建信融通e信通贴现几天到账
  • 一般纳税人公司出售旧车怎么开票
  • vue的路由器
  • 百分之十三增值税发票能抵扣多少?
  • 企业购买机器设备没有发票怎么办
  • 未分配利润是负数是亏损吗
  • ubuntu下mysql版本升级到5.7
  • mongotemplate 分页查询
  • 资本公积的用途主要用于
  • 不良资产处置公司违法吗
  • 超市出租摊位交什么税
  • 现金支付有借款利息吗
  • 营改增后建筑劳务分包开票一般几个点
  • 股权转让如何缴纳个人所得税举例说明
  • 临时设施属于什么科目
  • 工厂投产前的准备工作有哪些
  • 年底本年利润如何处理
  • 变更公司名称后银行如何做
  • 商业批发是什么意思
  • sqlserver查询数据库数据量
  • windows任务管理器打不开
  • fedora安装中文语言包
  • 局域网 打印机 共享
  • 重装系统后没声音怎么解决win7
  • windows7能玩地下城吗
  • w8系统怎么连接投影仪
  • win7升win8要钱吗
  • win7右下角小喇叭
  • win8 怎么样
  • win10系统经常弹出广告页面怎么解决
  • Linux安装anaconda
  • 如何解决android代码红线
  • apache部署项目
  • XMLHttpRequest Level 2 使用指南
  • Node.js中的construct
  • android动态添加fragment
  • 原生js实现ajax步骤
  • 详细解读了
  • 三个文件怎么汇总到一个里
  • node.js介绍
  • python 字符
  • js如何获取当前页面的url
  • 仿百度首页html代码静态
  • PYTHON使用缩进来体现代码之间的逻辑关系
  • 编程 delphi
  • 内蒙古物业费收取标准2020
  • 广西职称申报系统入口220
  • 公共暖气管道维修费用由谁承担
  • 济南市土地使用税申报表怎样作废
  • 电影失眠详细剧情
  • 江苏省国税客服电话
  • 国税税票在哪里打印
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设