Redux架構解析:狀態管理的核心原理

Redux 作為 JavaScript 應用的狀態管理庫,其技術架構與核心原理圍繞??可預測的狀態管理??設計,通過嚴格的單向數據流和函數式編程理念實現復雜應用的狀態控制。以下從設計理念、核心架構、工作流程、源碼實現等角度進行系統性剖析:


一、設計理念與原則

  1. ??單一數據源(Single Source of Truth)??
    • 整個應用的狀態存儲在一個全局 Store 對象中,形成唯一的狀態樹(State Tree)。
    • ??優勢??:簡化狀態共享和調試,避免分布式狀態導致的邏輯混亂。
  2. ??狀態只讀(State is Read-Only)??
    • 狀態不可直接修改,唯一修改方式是 ??dispatch(action)??。Action 是描述狀態變化的普通對象,需包含 type 屬性(如 { type: 'ADD_TODO', text: 'Learn Redux' })。
    • ??目的??:確保狀態變更可追蹤,避免隱蔽的副作用。
  3. ??純函數更新(Changes via Pure Functions)?
    • Reducer 是純函數,接收舊狀態和 Action,返回??新狀態??(而非修改舊狀態)。
    • ??關鍵約束??:
      • ??無副作用??:不修改輸入參數、不調用非純函數(如 Date.now())、不執行異步操作。
      • ??冪等性??:相同輸入必得相同輸出。

二、核心架構解析

1. ??Store:狀態容器??
  • 職責:
    • getState():獲取當前狀態。
    • dispatch(action):觸發狀態更新。
    • subscribe(listener):訂閱狀態變更事件。
  • ??實現關鍵??:閉包管理狀態(currentState)和監聽器數組(currentListeners)。
2. ??Action:狀態變更的描述??
  • 本質:包含 type 的 JS 對象,可攜帶額外數據(如 payload)。
  • ??Action Creator??:封裝創建 Action 的邏輯,提高代碼復用性。
3. ??Reducer:狀態變更的執行者??
  • 函數簽名:(state, action) => newState

  • ??不可變更新??:必須返回新對象(而非修改原狀態)。

    // 錯誤:直接修改原狀態
    state.todos.push(action.payload);  
    // 正確:返回新對象
    return { ...state, todos: [...state.todos, action.payload] };  
    
  • ??組合性??:通過 combineReducers 拆分多個子 Reducer,分別管理狀態樹的不同部分。

4. ??Middleware:擴展 Dispatch 能力??
  • ??攔截 Action??:在 Action 到達 Reducer 前執行額外邏輯(如異步請求、日志記錄)。

  • ??中間件鏈??:通過函數嵌套實現(如 applyMiddleware(thunk, logger))。

    const thunkMiddleware = ({ dispatch }) => next => action => {if (typeof action === 'function') { return action(dispatch); // 處理函數型 Action(如 redux-thunk)}return next(action); // 傳遞普通 Action
    };
    

三、工作流程詳解

Redux 的數據流是嚴格的單向循環:

  1. ??觸發 Action??:用戶操作(如點擊)調用 dispatch(action)
  2. ??執行 Reducer??:Store 調用 Reducer,傳入當前狀態和 Action,生成新狀態。
  3. ??更新 Store??:新狀態替換舊狀態。
  4. ??通知訂閱者??:執行所有通過 subscribe() 注冊的監聽器(如觸發 React 組件重渲染)。
  5. ??視圖更新??:組件通過 getState() 獲取新狀態并更新 UI。

四、源碼核心實現

1. ??createStore??:核心工廠函數
function createStore(reducer, preloadState) {let currentState = preloadState; // 閉包保存狀態let listeners = [];const getState = () => currentState;const subscribe = (listener) => {listeners.push(listener);return () => listeners.splice(listeners.indexOf(listener), 1); // 取消訂閱};const dispatch = (action) => {// 校驗 Action 為純對象if (Object.getPrototypeOf(action) !== Object.prototype) throw new Error('Action 必須是純對象');currentState = reducer(currentState, action); // 調用 Reducerlisteners.forEach(listener => listener()); // 通知訂閱者};dispatch({ type: '@@redux/INIT' }); // 初始化狀態return { dispatch, subscribe, getState };
}
2. ??combineReducers??:合并多個 Reducer
export default function combineReducers(reducers) {const reducerKeys = Object.keys(reducers);return function combination(state = {}, action) {const nextState = {};reducerKeys.forEach(key => {const reducer = reducers[key];const prevStateForKey = state[key];nextState[key] = reducer(prevStateForKey, action); // 每個子 Reducer 獨立更新});return nextState;};
}
3. ??bindActionCreators??:自動綁定 Dispatch
function bindActionCreator(actionCreator, dispatch) {return (...args) => dispatch(actionCreator(...args)); // 自動派發 Action
}

五、設計哲學與工程價值

  1. ??可預測性??:
    • 狀態變更由純函數(Reducer)驅動,避免隱蔽的副作用。
    • Action 日志 + 時間旅行調試(如 Redux DevTools)。
  2. ??解耦與復用??:
    • 組件無需關心狀態來源,只需訂閱 Store 或通過 connect(React-Redux)注入狀態。
    • Reducer 可復用、可組合,適合模塊化開發。
  3. ??異步擴展??:
    • 中間件機制支持 redux-thunk(函數型 Action)、redux-saga(生成器流程控制)等方案,分離副作用與核心邏輯。

六、適用場景與局限性

  • ??適用??:
    • 多組件共享復雜狀態(如用戶登錄態、全局配置)。
    • 需要記錄/回放狀態變更(如撤銷重做)。
  • ??不適用??:
    • 簡單應用(引入 Redux 反而增加模板代碼)。

Redux 通過 ??Store 集中管理狀態??、??Action 描述變更意圖??、??Reducer 純函數更新狀態??的三元架構,實現狀態的可預測管理。其核心價值在于??嚴格的單向數據流??和??函數式編程約束??,為復雜應用提供可維護、可擴展的狀態管理方案。

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

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

相關文章

linux制作鏡像、壓縮鏡像、燒錄的方法

最近在玩香橙派的時候,需要搞多個板子,一個一個配環境也太麻煩了吧......于是通過搜索,發現可以把linux設備(比如香橙派,樹莓派等等)制作為鏡像,然后像燒錄官方鏡像一樣燒進新的sd卡&#xff0c…

機械材料計算軟件,快速核算重量

軟件介紹 今天為大家推薦一款專為機械行業設計人員打造的金屬材料重量計算軟件,幫助工程師快速完成材料重量核算。 軟件特點 這款綠色版計算工具體積小巧,不足100KB,無需安裝即可直接運行,不占用系統資源,特別適…

Chrome更新后,擴展不能用問題

Chrome更新后,擴展不能用問題 此擴展程序不再受支持,因此已停用 在 Windows 10/11 搜索框中輸入 regedit 打開 注冊表編輯器 在注冊表編輯器中打開:HKEYLOCALMACHINE\SOFTWARE\Policies\ 右鍵單擊 Policies 新建項 命名為 Google 右鍵單…

【Python】通過cmd的shell命令獲取局域網內所有IP、MAC地址,通過主機名獲取IP

【Python】通過cmd的shell命令獲取局域網內所有IP、MAC地址,通過主機名獲取IP 更新以gitee為準: gitee 文章目錄cmd命令獲取IPping主機名獲取IP的主機名socket獲取當前網關運行效果附錄:列表的賦值類型和py打包列表賦值BUG復現代碼改進優化總…

sky-take-out項目Mybatis的使用

分頁查詢public PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO) {PageHelper.startPage(categoryPageQueryDTO.getPage(),categoryPageQueryDTO.getPageSize());//下一條sql進行分頁&#xff0c;自動加入limit關鍵字分頁Page<Category> page categor…

H3CNE小小綜合實驗

實驗拓撲圖實驗需求 按照圖示配置IP地址在SW1和SW2之間配置鏈路聚合增加鏈路帶寬&#xff0c;提高可靠性PC5和PC6屬于VLAN10&#xff0c; PC7和PC8屬于VLAN20SW1和SW2屬于二層交換機&#xff0c;SW3為三層交換機&#xff08;VLAN100用于對接R4&#xff09;,在交換機之間相連的鏈…

IP協議深入理解

一、什么是ip協議?1.1、ip協議是網絡層協議&#xff0c;ip協議的本質工作是提供一種能力&#xff0c;把數據可靠的跨網絡從主機A送到主機B&#xff1b;1.2、什么是ip&#xff1f;ip目標網絡目標主機&#xff1b;畫圖圖解:如圖&#xff0c;當主機A想要把數據發給主機B時&#x…

接收表單數據:serialize()函數解析

一、form-serialize作用與引入 作用&#xff1a; form-serialize可以快速收集表單數據&#xff0c;按照使用者意愿轉化為對象或字符串輸出&#xff0c;以便于提交至服務器。 引入&#xff1a; form-serialize不是瀏覽器自帶的JS方法&#xff0c;而是第三方工具庫。可以直接通過…

vc配置使用預編譯

預編譯原理 stdafx.h中加入系統文件&#xff0c;減少cpp中對這些文件的解析&#xff0c;提高速度 stdafx.h 會把編譯的文件生成pch&#xff0c;后續解析頭文件直接調用pch里面的數據 配置 新建stdafx.h和stdafx.cpp文件 配置stdafx.cpp文件為/Yc 創建預編譯文件整個項目設置/Yc…

反射機制的登錄系統

一、實體層&#xff08;po層&#xff09; //UserInfo package com.hugeyurt.po;import java.sql.ResultSet; import java.sql.SQLException;public class UserInfo {private String userID;private String name;private int count;private Long errorTime;private String pwd;p…

裝飾器模式及優化

裝飾器模式&#xff08;Decorator Pattern&#xff09;是一種結構型設計模式&#xff0c;它允許向一個現有的對象添加新的功能&#xff0c;同時又不改變其結構。這種模式創建了一個裝飾器類&#xff0c;用來包裝原有的類&#xff0c;并在保持類方法簽名完整性的前提下&#xff…

共指消解技術全解析:從語言學規則到深度學習(附論文精讀)

精讀威斯康星大學綜述《Coreference Resolution: A Survey》&#xff0c;揭秘NLP中"實體鏈接"的核心技術一、什么是共指消解&#xff1f;為什么它是NLP的基石&#xff1f;共指消解(Coreference Resolution) 旨在識別文本中指向同一實體的不同表述。例如&#xff1a;t…

git配置git commit -m “fix 11,22: 修改bugid為11,22“

文章目錄前言一、報錯提示二、實現1.commitlint.config.js規范配置2. **修改正則表達式**&#xff1a;3. **移除 scope-case 規則**&#xff1a;4. **增強自定義規則邏輯**&#xff1a;測試結果&#xff1a;正則表達式詳解&#xff1a;前言 提示&#xff1a;正常的配置git規范…

nastools繼任者?極空間部署影視自動化訂閱系統『MediaMaster』

nastools繼任者&#xff1f;極空間部署影視自動化訂閱系統『MediaMaster』 哈嘍小伙伴們好&#xff0c;我是Stark-C~ 對于我們NAS玩家來說&#xff0c;觀影總是大家繞不開的一個執念&#xff0c;并且為觀影的折騰大家也都是樂此不疲~ 曾經有一個非常絕絕子的觀影神器擺在我們…

題解:CF1690G Count the Trains

思路&#xff1a; 首先我們可以理清一下各種情況&#xff1a;1&#xff09;m可能為02&#xff09;一次操作時&#xff0c;只需要考慮每節火車的車頭。3&#xff09;當一節火車的速度降低時&#xff0c;只會影響它及它后面的車廂當m0時&#xff0c;我們可以記錄上一節車頭的速度…

CCF編程能力等級認證GESP—C++3級—20250628

CCF編程能力等級認證GESP—C3級—20250628單選題&#xff08;每題 2 分&#xff0c;共 30 分&#xff09;判斷題&#xff08;每題 2 分&#xff0c;共 20 分&#xff09;編程題 (每題 25 分&#xff0c;共 50 分)奇偶校驗分糖果單選題&#xff08;每題 2 分&#xff0c;共 30 分…

2G和3G網絡關閉/退網狀態(截止2025年7月)

從能打語音電話的2G&#xff0c;到能發彩信、聊QQ的3G&#xff0c;這兩項陪伴了我們數十年的通信技術&#xff0c;正在悄然退出歷史舞臺。近日&#xff0c;全球移動供應商協會&#xff08;GSA&#xff09;發布的《2025年7月2G和3G網絡關閉報告》顯示&#xff0c;全球已有超百個…

Day06_C語言網絡編程20250718mobus重點

01.思維導圖1 什么是 modbus他是一個在工控領域非常好用的通信寫 modbus協議本質上是一個 基于 tcp 協議二次封裝的一個協議 什么叫做基于tcp二次封裝的協議&#xff1a;我們自己寫的pack_t(無論靜態還是動態)&#xff0c;都是屬于二次封裝的協議modbus協議是一種 “主從問答式…

比亞迪古德伍德亮相:從技術突破到文化對話

近日&#xff0c;比亞迪攜騰勢Z9GT、方程豹豹5、騰勢D9亮相英國古德伍德速度節——全球最具聲望的汽車文化盛典。方程豹豹5搭載全球首個 DMO電驅越野平臺&#xff0c;在爬山賽道上展現出媲美性能跑車的動力響應與精準控制&#xff0c;徹底打破“越野必靠大排量燃油機”的西方傳…

UniApp TabBar 用戶頭像方案:繞過原生限制的實踐

需求場景&#xff1a; 在 UniApp 項目中&#xff0c;需要將 TabBar 首頁項 (index) 的圖標替換為當前用戶的網絡圖片&#xff0c;并實現&#xff1a; 放大且圓形顯示。點擊該圖標時&#xff0c;頁面滾動回頂部。切換到其他分類時&#xff0c;首頁 Tab 項恢復為普通首頁圖標。 嘗…