React@16.x(25)useReducer

server/2024/10/18 14:25:19/

目录

  • 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/server/49766.html

相关文章

金鸣识别系统:PDF转Excel的高效利器

在日常办公中&#xff0c;我们经常需要将PDF文档转换为Excel表格以便进行数据分析。然而&#xff0c;当有些PDF转换过程可能会变得复杂&#xff0c;因为许多转换工具无法完美处理图片元素&#xff0c;导致转换后的准确率不高或排版错乱。幸运的是&#xff0c;金鸣识别系统以其卓…

计算机跨考现状,两极分化现象很严重

其实我觉得跨考计算机对于一些本科学过高数的同学来说有天然的优势 只要高数能学会&#xff0c;那计算机那几本专业课&#xff0c;也能很轻松的拿下&#xff0c;而对于本科是文科类的专业&#xff0c;如果想跨考计算机&#xff0c;难度就不是一般的大了。 现在跨考计算机呈现…

一行超长日志引发的 “血案” - Containerd 频繁 OOM 背后的真相

案发现场&#xff1a;混沌初现 2024年6月10日&#xff0c;本应是平静的一天。但从上午 9 点开始&#xff0c;Sealos 公有云的运维监控告警就开始不停地响。北京可用区服务器节点突然出现大量 “not ready” 告警&#xff0c;紧接着&#xff0c;系统自动触发 004 节点重启&…

简单的心电图信号分割方法

代码很简单&#xff0c;很容易看懂。 import pandas as pdimport matplotlib.pyplot as plt #headers [Name, Age, Marks]df pd.read_csv(samples-folder/samples2.csv) dfdf.drop(0)dfdf.drop(1)# print(df) if(len(df.columns) 3): df.columns [sample interval, sig…

GStreamer 源码编译,在 Clion 下搭建调试环境

前言 最近在学习 GStreamer&#xff0c;官方提供了一些教程&#xff0c;本人希望能够断点调试&#xff0c;以便学习代码逻辑。本文记录如何在 Clion 搭建 GStreamer 源码编译、调试环境 步骤 下载源码 git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.gitCl…

几内亚ECTN是什么?怎么办理?建议收藏!

几内亚ECTN是什么&#xff1f;怎么办理&#xff1f;建议收藏&#xff01; 一、去往几内亚的货物&#xff0c;从六月一日开始强制实施ECTN制度&#xff0c;取消原来并行的ENS制度。如若货物到港前没申请ECTN&#xff0c;几内亚海关将会强行扣货。 ECTN是英文&#xff1a;ELECTR…

Java中管理数据的方式

在Java中&#xff0c;管理数据的方式多种多样&#xff0c;取决于具体的应用需求和场景。下面详细介绍几种常见的数据管理方式&#xff0c;包括内存管理、文件管理、数据库管理以及其他高级数据管理技术。 1. 内存管理 1.1 基本数据类型和对象 Java提供了多种基本数据类型&am…

vue3中$attrs与inheritAttrs的使用

Vue 3 引入了一些新特性和改进&#xff0c;其中之一就是对 $attrs 的处理方式。在 Vue 2 中&#xff0c;$attrs 包含了父组件传递给子组件的属性&#xff0c;但不包括子组件已经声明的 props。在 Vue 3 中&#xff0c;$attrs 的行为有所变化&#xff1a; 默认情况下&#xff0…