React 新版官方文档 (一) useReducer 用法详解

在这里插入图片描述

useReducer

useReducer 是一个可以让你向组件中添加 reducer 的 Hook

const [state, dispatch] = useReducer(reducer, initialArg, init?)

基本用法

const reducer = (state, action) => {
...
}
const MyComponent = () => {const [state, dispatch] = useReducer(reducer, {age: 42})const handleClick = () => {dispatch({type:'increase'})}...
}

比 useState 多了一个处理函数,该函数可以根据不同的分发状态来对应的改变状态

注意:state 不可修改 不能这样写, reducer 函数应当返回一个新对象

function reducer(state, action) {switch (action.type) {case 'incremented_age': {// 🚩 Don't mutate an object in state like this:state.age = state.age + 1;return state;}
function reducer(state, action) {switch (action.type) {case 'incremented_age': {// ✅ Instead, return a new objectreturn {...state,age: state.age + 1};}

不要重新执行初始函数 第一种写法会导致每次渲染时候都调用 createInitialState 函数 造成性能浪费

function createInitialState(username) {// ...
}
// ❌
function TodoList({ username }) {const [state, dispatch] = useReducer(reducer, createInitialState(username));// ✅
function TodoList({ username }) {const [state, dispatch] = useReducer(reducer, username, createInitialState);// ...

dispatch 后如何使用最新的状态值

调用 dispatch 函数不会更改运行代码中的状态 ,使用最新的状态值应该是这样写

function handleClick() {console.log(state.age);  // 42dispatch({ type: 'incremented_age' }); // Request a re-render with 43console.log(state.age);  // Still 42!setTimeout(() => {console.log(state.age); // Also 42!}, 5000);
}const action = { type: 'incremented_age' };
dispatch(action);
const nextState = reducer(state, action);
console.log(state);     // { age: 42 }
console.log(nextState); // { age: 43 }

参考

  • https://react.dev/reference/react/useReducer

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

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

相关文章

JVM快速入门

前言 本篇是带你快速入门JVM的一篇文章,努力把JVM重点都讲下,并且尽量都讲通俗,干货满满,看完这篇文章,面试时大部分内容都能说出一二。原创不易,如转载,请标明转载处!文章如果哪里…

js-二维子矩阵的和

// 给定一个二维矩阵 matrix,以下类型的多个请求: // 计算其子矩形范围内元素的总和,该子矩阵的左上角为(row1, col1) ,右下角为(row2, col2) 。// 实现 NumMatrix 类:// NumMatrix(int[][] matrix) 给定整数矩阵 matr…

代码随想录算法学习心得 42 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II...

一、买卖股票的最佳时机 链接:力扣 描述:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算…

图像细化与轮廓操作

1、图像细化 需要安装扩展包 //图像细化 int test1() {//中文字进行细化Mat img imread("LearnCV_black.png",IMREAD_ANYCOLOR); if (img.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}//英文字 实心圆和圆环细化Mat…

Few-Shot Learning in Wireless Networks: A Meta-Learning Model-Enabled Scheme

1 INTRODUCTION 由于6G的复杂管理机制&#xff0c;可以在基站收集历史数据——为克服训练数据集容量的限制提供了极大的便利 问题与挑战&#xff1a; 尽管元学习可以提高网络边缘智能(network edge intelligence)的性能&#xff0c;但其在无线网络(wireless networks)中的应用…

【ELK集群】

ELK集群部署环境准备 配置ELK日志分析系统 192.168.108.67 elk-node1 es、logstash、kibana 192.168.108.189 elk-node2 es、logstash 192.168.108.32 apache logstash 三台虚拟机配置调高 三台机关闭防火墙 改名 1、2台机配置hosts解析文件 1&#xff0c;2台都用系…

PHP之 Socket实践

一 Socket简介 1.1 Socket(套接宇)&#xff0c;用来描述IP地址和端口,是通信链的句柄&#xff0c;应用程序可以通过Socket向网络发送请求或者应答网络请求。 1.2 Socket是支持TCP/IP协议的网络通信的基本操作单元&#xff0c;是对网络通信过程中端点的抽象表示&#xff0c;包…

华为云编译构建CodeArts Build新手操作指南

华为云编译构建&#xff08;CodeArts Build&#xff09;基于云端大规模并发加速&#xff0c;为客户提供高速、低成本、配置简单的混合语言构建能力&#xff0c;帮助客户缩短构建时间&#xff0c;提升构建效率。 本文将给各位开发者带来华为云CodeArts Pipeline的手把手初级教学…

一文教会你风格迁移CycleGAN从入门到高阶再到最终成功魔改(附成功魔改代码)

专栏导读 &#x1f525;&#x1f525;本文已收录于专栏&#xff1a;《风格迁移之从入门到成功魔改》&#xff0c;欢迎免费订阅 ​此专栏用于带你从零基础学会什么是风格迁移&#xff0c;风格迁移有什么作用&#xff0c;传统做法和Cyclegan的原理&#xff0c;及其优缺点&#x…

基于51单片机和proteus的水质水位检测系统

此系统是基于51单片机和proteus的仿真设计&#xff0c;功能如下&#xff1a; 1. LCD1602实时显示水质和水位状态。 2. 按键可设定水质检测阈值并通过LCD显示。 3. LED指示水质水位和系统运行状态。 4. 水质差超过阈值后自动启动排水泵。 5. 水位过低时自动启动进水泵。 6…

SpringBoot项目模块间通信的两种方式

说明&#xff1a;在微服务架构开发中&#xff0c;一个请求是通过模块之间的互相通信来完成的&#xff0c;如下面这个场景&#xff1a; 创建两个子模块&#xff1a;订单模块&#xff08;端口8081&#xff09;、用户模块&#xff08;端口8082&#xff09;&#xff0c;两个模块之…

Spring Boot 中的 Native SQL 是什么, 如何使用

在 Spring Boot 中&#xff0c;我们通常使用 ORM 框架&#xff08;例如 Hibernate 或 MyBatis&#xff09;来操作数据库。但是&#xff0c;有时候我们需要执行一些自定义的 SQL 查询或更新语句&#xff0c;这时候就需要使用 Spring Boot 中的 Native SQL。 在本文中&#xff0…