当前位置: 首页 > news >正文

React useReducer 使用及 useImmerReducer

useReducer 实际上是以数组上的 reduce() 方法命名的。
传递给 reduce 的函数被称为 “reducer”。它接受 目前的结果 和 当前的值,然后返回 下一个结果。
React 中的 reducer 和这个是一样的:它们都接受 目前的状态 和 action ,然后返回 下一个状态。

reduce

const arr = [1, 2, 3, 4, 5];
const sum = arr.reduce((result, number) => result + number
); // 1 + 2 + 3 + 4 + 5

useReducer

// 定义 reducer
const reducer = (state, action){const { type, payload } = action// case 块包装到 { } 花括号中,这样在不同 case 中声明的变量就不会互相冲突。// case 通常应该以 return 或 break 结尾,避免代码进入 到下一个 case!switch(type){case 'add': {return state + payload.num}case 'substract': {return state - payload.num}default: {throw Error('未知 action: ' + action.type);}}
}// 声明 useReducer
const [tasks, dispatch] = useReducer(reducer, 0);// 使用 useReducer
function handleAddTask(text) {dispatch({type: 'add',payload: {num: 100}});
}

useReduce 同 useState一样, 返回的state是不能直接修改的, 而 Immer 提供了一种特殊的 draft 对象,你可以通过它安全的修改 state。在底层,Immer 会基于当前 state 创建一个副本。

useImmerReducer

// 引入
import { useImmerReducer } from 'use-immer';
// 声明
const initialTasks = [{id: 0, text: '参观卡夫卡博物馆', done: true},{id: 1, text: '看木偶戏', done: false},{id: 2, text: '打卡列侬墙', done: false},
];
const [tasks, dispatch] = useImmerReducer(tasksReducer, initialTasks);
// 定义 reducer
function tasksReducer(draft, action) {switch (action.type) {case 'added': {draft.push({id: action.id,text: action.text,done: false,});break;}case 'changed': {const index = draft.findIndex((t) => t.id === action.task.id);draft[index] = action.task;break;}case 'deleted': {return draft.filter((t) => t.id !== action.id);}default: {throw Error('未知 action:' + action.type);}}
}
// 使用 useReducer
function handleAddTask(text) {dispatch({type: 'added',id: nextId++,text: text,});}

相关文章:

  • MySQL入门学习-连接查询.INNER JOIN
  • HTML|02HTML标签
  • 深入理解 Nginx 的正向代理和反向代理
  • 国内算力真的紧缺么?
  • Redis启停脚本
  • 淘宝扭蛋机小程序:互联网时代下行业的发展动力
  • 智慧校园的含义是什么
  • 使用Selenium进行元素定位的全面指南
  • MATLAB神经网络---lstmLayer(LSTM 长短期记忆神经网络)
  • 遥遥领先,华为《仓颉编程语言白皮书》重磅来袭!!!
  • 不清楚数据治理路线图怎么制定?跟随这个思路即可
  • AI创作在论文写作中扮演什么角色?
  • Python有哪些就业方向?就业市场广阔!
  • C# —— 构造函数
  • 【Python高级编程】新手小白必须得学会的文本文件操作,资料资源均可分享!
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • Flex布局到底解决了什么问题
  • HTTP那些事
  • sessionStorage和localStorage
  • Travix是如何部署应用程序到Kubernetes上的
  • 大数据与云计算学习:数据分析(二)
  • 分布式熔断降级平台aegis
  • 工作中总结前端开发流程--vue项目
  • 前端临床手札——文件上传
  • 前端面试之闭包
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 线性表及其算法(java实现)
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 如何用纯 CSS 创作一个货车 loader
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #define,static,const,三种常量的区别
  • #控制台大学课堂点名问题_课堂随机点名
  • #数据结构 笔记一
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (二)测试工具
  • (规划)24届春招和25届暑假实习路线准备规划
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (十三)Maven插件解析运行机制
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)大型网站的系统架构
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net操作Excel出错解决
  • [000-01-030].Zookeeper学习大纲
  • [1127]图形打印 sdutOJ
  • [20171101]rman to destination.txt