React@16.x(25)useReducer

devtools/2024/9/23 2:43:57/

目录

  • 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];
};

以上。


http://www.ppmy.cn/devtools/53581.html

相关文章

QT与VS的区别?使用QT的好处?

Qt 和 Visual Studio (VS) 是两个不同的概念&#xff0c;它们在软件开发领域扮演着不同的角色&#xff1a; Qt&#xff1a; Qt 是一个跨平台的应用程序和用户界面框架&#xff0c;使用 C 编写&#xff0c;支持多种编程语言的绑定。它提供了一套丰富的工具和库&#xff0c;用于…

Redis的安装及详解

1.Redis介绍&#xff1f; 1.1 Redis是什么&#xff1f; Redis&#xff08;Remote Dictionary Server,远程字典服务器&#xff09;是一个开源免费的&#xff0c;用C语言编写的一个高性能的分布式内存数据库&#xff0c;基于内存运行并支持持久化的NoSQL数据库。是当前最热门的…

洛谷:P5705【深基2.例7】数字反转

1. 题目链接 https://www.luogu.com.cn/problem/P5705 【深基2.例7】数字反转 2. 题目描述 输入一个大于等于100&#xff0c;小于1000的小数点后一位的浮点数&#xff0c;要求把这个数翻转过来 输入&#xff1a;一行一个浮点数 输出&#xff1a;一行一个浮点数 3. 我的思考 …

#QT(QCharts绘制曲线)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;绘制曲线图表 3.记录&#xff1a; 4.代码 pro QT core gui #加入以下代码引入charts QT charts greaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses depre…

mfc140.dll电脑文件丢失的处理方法,这4种方法能快速修复mfc140.dll

mfc140.dll文件是一个非常重要的dll文件&#xff0c;如果它丢失了&#xff0c;那么会严重的影响程序的运行&#xff0c;这时候我们要找方法去修复mfc140.dll这个文件&#xff0c;那么你知道怎么修复么&#xff1f;如果不知道&#xff0c;那么不妨看看下面的mfc140.dll文件丢失的…

视频音频中断测试

像剪映、Bazaart这类可以添加音频文件的APP&#xff0c;除了常规的功能测试、性能测试、安全性测试、支付、兼容性测试等之外&#xff0c;还需要进行中断测试。 那么中断测试有哪些呢&#xff1f; 1.来电中断 编辑页添加视频音频文件&#xff0c;在播放的过程中&#xff0c;…

sprintboot依赖管理和自动配置

springboot依赖管理和自动配置 依赖管理和自动配置依赖管理什么是依赖管理修改自动仲裁/默认版本号 starter场景启动器starter场景启动器基本介绍官方提供的starter第三方starter 自动配置自动配置基本介绍SpringBoot自动配置了哪些?如何修改默认配置如何修改默认扫描包结构re…

天翼云认证专家解决方案架构师(理论)

1.某大型互联网公司为了提升应用程序和基础设施的稳定性&#xff0c;计划引入自动化监控工具。以下哪些工具可以满足公司的需求? A.Grafana B.Nagios C.Prometheus D.Jenkins 2.天翼智能边缘云ECX是位于网络边缘位置的云&#xff0c;兼具云和CDN的特性&#xff0c;将计算、存…