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

  • 抖音规定只能录15秒吗(抖音只能录视频不能拍照吗)

    抖音规定只能录15秒吗(抖音只能录视频不能拍照吗)

  • 怎样设置excel自动计算平均值(怎样设置excel自动保存时间)

    怎样设置excel自动计算平均值(怎样设置excel自动保存时间)

  • 苹果数据线第四个触点(苹果数据线第四个触点发黑)

    苹果数据线第四个触点(苹果数据线第四个触点发黑)

  • 夏天手机充电很慢(夏天手机充电很烫怎么办)

    夏天手机充电很慢(夏天手机充电很烫怎么办)

  • 华为手机用的是北斗定位吗(华为手机用的是什么处理器)

    华为手机用的是北斗定位吗(华为手机用的是什么处理器)

  • 华为畅享10plus屏幕尺寸(华为畅享10plus屏幕是lcd吗)

    华为畅享10plus屏幕尺寸(华为畅享10plus屏幕是lcd吗)

  • 抖音喜欢里隐藏了一个无效视频怎么找到(抖音喜欢里隐藏了一个无效视频是什么意思)

    抖音喜欢里隐藏了一个无效视频怎么找到(抖音喜欢里隐藏了一个无效视频是什么意思)

  • qq排麦是什么意思(qq直播间里什么叫排麦)

    qq排麦是什么意思(qq直播间里什么叫排麦)

  • 连接蓝牙能看到对方手机吗(连接蓝牙能看到手机内容吗)

    连接蓝牙能看到对方手机吗(连接蓝牙能看到手机内容吗)

  • 抖音短视频收藏了在哪里可以找到(抖音短视频收藏的视频怎么删除)

    抖音短视频收藏了在哪里可以找到(抖音短视频收藏的视频怎么删除)

  • 京东的扫一扫在哪(京东扫一扫在哪登陆)

    京东的扫一扫在哪(京东扫一扫在哪登陆)

  • 手机app闪退怎么办(手机app 闪退)

    手机app闪退怎么办(手机app 闪退)

  • qq聊天图片怎么删除(qq聊天图片怎么设置不自动下载)

    qq聊天图片怎么删除(qq聊天图片怎么设置不自动下载)

  • hlkaloo是什么型号(hlke是什手机)

    hlkaloo是什么型号(hlke是什手机)

  • 微信仅聊天什么意思(微信仅聊天什么界面)

    微信仅聊天什么意思(微信仅聊天什么界面)

  • vivo手机手电筒快捷键在哪里(vivo手机手电筒打不开怎么办)

    vivo手机手电筒快捷键在哪里(vivo手机手电筒打不开怎么办)

  • iphone11都是双卡吗(iphone11是双卡的不)

    iphone11都是双卡吗(iphone11是双卡的不)

  • xsmax怎么插双卡(苹果xsmax怎么插两张卡的)

    xsmax怎么插双卡(苹果xsmax怎么插两张卡的)

  • 淘宝收的红包在哪里看(淘宝收的红包在哪里查看)

    淘宝收的红包在哪里看(淘宝收的红包在哪里查看)

  • 微信语音聊天如何录音(微信语音聊天如何转发给别人)

    微信语音聊天如何录音(微信语音聊天如何转发给别人)

  • Win7系统激活的操作步骤是什么(win7操作系统激活)

    Win7系统激活的操作步骤是什么(win7操作系统激活)

  • 打开资源管理器后直接显示“我的电脑”(怎么打开资源管理器)

    打开资源管理器后直接显示“我的电脑”(怎么打开资源管理器)

  • 记录--一道字节面试题引出的this指向问题(一字节的范围)

    记录--一道字节面试题引出的this指向问题(一字节的范围)

  • 个税申报显示无有效的税费种认定信息已核定
  • 白酒和烟草 纳税总额
  • 以前损益年度调整
  • 房租收入怎么报税
  • 联营企业属于企业吗
  • 先报税还是先清卡反写
  • 增值税发票税控开票软件打不开
  • 成立一个新公司的步骤
  • 去年多计提了费用今年怎么办
  • 银行扣除的贴现利息怎么算
  • 工企业用地土地使用税怎么征收?
  • 哪些费用可以进项抵扣
  • 支付的水电费属于什么会计科目
  • 进口关税发票账务处理如何进行?
  • 怎么作废未使用的发票
  • 所得税的费用限额怎么算
  • 房地产公司需要和哪些部门打交道
  • 淘宝店铺毛利率多少是正常
  • 不用开票的收入有哪些
  • 持有至到期投资减值准备
  • 员工旅游计入什么费用
  • 事业单位非税收入怎么做账
  • 印花税的会计处理是什么
  • 【免费】多种方法手把手教你如何将自己做的网页做成网络链接(直接访问)
  • 如何给宽带加速使用
  • PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
  • 公司注册资金存在风险吗
  • 分级核算下的建议有哪些
  • 月底增值税怎么计提
  • SchSvr.exe - SchSvr是什么进程 有什么作用
  • php最好的编程语言
  • 计入当期损益的利得分录
  • php curl_exec
  • react reducer详解
  • 【机器学习面试总结】————(一)
  • php弹出登录框
  • 空白发票作废怎么剪角
  • 补充医疗保险属于什么
  • 帝国cms功能
  • 如何查询发票领购日期
  • 出租人在融资租赁中需要处理的会计问题
  • 所得税做账是否需要发票
  • 普票需要填写全额发票吗
  • 员工领了备用金怎么办
  • 工资包含福利费吗
  • access数据库用户名和密码
  • 个人所得税如何纳税
  • centos彻底删除文件
  • 应付账款不需要支付了会计怎么处理
  • 给客户送礼计入成本吗
  • 自产产品用于业务招待费
  • 制造费用的归集是什么意思
  • 单位定期存款如遇利率调整,不论调高调低
  • 周转材料期末余额怎么算
  • 收到银联代收短信
  • 财务负责人怎么实名认证
  • 发票已开后 对方公司名称变更怎么处理?
  • 企业偿债能力的含义
  • 个体工商户怎样申请开票
  • 私人公司盈利怎么把钱拿出来
  • vmware img镜像
  • win8开始在哪里
  • imgconv.exe进程
  • windows xp的控制面板
  • win7如何查询电脑使用记录
  • windows更新后桌面没反应
  • WIN10系统安装.net报错0x80072f8F
  • javascript 引入
  • 深入理解ffmpeg pdf
  • text date excel
  • android真机调试解析包错误
  • 脚本语言教程
  • js 对象声明
  • js获取当前日期并格式化
  • android 启动器 设置
  • python字符串怎么用
  • 炉石传说用什么语言开发的
  • shell脚本生成文件
  • android(8) ViewPager页面滑动切换
  • 环保税征税范围噪音
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设