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

带你手写React中的useReducer函数。(底层实现)

文章目录

  • 前言
    • 一、为什么需要 Reducer?
    • 二、Reducer 的核心概念
      • 1. Reducer 函数
      • 2. useReducer 钩子
    • 三,手写react中的useReducer
  • 总结


前言

在 React 开发中,useReducer 是管理复杂状态逻辑的利器。它类似于 Redux 的简化版,允许我们将状态更新逻辑抽离为独立的 reducer 函数,提升代码的可读性和可维护性。本文将深入探讨手写 React 中的 Reducer,从原理到实践,帮助你彻底掌握这一核心概念。

一、为什么需要 Reducer?

  1. 状态逻辑集中化:将状态更新逻辑从组件中抽离,避免状态更新逻辑分散。
  2. 可预测性:通过纯函数(Reducer)处理状态,确保状态变化可追踪。
  3. 复杂状态管理:适合处理嵌套对象或数组等复杂状态。
  4. 性能优化:减少不必要的渲染(结合 React.memouseMemo)。

二、Reducer 的核心概念

1. Reducer 函数

Reducer 是一个纯函数,接收两个参数:

  • state:当前状态。
  • action:描述状态变化的动作(包含 typepayload)。
	type State = { count: number };type Action = { type: 'INCREMENT' } | { type: 'DECREMENT' };const reducer = (state: State, action: Action): State => {switch (action.type) {case 'INCREMENT':return { count: state.count + 1 };case 'DECREMENT':return { count: state.count - 1 };default:throw new Error('未知 action 类型');}};

2. useReducer 钩子

React 提供的 useReducer 钩子用于在组件中使用 Reducer:

	const [state, dispatch] = useReducer(reducer, initialState);
  • state:当前状态。
  • dispatch:触发状态更新的函数(发送 action)。

三,手写react中的useReducer

reducer中的dispatch触发就是在setState(更新我们传入的reducer返回的最新状态值)

// useReducer 分贝要传入一个reducder函数和初始数据
import { useState } from "react";
export function useReducer<T, D>(reducer: (state: T, action: D) => T,initialState: T
) {const [state, setState] = useState(initialState);const dispatch = (action: D) => {setState(reducer(state, action));};return [state, dispatch] as const;
}

使用示例:
结合了useContext

import type { IConfig } from "../data/data";
import { useReducer } from "./utils/reducer/myReducer";interface Action {type: "set" | "get";key: keyof IConfig;value: string;
}// 我们的具体逻辑实现const configReducer = (state: IConfig, action: Action) => {switch (action.type) {case "get":return state;case "set":return { ...state, [action.key]: action.value };default:return state;}
};type IConfig = typeof data;const data = {title: "小路",content: "小玛丽,小马路,小玛丽,小马路",
};const App = () => {// 使用我们自己的useReducerconst [config, dispatch] = useReducer(configReducer, data);return (<div><ConfigContext value={{ config, dispatch }}><ToodList /></ConfigContext></div>);
};export default App;

总结

本文深入解析React中的useReducer原理与实践,从状态管理需求出发,阐述Reducer的核心优势:逻辑集中化、状态可预测性及复杂状态处理能力。通过代码示例演示Reducer纯函数结构(接收state/action参数)和useReducer钩子用法,并重点实现自定义useReducer:利用useState存储状态,通过dispatch触发更新。文章结合useContext展示完整应用场景,呈现如何用Reducer模式构建可维护的状态管理方案。(149字)

http://www.lryc.cn/news/2393871.html

相关文章:

  • day024-网络基础-TCP与UDP、DNS
  • 专场回顾 | 重新定义交互,智能硬件的未来设计
  • 如何把一台电脑作为另外一台电脑的显示器
  • WPS 免登录解锁编辑
  • 【C/C++】线程安全初始化:std::call_once详解
  • 技术分享 | Oracle SQL优化案例一则
  • ​什么是RFID电子标签​
  • 华为手机用的时间长了,提示手机电池性能下降,需要去换电池吗?平时要怎么用能让电池寿命长久一些?
  • BERT***
  • 超级对话2:大跨界且大综合的学问融智学应用场景述评(不同第三方的回应)之二
  • 在Linux环境里面,Python调用C#写的动态库,如何实现?
  • 【Linux 基础知识系列】第三篇-Linux 基本命令
  • OpenCV CUDA模块直方图计算------生成一组均匀分布的灰度级函数evenLevels()
  • 深度学习常见实验问题与实验技巧
  • 前端面试之Proxy与Reflect
  • uniapp vue3 鸿蒙支持的 HTML5+接口
  • 一张Billing项目的流程图
  • 理想树图书:以科技赋能教育,开启AI时代自主学习新范式
  • 【大模型02】Deepseek使用和prompt工程
  • B端产品经理如何快速完成产品原型设计
  • [Java实战]Spring Boot切面编程实现日志记录(三十六)
  • Apache POI生成的pptx在office中打不开 兼容问题 wps中可以打卡问题 POI显示兼容问题
  • 大学大模型教学:基于NC数据的全球气象可视化解决方案
  • Python学习(2) ----- Python的数据类型及其集合操作
  • 机器学习算法-决策树
  • MediaMtx开源项目学习
  • Linux安装EFK日志分析系统
  • Linux(9)——进程(控制篇——下)
  • E. Melody 【CF1026 (Div. 2)】 (求欧拉路径之Hierholzer算法)
  • @Pushgateway 数据自动清理