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

news2024/11/16 1:59:22

在这里插入图片描述

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 object
      return {
        ...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);  // 42

  dispatch({ type: 'incremented_age' }); // Request a re-render with 43
  console.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.coloradmin.cn/o/739406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

820. 递归求斐波那契数列

链接: 原题 题目: 请使用递归的方式求斐波那契数列的第 nn 项,下标从1开始。 斐波那契数列:1,1,2,3,5…1,1,2,3,5…,这个数列从第 33 项开始,每一项都等于前两项之和 输入格式 共一行,包含整数 …

npm 包和模块简介

目录 1、关于公共npm注册表 2、关于包和模块 2.1、关于包 2.2、关于包格式 2.3、npm包git URL格式 2.4、关于模块 3、关于范围 3.1、作用域和包的可见性 4、关于公共软件包 5、关于私有包 6、npm包范围、访问级别和可见性 1、关于公共npm注册表 公共npm注册表是Jav…

学习单片机的三个步骤:基础知识、编程语言和实践项目

当然!学习单片机的过程可以分为以下三个步骤: 学习基础知识:在开始学习单片机之前,首先需要掌握一些基础知识。了解数字电子学和模拟电子学的基本原理是很重要的,包括数字和模拟信号、逻辑门、计数器、寄存器等。还需…

K8S应用安全检测(调用分析 容器健康 审计日志)

应用安全检测 1 应用安全检测1.1 调用分析1.1.1 sysdig基础1.1.2 命令实践 1.2 容器监控1.2.1 CAdvisor1.2.2 Falco基础1.2.3 Falco实践1.2.4 进阶实践1.2.5 可视化实践 1.3 审计日志1.3.1 日志解读1.3.2 审计日志 1 应用安全检测 1.1 调用分析 1.1.1 sysdig基础 学习目标 …

第六章 mac上用的软件

1、brew.sh/index_zh-cn 2、网易有道词典 3、SizeUP 4、 5、chrome浏览器插件 6、快捷键

最近,智慧公厕空位引导系统非常受园区、写字楼、工厂、大型商场青睐,大家都在争着上!

随着城市化进程的不断推进,楼宇智慧公厕管理系统的应用已经成为城市管理的重要一环。通过智能化的监控和管理,公厕的卫生状况得到了有效控制,为市民提供了更好的公厕服务。一、楼宇智慧公厕系统案例展示楼宇智慧公厕系统是一种基于智能科技的…

基础算法-差分矩阵

(一)课堂笔记 (二)思路详解 如果扩展到二维,我们需要让二维数组被选中的子矩阵中的每个元素的值加上c,是否也可以达到O(1)的时间复杂度。答案是可以的,考虑二维差分。 a[][]数组是b[][]数组的前缀和数组&a…

less预处理语言的运用之-变量拼接那点事

less语法的技巧总结,很基础,熟练掌握后能提高我们在大型项目中的开发效率 a:0.5; showdaw-px:100; mkcolor1:#6ec5ff; num:1; .outer{//拼接的字符串在变量后面,需要在冒号后面加~width:~"{showdaw-px}px";//拼接的字符串在冒号后…

Vue脚手架使用 【实战篇】

一、一个组件引用另一个组件🍉 (1) 引入被引用的组件🥝 自己创建的组件 lzq.vue 组件必须创建在components文件夹下 将自己创建的组件导入到主页面中 (2)声明该组件🥝 本人理解: 声明组件可以理解为声明一个变量一样 (3)使用组…

【sql注入-报错注入2】GTID_SUBTRACT()函数 报错注入

目录 GTID_SUBTRACT()报错注入 一、语法介绍: 二、报错原因 网络安全小圈子 (***注:注意看版本要求) GTID_SUBTRACT()报错注入 一、语法介绍: 版本: MySQL >5.6 GTID_SUBTRACT()函数是MySQL中的一…

Unity20223.4f1中添加Tile的方法

如图,按顺序选择添加Rectangular(矩形地图)即可,矩形是常规瓦片地图 除常规瓦片地图外,Unity 还提供 Hexagonal Point Top Tilemap 和 Hexagonal Flat Top Tilemap 瓦片地图。六角形瓦片通常用于战略类桌面游戏&#x…

vertical-align middle不生效如何修改

vertical-align middle不生效如何修改 vertical-align的定义1.在父元素中增加display:table-cell,vertical-align 写在在父元素中2.在父元素中增加空的span元素,并设置其高度为100%,vertical-middle居中3.父元素line-height 100% 和子元素ver…

迭代读取文件

使用 torch.utils.data.dataset.Dataset 收集数据信息,创建数据集。 使用 import torch.utils.data.dataloader 创建一个可以批量迭代的数据载入器,并通过 for 循环批量读取所有文件的数据。 import torch.utils.data.dataset as dataset import torch…

windows凭据收集

实验目的 掌握windows凭据的收集方法 实验环境 windows server 2008 实验工具 mimikatz procdump 实验原理 用户凭证获取,一般是指 ntlm hash 或者可以直接利用的明文密码。 实验内容 使用mimikatz获取用户信息 使用procdump获取当前用户的明文密码 实验步骤…

IDEA(java: 错误: 不支持发行版本 5)

问题描述 今天在IDEA中运行项目时,突然蹦出error:java:不支持发行版本5报错,原因是项目运行的时候,jdk版本与本地的版本不一致,我的本地jdk版本是11,但是项目默认成了5,所以不一致,建议根据自己…

MIT 6.S081 教材第八章内容 -- Crash recovery -- 04

MIT 6.S081 教材第八章内容 -- Crash recovery -- 02 引言什么是 File system crashFile system crash示例File system logginglog_write函数end_op函数File system recovering Log写磁盘流程File system challenges 引言 MIT 6.S081 2020 操作系统 本文为MIT 6.S081课程第八…

Python启动UDP服务,监听并接收客户端数据

可以使用Python的socket库实现UDP协议的验证,以下是一个简单的示例代码: 服务器: [rootlocalhost python]# cat udp_server.py import socket# 创建一个UDP socket udp_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定到…

springboot超市进销存系统

本次设计任务是要设计一个超市进销存系统,通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括:首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、 商品信息管理、采购信…

Linux离线安装docker

问题: service docker start /status 都会报如下错误 报错:docker:unrecognized service 使用docker -v也能正常显示docker版本但唯独就是不能启动成功 找了很多资料都没有一个详细的答案和步骤 试了很多方法今天终于解决, 对此进行做个…

前端Vue自定义精美商品分类列表组件 侧边栏商品分类组件 category组件 左边分类category 右边列表List

随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。 通过组件化开发,可以有效实现…