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

  • 新手卖家店铺基本的推广技巧(新手卖家店铺基本要求)

    新手卖家店铺基本的推广技巧(新手卖家店铺基本要求)

  • oppo手机步数怎么设置在锁屏上(oppo手机步数怎么到微信运动)

    oppo手机步数怎么设置在锁屏上(oppo手机步数怎么到微信运动)

  • 苹果13怎么切换主副卡(苹果13怎么切换卡1卡2)

    苹果13怎么切换主副卡(苹果13怎么切换卡1卡2)

  • opporeno7微信视频美颜怎么设置(opporeno7微信视频来电不显示)

    opporeno7微信视频美颜怎么设置(opporeno7微信视频来电不显示)

  • 淘宝开店的原因怎么写(淘宝开店的原因及梦想)

    淘宝开店的原因怎么写(淘宝开店的原因及梦想)

  • 手机wps怎么搜索关键字?(手机wps怎么搜索内容)

    手机wps怎么搜索关键字?(手机wps怎么搜索内容)

  • 软碟通u盘必须fat32格式吗(软碟通制作u盘启动盘之后能装其它文件吗)

    软碟通u盘必须fat32格式吗(软碟通制作u盘启动盘之后能装其它文件吗)

  • 小米air2和2s有什么区别(小米air2和2s对比)

    小米air2和2s有什么区别(小米air2和2s对比)

  • soul群聊功能显示不出来(soul显示群聊状态是什么意思)

    soul群聊功能显示不出来(soul显示群聊状态是什么意思)

  • 朋友圈里的图片怎么删掉(朋友圈里的图片怎么保存到相册里)

    朋友圈里的图片怎么删掉(朋友圈里的图片怎么保存到相册里)

  • 启用网络发现保存不了(启用网络发现保存后打开又是关闭状态)

    启用网络发现保存不了(启用网络发现保存后打开又是关闭状态)

  • 安全补丁级别日期什么意思(安全补丁级别日期是出厂日期吗)

    安全补丁级别日期什么意思(安全补丁级别日期是出厂日期吗)

  • 微信语音最多发多少秒(微信语音最多发多久)

    微信语音最多发多少秒(微信语音最多发多久)

  • 苹果11如何强制关机(苹果11如何强制刷机)

    苹果11如何强制关机(苹果11如何强制刷机)

  • ipad微信已登录是什么意思(iPad微信已登录,但是设备是离线状态)

    ipad微信已登录是什么意思(iPad微信已登录,但是设备是离线状态)

  • 电脑平均值怎么操作(电脑平均值怎么算)

    电脑平均值怎么操作(电脑平均值怎么算)

  • 两个airpods怎么共享一首歌(怎么把两只airpods)

    两个airpods怎么共享一首歌(怎么把两只airpods)

  • 淘宝怎么禁止别人登录(淘宝怎么禁止别人看我的收藏夹)

    淘宝怎么禁止别人登录(淘宝怎么禁止别人看我的收藏夹)

  • 一加手机怎么退出静音模式(一加手机怎么退出安全模式设置)

    一加手机怎么退出静音模式(一加手机怎么退出安全模式设置)

  • ARunit怎么用(arrive怎么用)

    ARunit怎么用(arrive怎么用)

  • 华为荣耀play怎么root(华为荣耀play怎么设置桌面时间)

    华为荣耀play怎么root(华为荣耀play怎么设置桌面时间)

  • 前端微信小程序开发基础(前端微信小程序支付功能怎么实现)

    前端微信小程序开发基础(前端微信小程序支付功能怎么实现)

  • 离境退税政策文件
  • 公司更换营业执照需要多久
  • 什么是工程销项表
  • 全国税务师官网报名
  • 向投资者分配的现金股利如何做账
  • 以前多摊销
  • 厂区地面硬化属于土建还是市政
  • 实收资本账
  • 计提坏账准备怎么理解
  • 个人所得税可以退几年前的?
  • 核算科目拨出专票怎么弄
  • 年底预收货款如何入账
  • 购货发票属于外来原始凭证吗为什么
  • 票据贴现利息怎么开发票
  • 房地产企业代收的取暖费如何纳税
  • 财产租赁合同印花税计税依据含税吗
  • 事业单位支付方式
  • 汇算清缴自查报告
  • 周转借款会计分录
  • 出售固定资产要做收入吗
  • 地税按季报还是月报
  • 单品销售的方法
  • 进项5万出项6万,需交多少税
  • 软件企业的税收优惠政策
  • 小规模增值税附加税
  • 从租计征的房产税需要缴纳土地使用税吗
  • mac终端怎么运行命令
  • 苹果电脑截图快捷键
  • mac os 10.15安装教程
  • 财政拨款收入的明细科目
  • 社会保险生育险能报多少
  • 直接人工的核算包括
  • 提取的坏账准备怎么算
  • 税法的构成要素中,()是税法最基本的要素
  • 如何利用口诀记单词
  • 注销库存股的会计分录怎么理解
  • 计提消费税的会计科目
  • 何为前端后端
  • 预定义变量是什么
  • php授权ip访问
  • 自产赠送视同销售的成本怎么确定
  • 申报增值税税额正确,销售额少0.94
  • 关于存货跌价准备
  • 帝国cms插件编写教程
  • 保险中介手续费规定最新
  • 印花税所得税汇算清缴
  • 个体经营所得税怎么网上申报
  • 酒店如何控制成本汇报怎么写
  • 公司个人所得税申报操作流程
  • 解决烧心最快方法
  • 固定资产加速折旧计算方法
  • 固定资产清理的含义
  • 季报利润表本月金额怎么填
  • 银行金融手续费收费标准
  • 电子银行承兑汇票能拆票吗
  • 过路费油费计入什么费用
  • 企业开发是什么专业
  • 会计往来账如何记账
  • mssql数据库的账号密码
  • win7系统无法安装软件
  • ubuntu卸载dpkg安装的软件
  • centos release6.7
  • centos7 lvcreate
  • xp怎么删除电脑系统
  • linux显示所有内容
  • linux克隆虚拟机
  • perl 删除文件
  • cocos2d-x教程
  • unity性能优化工具
  • python迭代器的作用
  • jquery添加图片
  • ajax的异步是什么意思
  • android内存分析显示
  • unity 2danimation
  • web 开发
  • js简单实现图片轮播
  • 税控盘怎么领用
  • 2023年内蒙古房贷利率最新消息
  • 怎么查询手机发票
  • 江苏地方税务局电子税务局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设