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

React@16.x(25)useReducer

目录

  • 1,介绍
    • 1.1,Flux 的设计思想
  • 2,实现
    • 2.1,引入
    • 2.2,实现 useReducer
  • 3,官方实现

1,介绍

这也是官方的一个HOOK,目的是更方便的使用 Redux。

Redux 后续会详细介绍。它的主体思想沿用了 Flux 数据流框架(也是 FaceBook 出品的)的思想,Vuex 也是同样的实现。

1.1,Flux 的设计思想

  1. 数据是单项流动的。
  2. 数据存储在数据仓库 state 中(可以将 useStatestate 简单理解为数据仓库)。
  3. action 是改变数据的唯一原因,它本质上是一个对象,有2个属性
    1. type,字符串,表示改变数据的动作类型;
    2. payload,any类型,表示动作的附加信息,也就是额外的参数。

    例如,添加一个学生:{ type: 'addStu', payload: { 学生对象的各种信息 } }
    例如,删除一个学生:{ type: 'deleteStu', payload: 学生id }

  4. reducer 改变数据的具体实现,是一个函数:
    1. 有2个参数
      1. state,表示当前数据仓库中的数据;
      2. action
    2. 必须有返回值,表示数据仓库变化后的数据。另外,Flux 要求对象是不可变的,所以要修改 state 必须创建新的对象。
    3. 必须是纯函数,不能有任何副作用。
    4. 不能直接调用,必须通过辅助函数 dispatch
  5. dispatch 是一个辅助函数,用于触发 reducer。该函数仅接收一个参数 action,并调用 reducer 来改变 state

2,实现

2.1,引入

先看个简单例子:

export default function App() {const [n, setN] = useState(0);return (<div><buttononClick={() => {setN(n - 1);}}>-</button><span>{n}</span><buttononClick={() => {setN(n + 1);}}>+</button></div>);
}

用 Flux 的思想改造:

function reducer(state, action) {let newState = state;if (action.type === "minus") {newState = state <= 0 ? 0 : state - 1;} else if (action.type === "add") {newState = state + 1;}return newState;
}export default function App() {const [n, setN] = useState(0);function dispatch(action) {const newN = reducer(n, action);setN(newN);}return (<div><buttononClick={() => {dispatch({ type: "minus" });}}>-</button><span>{n}</span><buttononClick={() => {dispatch({ type: "add" });}}>+</button></div>);
}

注意,通过 Flux 的思想,只是为了把逻辑拆分的更细,便于管理状态 state

我要改变数据(dispatch),至于如何实现(reducer)并不关心。

而对使用状态的组件来说,影响并不大。因为完全可以直接使用 reducer 这个自定义函数。

2.2,实现 useReducer

dispatch 的实现很简单,所以可以考虑做成一个通用的 HOOK:useReducer

import { useState } from "react";export const useReducer = (reducerFunc, initState) => {const [state, setState] = useState(initState);function dispatch(action) {const newState = reducerFunc(state, action);setState(newState);}return [state, dispatch];
};

使用:

export default function App() {const [n, dispatch] = useReducer(reducer, 0);// 其他内容...
}

3,官方实现

React 考虑到这一点,所以官方实现了 useReducer 这个HOOK函数,并且还有第3个可选参数:
该函数将 useReducer 的第2个参数作为它的参数,返回值作为 useReducer 中的 state 初始值。

import { useReducer } from "react";

改造下自己实现的:

import { useState } from "react";/*** 通用的useReducer函数* @param { function } reducer reducer函数* @param { any } initialState 初始状态* @param { function } initFunc 计算初始值的函数*/
export const useReducer = (reducerFunc, initState, initFunc) => {const [state, setState] = useState(initFunc ? initFunc(initState) : initState);function dispatch(action) {const newState = reducerFunc(state, action);setState(newState);}return [state, dispatch];
};

以上。

相关文章:

  • orbslam2代码解读(4):loopclosing回环检测线程
  • 从票务到游戏:Celestia 首届黑客松亮点项目盘点
  • 笨蛋学算法之LeetCodeHot100_2_字母异位词分组(Java)
  • 【机器学习理论基础】定量变量和定性变量
  • 30岁迷茫?AI赛道,人生新起点
  • 【ArcGIS微课1000例】0115:字段数据类型案例详解
  • 计算广告读书杂记-待整理
  • 【AI大模型】Transformers大模型库(七):单机多卡推理之device_map
  • 基于SWIFT和Qwen1.5-14B-Chat进行大模型LoRA微调测试
  • 易舟云财务软件:数字化时代的财务管家
  • C/C++ 进阶(6)红黑树
  • Linux基础 (十四):socket网络编程
  • Ansible——fetch模块
  • 计划任务 之 一次性的计划任务
  • Java与MySQL的数据迁移与同步及事务与性能抉择
  • 【译】JS基础算法脚本:字符串结尾
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Flex布局到底解决了什么问题
  • HashMap ConcurrentHashMap
  • IndexedDB
  • October CMS - 快速入门 9 Images And Galleries
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PHP 7 修改了什么呢 -- 2
  • php ci框架整合银盛支付
  • PHP的Ev教程三(Periodic watcher)
  • Promise初体验
  • Spark学习笔记之相关记录
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 后端_MYSQL
  • 解析 Webpack中import、require、按需加载的执行过程
  • 前端
  • 前端学习笔记之观察者模式
  • 深入浏览器事件循环的本质
  • 使用SAX解析XML
  • 一天一个设计模式之JS实现——适配器模式
  • 用quicker-worker.js轻松跑一个大数据遍历
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • Java数据解析之JSON
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 数据库巡检项
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (1)(1.13) SiK无线电高级配置(五)
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (二)学习JVM —— 垃圾回收机制
  • (分布式缓存)Redis分片集群
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (规划)24届春招和25届暑假实习路线准备规划
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)uboot源码分析
  • (四)opengl函数加载和错误处理