帶你手寫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.pswp.cn/web/81948.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81948.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81948.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用wireshark抓了個TCP通訊的包

昨兒個整理了下怎么用wireshark抓包&#xff0c;鏈接在這里&#xff1a;捋捋wireshark 今天打算抓個TCP通訊的包試試&#xff0c;整體來說比較有收獲&#xff0c;給大家匯報一下。 首先就是如何搞到可以用來演示TCP通訊的客戶端、服務端&#xff0c;問了下deepseek&#xff0c;…

運維 pgsql 安裝完后某次啟動不了

pgsql 安裝完后某次啟動不了 錯誤 data directory "/usr/local/postgresql/data" has invalid permissions 安裝成功后一直可以 后面同事敲了 chmod -R 777 /usr/local 導致不行 改到了 /usr/local/postgresql/data 權限 /usr/local/postgresql/data的權限有限…

查看·電腦安裝·的 .NET 版本

方法 一&#xff1a;使用命令提示符或 PowerShell 打開命令提示符或 PowerShell。 輸入以下命令&#xff1a;dotnet --version 按下回車鍵。 命令輸出將顯示已安裝的 .NET 版本。 方法二&#xff1a;使用 .NET Framework 控制面板 打開控制面板。 點擊“程序”。 點擊“程序…

Linux WiFi 模組使用及故障排查整理文檔

Linux WiFi 模組使用及故障排查整理文檔 1. STA 模式下 WiFi 延時不穩定問題解決方法&#xff1a; 2. Power Saving 機制說明3. AP 模式下 WiFi 設置4. RTL8821CS AP 模式下 Windows 客戶端異常斷開問題問題描述問題原因解決方案步驟 1&#xff1a;修改 dnsmasq 配置步驟 2&…

mac mini m4命令行管理員密碼設置

附上系統版本圖 初次使用命令行管理員&#xff0c;讓輸入密碼&#xff0c;無論是輸入登錄密碼還是賬號密碼&#xff0c;都是錯的&#xff0c;百思不得其解&#xff0c;去網上搜說就是登錄密碼啊 直到后來看到了蘋果官方的文檔 https://support.apple.com/zh-cn/102367 https…

棧內行為分析

棧內行為分析 一、源碼分析 我們以以下簡單的 C 程序為例&#xff0c;通過 GDB 動態調試分析函數調用過程中的棧內布局變化&#xff1a; #include <stdio.h> int add(){int a 10;int b 20;return (a b); }int main() {add();return 0; }編譯為 32 位程序&#xff1a…

老舊設備數據采集破局 AI圖像解析如何讓質檢LIMS系統煥發新生

在實驗室數字化進程中&#xff0c;大量服役超過 10 年的老舊設備成為數據采集的 “攔路虎”&#xff1a;指針式儀表盤需人工讀取、紙質原始記錄靠手工錄入、非標準接口設備數據無法自動獲取…… 某化工實驗室因 15 臺老舊設備數據采集耗時占比達 40%&#xff0c;檢測效率長期滯…

【征求意見】四川省大數據發展研究會關于對《數據資源建設費用測算標準》團體標準征求意見的通知

四川省大數據發展研究會 關于對《數據資源建設費用測算標準》團體標準征求意見的通知 各有關單位&#xff1a; 由四川省大數據發展研究會歸口、成都東契奇科技有限公司牽頭編制的《數據資源建設費用測算標準》團體標準已形成征求意見稿&#xff0c;現公開征求意見。請于2025年…

element上傳文件多選 實現文件排序

上傳文件多選排序 只上代碼 不多逼逼 這是el-elment 的文件上傳 <el-uploadaction"#"list-type"picture-card"ref"upload":accept"accept":on-change"onUploadChange":file-list"fileList":http-request&quo…

.NET 查找 DLL 的路徑順序

在 C# 中&#xff0c;[DllImport("SgCamWrapper.dll")] 這行代碼表明它會在運行時從當前可執行文件的搜索路徑中查找 SgCamWrapper.dll。具體搜索順序如下&#xff08;按優先級&#xff09;&#xff1a; ? .NET 查找 DLL 的路徑順序&#xff1a; 應用程序啟動目錄&a…

低代碼——表單生成器以form-generator為例

主要執行流程說明&#xff1a; 初始化階段 &#xff1a; 接收表單配置對象formConf深拷貝配置&#xff0c;初始化表單數據和驗證規則處理每個表單組件的默認值和特殊配置&#xff08;如文件上傳&#xff09; 渲染階段 &#xff1a; 通過render函數創建el-form根組件遞歸渲染表…

自定義載板RK3588HDMI輸入配置完整解決方案

Orange Pi 5 Plus HDMI輸入配置完整解決方案 &#x1f4cb; 項目概述 本文檔記錄了Orange Pi 5 Plus HDMI1接口配置問題的完整分析和解決過程。從初始的"disconnected"狀態問題&#xff0c;到最終實現HDMI輸入功能的全過程技術分析。 &#x1f3af; 問題描述 初始…

SAAS架構設計2-流程圖-用戶與租戶之間對應關系圖

在SAAS&#xff08;Software as a Service&#xff0c;軟件即服務&#xff09;結構中&#xff0c;用戶與租戶之間的關系可以通過一對一和多對多兩種方式來定義。這兩種關系模式各自有著不同的應用場景和特點。 用戶和租戶的關系&#xff08;一對一&#xff09; 一對一關系 在這…

Spring Boot微服務架構(八):開發之初就引入APM工具監控

使用 APM&#xff08;Application Performance Management&#xff09;工具監控 Spring Boot 應用&#xff0c;可以幫助開發者實時追蹤性能瓶頸、分析調用鏈路、監控資源使用情況&#xff0c;并快速定位故障。以下是詳細的步驟和常用工具的選擇指南&#xff1a; ??一、常用 A…

Python 如何讓自動駕駛的“眼睛”和“大腦”真正融合?——傳感器數據融合的關鍵技術解析

Python 如何讓自動駕駛的“眼睛”和“大腦”真正融合?——傳感器數據融合的關鍵技術解析 自動駕駛技術從來都不是“單兵作戰”。如果你細看一輛自動駕駛汽車,它其實是一個傳感器的集合體:攝像頭、激光雷達(LiDAR)、毫米波雷達、超聲波傳感器、GPS……這些傳感器各自發揮作…

《軟件工程》第 12 章 - 軟件測試

軟件測試是確保軟件質量的關鍵環節&#xff0c;它通過執行程序來發現錯誤&#xff0c;驗證軟件是否滿足需求。本章將依據目錄&#xff0c;結合 Java 代碼示例、可視化圖表&#xff0c;深入講解軟件測試的概念、過程、方法及實踐。 12.1 軟件測試的概念 12.1.1 軟件測試的任務 …

面試題 08.08. 有重復字符串的排列組合【 力扣(LeetCode) 】

文章目錄 零、原題鏈接一、題目描述二、測試用例三、解題思路四、參考代碼 零、原題鏈接 面試題 08.08. 有重復字符串的排列組合 一、題目描述 有重復字符串的排列組合。編寫一種方法&#xff0c;計算某字符串的所有排列組合。 二、測試用例 示例 1&#xff1a; 輸入&#…

【Linux】關于權限的理解

目錄 一、Linux用戶的分類 1.Linux下的兩種用戶 2.兩種用戶提示符的區別 3.用戶的切換方法 二、Linux的權限管理 1.文件訪問者分類 2.常見文件類型 3.文件訪問權限 4.權限檢查邏輯 5.文件權限的表示方式 三、與文件訪問權限相關的設置方法 1.前提&#xff1a; 2.如…

前端antd,后端fastapi,解決文件上傳

一、技術架構概述 前端框架&#xff1a;React Ant Design 5.x 使用antd的Upload組件&#xff08;支持拖拽/多文件/分片&#xff09; 后端框架&#xff1a;Python FastAPI 利用UploadFile類處理文件流 傳輸協議&#xff1a;HTTP FormData&#xff08;兼容性強&#xff09; 二…

?????? 模擬題及答案 ?????? 大模型Clouder認證:RAG應用構建及優化

考試注意事項: 一、單選題(21題) 檢索增強生成(RAG)的核心技術結合了什么? A. 圖像識別與自然語言處理 B. 信息檢索與文本生成 C. 語音識別與知識圖譜 D. 數據挖掘與機器學習 RAG技術中,“建立索引”步驟不包括以下哪項操作? A. 將文檔解析為純文本 B. 文本片段分割(…