【React中useReducer鉤子詳解】

useReducer 是 React 中用于管理復雜狀態邏輯的 Hook,它通過 集中式狀態更新邏輯 替代 useState,尤其適合處理多值關聯狀態或依賴前序狀態更新的場景。以下是其核心要點:


1. 核心概念

  • Reducer 模式:靈感來自 JavaScript 的 Array.prototype.reduce 和 Redux,通過 (state, action) => newState 函數管理狀態變更。
  • 返回值:返回當前狀態 state 和派發函數 dispatch,例如:
    const [state, dispatch] = useReducer(reducer, initialState);
    

2. 參數解析

參數說明
reducer純函數,接收當前狀態和 action,返回新狀態。常用 switch/case 處理不同 action.type
initialState初始狀態值(如 { count: 0 })。
init函數(可選)惰性初始化,將初始狀態計算邏輯封裝(如從 localStorage 讀取)。

3. 工作流程

  1. 派發 Action:調用 dispatch({ type: 'increment' }) 觸發狀態更新。
  2. Reducer 處理:根據 action.type 計算新狀態(需返回全新對象,不可直接修改原狀態)。
  3. 組件渲染:狀態更新后組件重新渲染。

4. 對比 useState

特性useReduceruseState
適用場景復雜邏輯、多關聯狀態簡單獨立狀態
代碼組織邏輯集中,易于維護邏輯分散在多個 setState
性能優化可避免深層傳遞回調需手動優化

5. 典型示例

計數器應用
function reducer(state, action) {switch (action.type) {case 'increment':return { count: state.count + 1 };case 'decrement':return { count: state.count - 1 };default:throw new Error();}
}function Counter() {const [state, dispatch] = useReducer(reducer, { count: 0 });return (<>Count: {state.count}<button onClick={() => dispatch({ type: 'increment' })}>+</button></>);
}
惰性初始化
function init(initialCount) {return { count: initialCount };
}function reducer(state, action) {// ...同上
}function Counter({ initialCount }) {const [state, dispatch] = useReducer(reducer, initialCount, init);// ...
}

6. 使用場景

  • 復雜狀態對象:如表單、多步驟向導。
  • 性能敏感場景:避免子組件不必要的渲染(通過傳遞 dispatch 而非回調)。
  • 狀態依賴前值:如 state.count + action.payload

7. 注意事項

  • 純函數要求:Reducer 必須無副作用,不直接修改 state
  • 異步問題dispatch 后立即讀取 state 仍是舊值(更新是異步的)。
  • SSR 兼容:需注意服務端渲染時的初始化邏輯。

總結

useReducer 通過集中管理狀態變更邏輯,提升了代碼可維護性和可預測性,適合中大型應用的復雜狀態管理。結合 useContext 可進一步替代 Redux 等狀態庫。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905121.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905121.shtml

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

相關文章

【C++】C++函數指針詳解與實用技巧

C函數指針詳解與實用技巧 在C中&#xff0c;**函數指針&#xff08;Function Pointer&#xff09;**是一種強大而靈活的工具&#xff0c;常用于回調機制、策略模式、事件處理等場景。本文將從概念、語法、常見用法到實戰示例&#xff0c;帶你全面掌握C函數指針。 &#x1f9e0…

【計算機視覺】基于深度學習的實時情緒檢測系統:emotion-detection項目深度解析

基于深度學習的實時情緒檢測系統&#xff1a;emotion-detection項目深度解析 1. 項目概述2. 技術原理與模型架構2.1 核心算法1) 數據預處理流程2) 改進型MobileNetV2 2.2 系統架構 3. 實戰部署指南3.1 環境配置3.2 數據集準備3.3 模型訓練3.4 實時推理 4. 常見問題與解決方案4.…

IC ATE集成電路測試學習——電流測試的原理和方法

電流測試 我們可以通過電流來判斷芯片的工作狀態時&#xff0c;首先先了解下芯片的電流是如何產生的。 靜態電流 理論上&#xff0c;CMOS結構的芯片靜態時幾乎不耗電 CMOS基本結構&#xff1a;Pmos Nmos 串聯當邏輯電平穩定時&#xff1a; ? 要么Pmos導通&#xff0c;Nmo…

stm32week15

stm32學習 十一.中斷 2.NVIC Nested vectored interrupt controller&#xff0c;嵌套向量中斷控制器&#xff0c;屬于內核(M3/4/7) 中斷向量表&#xff1a;定義一塊固定的內存&#xff0c;以4字節對齊&#xff0c;存放各個中斷服務函數程序的首地址&#xff0c;中斷向量表定…

list類的詳細講解

【本節目標】 1. list的介紹及使用 2. list的深度剖析及模擬實現 3. list與vector的對比 1. list的介紹及使用 1.1 list的介紹 1. list 是可以在常數范圍內在任意位置進行插入和刪除的序列式容器&#xff0c;并且該容器可以前后雙向迭代。 2. list 的底層是雙向鏈表結構&a…

第十節:圖像處理基礎-圖像算術運算 (加法、減法、混合)

引言 在計算機視覺領域,圖像算術運算是最基礎卻至關重要的核心技術。無論是實現簡單的圖片合成、開發智能監控系統,還是構建復雜的醫學影像分析工具,加減運算和混合操作都扮演著關鍵角色。OpenCV作為最流行的計算機視覺庫,提供了完善的圖像處理函數集。本文將深入解析三種…

【React 的useState鉤子詳解】

React 的 useState 鉤子詳解 useState 是 React 中最基礎且最常用的 Hook 之一&#xff0c;它允許你在函數組件中添加和管理狀態。 基本語法 const [state, setState] useState(initialState);initialState: 狀態的初始值&#xff0c;可以是任何 JavaScript 數據類型state:…

vue 中的數據代理

在 Vue 中&#xff0c;數據代理&#xff08;Data Proxy&#xff09; 是 Vue 實現 MVVM 模式 的關鍵技術之一。Vue 使用數據代理讓你可以通過 this.message 訪問 data.message&#xff0c;而不需要寫 this.data.message —— 這大大簡化了模板和邏輯代碼。 我們來深入理解它的本…

基于Python的網絡電子書閱讀系統

標題:基于Python的網絡電子書閱讀系統 內容:1.摘要 隨著數字化閱讀的興起&#xff0c;網絡電子書閱讀需求日益增長。本研究旨在開發一個基于Python的網絡電子書閱讀系統&#xff0c;以滿足用戶便捷閱讀電子書的需求。采用Python的Flask框架搭建Web服務器&#xff0c;結合SQLit…

基于SpringBoot的抽獎系統測試報告

一、編寫目的 本報告為抽獎系統測試報告&#xff0c;本項目可用于團體抽獎活動&#xff0c;包括了用戶注冊&#xff0c;用戶登錄&#xff0c;修改獎項以及抽獎等功能。 二、項目背景 抽獎系統采用前后端分離的方法來實現&#xff0c;同時使用了數據庫來存儲相關的數據&…

Apache Flink 與 Flink CDC:概念、聯系、區別及版本演進解析

Apache Flink 與 Flink CDC:概念、聯系、區別及版本演進解析 在實時數據處理和流式計算領域,Apache Flink 已成為行業標桿。而 Flink CDC(Change Data Capture) 作為其生態中的重要組件,為數據庫的實時變更捕獲提供了強大的能力。 本文將從以下幾個方面進行深入講解: 什…

單片機-STM32部分:9、定時器

飛書文檔https://x509p6c8to.feishu.cn/wiki/A749wx8T0ioqfgkzZKlc9poknUf SMT32F1系列共有8個定時器&#xff1a; 基本定時器&#xff08;TIM6、TIM7&#xff09; 通用定時器&#xff08;TIM2、TIM3、TIM4、TIM5&#xff09; 高級定時器&#xff08;TIM1、TIM8&#xff09…

uniapp-商城-51-后臺 商家信息(logo處理)

前面對頁面基本進行了梳理和說明&#xff0c;特別是對驗證規則進行了闡述&#xff0c;并對自定義規則的兼容性進行了特別補充&#xff0c;應該說是干貨滿滿。不知道有沒有小伙伴已經消化了。 下面我們繼續前進&#xff0c;說說頁面上的logo上傳組件&#xff0c;主要就是uni-fil…

ideal創建Springboot項目(Maven,yml)

以下是使用 IntelliJ IDEA 創建基于 Maven 的 Spring Boot 項目并使用 YAML 配置文件的詳細步驟&#xff1a; 一、創建 Spring Boot 項目 啟動項目創建向導 打開 IntelliJ IDEA&#xff0c;點擊“File”->“New”->“Project”。 在彈出的“New Project”窗口中&#…

MATLAB中矩陣和數組的區別

文章目錄 前言環境配置1. 數據結構本質2. 運算規則&#xff08;1&#xff09;基本運算&#xff08;2&#xff09;特殊運算 3. 函數與操作4. 高維支持5. 創建方式 前言 在 MATLAB 中&#xff0c;矩陣&#xff08;Matrix&#xff09; 和 數組&#xff08;Array&#xff09; 的概…

iTwin 數據報表(只是簡單的原型不代表實現)

大概想法是 前端從schema和class中選中感興趣的property內容生成ecsql語句傳遞給后端后端解析ecsql并提供公開接口給各個分析工具&#xff0c;如excel&#xff0c;poewerBI等&#xff08;Odata或者直接選擇來自網站&#xff09;再由分析工具做進一步的處 還未想好的點 如何存…

Spring AI 系列——使用大模型對文本內容分類歸納并標簽化輸出

原理概述 利用大語言模型&#xff08;LLM&#xff09;實現文本分類&#xff0c;核心思想是通過預訓練模型理解輸入文本的語義&#xff0c;并將其映射到預先定義好的分類標簽。在這個過程中&#xff0c;我們借助 Spring AI Alibaba 提供的能力&#xff0c;使用阿里云 DashScope…

LeetCode 高頻題實戰:如何優雅地序列化和反序列化字符串數組?

文章目錄 摘要描述題解答案題解代碼分析編碼方法解碼方法 示例測試及結果時間復雜度空間復雜度總結 摘要 在分布式系統中&#xff0c;數據的序列化與反序列化是常見的需求&#xff0c;尤其是在網絡傳輸、數據存儲等場景中。LeetCode 第 271 題“字符串的編碼與解碼”要求我們設…

GitHub打開緩慢甚至失敗的解決辦法

在C:\Windows\System32\drivers\etc的hosts中增加如下內容&#xff1a; 20.205.243.166 github.com 199.59.149.236 github.global.ssl.fastly.net185.199.109.153 http://assets-cdn.github.com 185.199.108.153 http://assets-cdn.github.com 185.199.110.153 http://asset…

重生之我在2024學Fine-tuning

一、Fine-tuning&#xff08;微調&#xff09;概述 Fine-tuning&#xff08;微調&#xff09;是機器學習和深度學習中的一個重要概念&#xff0c;特別是在預訓練模型的應用上。它指的是在模型已經通過大量數據訓練得到一個通用的預訓練模型后&#xff0c;再針對特定的任務或數據…