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

  • 华为手表二维码在哪里找(华为手表二维码扫不出来怎么办)

    华为手表二维码在哪里找(华为手表二维码扫不出来怎么办)

  • 苹果手机怎么设置爱心图标(苹果手机怎么设置门禁卡NFC)

    苹果手机怎么设置爱心图标(苹果手机怎么设置门禁卡NFC)

  • ppt如何不让别人修改只能看(ppt如何不让别人看到备注)

    ppt如何不让别人修改只能看(ppt如何不让别人看到备注)

  • 华为nova7se支不支持nfc(华为nova7se支不支持OTG)

    华为nova7se支不支持nfc(华为nova7se支不支持OTG)

  • 华为nova7有呼吸灯吗(华为nova7呼吸灯怎么设置方法)

    华为nova7有呼吸灯吗(华为nova7呼吸灯怎么设置方法)

  • iphone还原所有设置和抹掉所有内容区别(iphone还原所有设置照片还在吗)

    iphone还原所有设置和抹掉所有内容区别(iphone还原所有设置照片还在吗)

  • 苹果耳机洗了还能用吗(苹果耳机机洗了)

    苹果耳机洗了还能用吗(苹果耳机机洗了)

  • 淘宝签收20天能退吗(淘宝签收十天还能退款吗)

    淘宝签收20天能退吗(淘宝签收十天还能退款吗)

  • 微信健康码是黑色的怎么回事(微信健康码是黑码什么意思)

    微信健康码是黑色的怎么回事(微信健康码是黑码什么意思)

  • oled屏是什么意思(oled 屏幕是什么意思)

    oled屏是什么意思(oled 屏幕是什么意思)

  • 苹果蜂窝网络有什么用(苹果蜂窝网络有必要开吗)

    苹果蜂窝网络有什么用(苹果蜂窝网络有必要开吗)

  • 三星s20发热(三星s20发热严重吗)

    三星s20发热(三星s20发热严重吗)

  • 淘宝买家怎么默认好评(淘宝买家怎么默认支付宝)

    淘宝买家怎么默认好评(淘宝买家怎么默认支付宝)

  • 微型计算机按什么分类(微型计算机按什么划分为六代)

    微型计算机按什么分类(微型计算机按什么划分为六代)

  • 手机天线坏了会出现什么情况(手机天线坏了会影响定位吗)

    手机天线坏了会出现什么情况(手机天线坏了会影响定位吗)

  • 辅助解封微信有坏处吗(辅助解封微信有时间限制吗)

    辅助解封微信有坏处吗(辅助解封微信有时间限制吗)

  • 手机相机实况在哪里(手机相机实况在哪里找)

    手机相机实况在哪里(手机相机实况在哪里找)

  • iphone8是否需要贴膜(苹果8需不需要更新ios14)

    iphone8是否需要贴膜(苹果8需不需要更新ios14)

  • 华为mate30pro是不是5g手机(华为mate30pro1)

    华为mate30pro是不是5g手机(华为mate30pro1)

  • 华为p20pro快充多少w(华为p20pro快充多少)

    华为p20pro快充多少w(华为p20pro快充多少)

  • 手机qq微博在哪里打开(手机qq微博在哪里看)

    手机qq微博在哪里打开(手机qq微博在哪里看)

  • pdr模型与访问控制的主要区别是(pdr模型与访问控制)

    pdr模型与访问控制的主要区别是(pdr模型与访问控制)

  • 抖音变丑又变美的滤镜叫什么(抖音变丑又变美怎么回事)

    抖音变丑又变美的滤镜叫什么(抖音变丑又变美怎么回事)

  • 魅族16s的手势截屏在哪(魅族16spro手势操作)

    魅族16s的手势截屏在哪(魅族16spro手势操作)

  • nova5pro耳机孔在哪(nova5z耳机孔)

    nova5pro耳机孔在哪(nova5z耳机孔)

  • 抖音点赞受限多久恢复(抖音点赞受限了多长时间能好)

    抖音点赞受限多久恢复(抖音点赞受限了多长时间能好)

  • 虎牙直播如何赚钱(虎牙直播如何赚取银豆)

    虎牙直播如何赚钱(虎牙直播如何赚取银豆)

  • 太阳能发电开票编码
  • 税务不受地方管吗
  • 分公司非独立核算可以改为独立核算吗
  • 劳务费可以开工程服务发票吗
  • 航天金税的服务费如何抵扣
  • 长期待摊费用摊销计入什么会计科目
  • 航空运单可以作为提货凭证吗
  • 粮食收购发票 票样
  • 一般公共预算支出是什么意思
  • 如何确定企业
  • 办公室零食采购台账
  • 个人增值税业务有哪些?
  • 广告费支出限额
  • 代扣代缴个税手续费返还怎么操作
  • 财产保险费发票税率
  • 汇算清缴时费用占收入多少
  • 营改增前的工程款现在怎么开票
  • 哪些津贴免征个税
  • 收不到租金怎么解除合同
  • 支票票号都是第二行吗
  • 库存商品进货价怎么算
  • 收到融资租赁发票怎么做账
  • 个体户和有限公司哪个税收低
  • 贷款贴息是什么政策
  • 现在还有票据法吗
  • PHP:mb_ereg_search_getregs()的用法_mbstring函数
  • 电子钥匙续费应用在哪里
  • 多收不用退的货物怎么办
  • php缩放图片
  • 劳动保护费计入什么会计科目
  • 超支福利费按什么计提
  • 免购车税政策
  • vue 自动部署
  • 应收票据年末计息的分录
  • 利用php实现一个数组
  • 维多利亚国家艺术馆
  • 计算机视觉的未来发展方向有哪些
  • 计算机视觉中的数学方法
  • 出售子公司股权不丧失控制权
  • 企业用户怎么在电脑登录
  • 帝国cms使用手册
  • 如何用织梦在本地搭建网站
  • python中mktime函数
  • 装修消防改造费用会计分录
  • 出租无形资产取得的收益计入什么科目
  • 股权变更涉及土地增值税吗
  • 金税四期的基本理念
  • 个人住房租赁给公司如何开票
  • 管理费用应该如何分摊 dcf
  • 呆滞原材料变卖的会计处理
  • 小规模纳税人减按1%怎么计算
  • 代扣和代缴的区别
  • 支付进口增值税
  • 废料销售的会计处理
  • 知识产权服务费可以计入研发费用吗
  • 补贴计税吗
  • 分期付款购无形资产怎么入账?
  • 固定资产转固流程图
  • 汽车固定资产残值率
  • 在SQL Server 2005中,数据库文件的扩展名为
  • freebsd使用手册
  • win7开机taskeng
  • Centos Nginx + Svbversion配置安装方法分享
  • linux如何加载动态库
  • Windows Update XP SP3官方下载地址
  • win8如何修改文件权限
  • linux系统查询进程
  • win10右键菜单不显示
  • bootstrap4和3
  • android webview获取文本
  • Linux base shell重定向详解
  • pycharm中文教程
  • shell脚本检查语法
  • jquery.form.js下载
  • javascript 二维数组搜索
  • jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
  • 海关进口增值税如何入账
  • 欠税务局税款的后果
  • 香港企业查询系统
  • 火灾损失进项税额怎么处理
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设