react18【系列实用教程】useReducer —— 升级版的 useState (2024最新版)

useReducer 可看做升级版的 useState ,其强大之处在于,可以自定义复杂的响应式变量修改逻辑。

useReducer 语法

useReducer 是 hook 函数

  • 第一个参数(必要): 自定义的 reducer 函数(详见下文介绍)
  • 第二个参数(必要): 响应式变量的初始值
  • 第三个参数(可选):自定义的 init 函数(详见下文介绍),实现惰性初始化
  • 返回:一个数组,第一项为响应式变量,第二项为 dispatch 方法(详见下文介绍)

范例 – 计数器

在这里插入图片描述

import { useReducer } from "react";function init(initialCount) {return { count: initialCount };
}function reducer(state, action) {switch (action.type) {case "increment":return { count: state.count + 1 };case "decrement":return { count: state.count - 1 };case "reset":return init(action.payload);default:throw new Error();}
}function Counter({ initialCount }) {const [state, dispatch] = useReducer(reducer, initialCount, init);return (<>Count: {state.count}<buttononClick={() => dispatch({ type: "reset", payload: initialCount })}>Reset</button><button onClick={() => dispatch({ type: "decrement" })}>-</button><button onClick={() => dispatch({ type: "increment" })}>+</button></>);
}export default Counter;

父组件

import Counter from "./test.jsx";export default function Index() {return (<div><Counter initialCount={0} /></div>);
}

范例解析

若用 useState 实现,代码如下:

function Counter({initialCount}) {const [count, setCount] = useState(initialCount);return (<>Count: {count}<button onClick={() => setCount(initialCount)}>Reset</button><button onClick={() => setCount(prevCount => prevCount - 1)}>-</button><button onClick={() => setCount(prevCount => prevCount + 1)}>+</button></>);
}

对比可知:

  • useReducer 将响应式变量作为 state 对象的属性来处理
  • setCount 的参数为响应式变量的新值
  • dispatch 的参数为修改响应式变量的逻辑参数,统一在 reducer 中定义具体的处理逻辑

init 函数

用于对响应式变量进行惰性初始化,传入初始值参数,返回响应式变量的初始值。

function init(initialCount) {return { count: initialCount };
}

reducer 函数

描述复杂的响应式变量修改逻辑

  • 第1个参数为:响应式变量
  • 第2个参数为:dispatch 方法传入的参数(内含修改逻辑的关键信息)
  • 返回 state 的新值
function reducer(state, action) {switch (action.type) {case "increment":return { count: state.count + 1 };case "decrement":return { count: state.count - 1 };case "reset":return init(action.payload);default:throw new Error();}
}

dispatch 方法

用于触发响应式变量的改变

  • 参数为一个对象,内含修改响应式变量的逻辑参数
  • dispatch 方法的执行,实际上是执行 reducer 函数,实现 state 的更新,并触发视图更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/706527.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】网络图中的dfs

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、单词搜索二、黄金矿工三、不同路径 |||四、图像渲染五、岛屿数量六、岛屿的最大面积七、被围绕的区域…

从零入门激光SLAM(十七)——SLAM中为什么用ESKF误差卡尔曼滤波器

上一节&#xff0c;介绍了卡尔曼滤波的基本原理&#xff0c;但在SLAM中却使用ESKF&#xff0c;让我们一起看看具体的原因是什么吧 一、误差卡尔曼滤波器ESKF(Error State Kalman Filter) 1.1动机 在常规的卡尔曼滤波器中&#xff0c;需要假定系统的状态服从高斯分布&#xf…

3D Slicer:从入门到精通(六)——图像分割

图像分割 文章目录 图像分割基本概念分割和段表示方式二进制标签图表示 分割模块教程 基本概念 图像分割&#xff08;也称为轮廓绘制或注释&#xff09;是一种在图像中划定区域的程序&#xff0c;通常对应于解剖结构、病变和各种其他对象空间。它是医学图像计算中非常常见的程…

衡量代理IP的因素

当你随便点开百度搜索IP代理&#xff0c;然后你就会看到&#xff0c;五花八门的IP代理商出现在视线中。再点进去链接&#xff0c;我们会发现&#xff0c;大多数IP代理商提供的基础IP服务都大差不差&#xff0c;东家这样说&#xff0c;西家又那样说&#xff0c;尽管我们看的头昏…

二进制部署Kubernetes集群——单Master和Node组件

前言 本文将介绍如何使用二进制文件手动搭建 Kubernetes v1.20 集群。通过这种方法&#xff0c;我们可以更好地理解 Kubernetes 的内部工作原理&#xff0c;并具备更大的灵活性和控制权。下面将逐步构建 Kubernetes 集群&#xff0c;并进一步了解其各个组件之间的交互和配置。…

Chirpstack配合网关与lora设备通信

之前的章节讲过chirpstack的下载和安装部署&#xff0c;这节算是后续&#xff0c;利用chirpstack和lora设备做通信&#xff0c; 首先开启chirpstack&#xff0c;并登录&#xff0c;登录完成之后需要添加网关和设备&#xff0c;添加网关也就是Gatway&#xff0c;所以点开左侧的G…

路由交换技术-静态路由 + 动态路由

实验目的与要求 1、掌握单臂路由配置直连路由 2、掌握静态路由配置方法 3、掌握动态路由配置方法 4、理解OSPF链路状态算法的含义 5、掌握DNS、web等网络服务的配置 实验原理与内容 原理: 1、静态路由与默认静态路由 路由器可通过两种方式获知远程网络&#xff1a; 手动 - 远程…

Springboot+Vue项目-基于Java+MySQL的高校专业实习管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组 AB路线

//bfs 1000100010不会超时 #include<bits/stdc.h> using namespace std; #define int long long const int n1e311; int a,b,c,h[n][n][12],k[4][2]{0,1,0,-1,1,0,-1,0}; char t[n][n]; struct s {int x,y,z,w; }; signed main() {ios::sync_with_stdio(false);cin.t…

iOS 主要语言切换问题

前言 上架时需要把主要语言切换成英文&#xff0c;存储时一直提示“因为您必须先为使用这种语言的每个版本提供所有必需的截屏”错误。 错误截图 解决方案&#xff1a; 1、增加英文的截图去审核&#xff0c;审核过了再切换主要语言 官方文档出处 END.

PhpStorm 激活

1、更改Hosts文件 Mac文件位置&#xff1a;/etc/host Windows文件位置&#xff1a;C:\Windows\System32\drivers\etc 将 0.0.0.0 www.jetbrains.com 添加到hosts文件末尾。 2、左下角Proxy settings 添加本地80端口代理 附一个激活码 UX394X3HLT-eyJsaWNlbnNlSWQiOiJVWDM…

Java入门基础学习笔记27——生成随机数

Random的使用&#xff1a;生成随机数。 随机数应用&#xff1a; 随机点名&#xff1a; 年会抽奖&#xff1a; 猜数字游戏&#xff1a; 密码学。 查看API文档&#xff1a; package cn.ensource.random;import java.util.Random;public class RandomDemo1 {public static voi…