0902Redux_狀態管理-react-仿低代碼平臺項目

文章目錄

    • 1 Redux 概述
      • 1.1 核心概念
      • 1.2 基本組成
      • 1.3 工作流程
      • 1.4 中間件(Middleware)
      • 1.5 適用場景
      • 1.6 優缺點
      • 1.7 Redux Toolkit(現代推薦)
      • 1.8 與其他工具的對比
      • 1.9 總結
    • 2 todoList 待辦事項案例
    • 3 Redux開發者工具
      • 3.1 核心功能
      • 3.2 安裝與配置
        • 步驟 1:安裝瀏覽器擴展
        • 步驟 2:配置 Redux Store
      • 3.3 使用示例
        • 1. 打開 DevTools
        • 2. 查看狀態樹
        • 3. 追蹤 Action 歷史
        • 4. 時間旅行調試
        • 5. 導出/導入狀態
      • 3.4 高級功能
      • 3.5 常見問題
        • Q1: DevTools 不顯示數據?
        • Q2: 生產環境如何禁用 DevTools?
        • Q3: 支持其他狀態庫嗎?
      • 3.6 總結
    • 結語

1 Redux 概述

Redux 是一個用于 JavaScript 應用的可預測狀態管理庫,主要用于管理應用中的全局狀態。它通過集中化的狀態存儲和嚴格的更新規則,使狀態變化更加可控和可追蹤。以下是 Redux 的核心概念、工作原理及特點:


1.1 核心概念

  1. 單一數據源(Single Source of Truth)
    所有狀態存儲在一個 Store 對象中,形成狀態樹(State Tree)。這簡化了狀態的讀寫和調試。
  2. 狀態只讀(State is Read-Only)
    唯一修改狀態的方式是觸發 Action(一個描述“發生了什么”的普通對象)。確保狀態不會被隨意修改。
  3. 純函數修改(Changes with Pure Functions)
    通過 Reducer 函數處理 Action,返回新狀態。Reducer 是純函數(輸入確定,輸出確定,無副作用)。

1.2 基本組成

  1. Store

    • 保存全局狀態的容器。
    • 通過 createStore(reducer) 創建(現代推薦使用 @reduxjs/toolkitconfigureStore)。
    • 提供 getState() 獲取狀態、dispatch(action) 觸發更新、subscribe(listener) 監聽變化。
  2. Action

    • 一個包含 type 字段的普通對象,描述發生了什么事。
    • 可攜帶額外數據(如 payload)。
    const incrementAction = { type: 'INCREMENT', payload: 1 };
    
  3. Reducer

    • 接收當前狀態和 Action,返回新狀態。
    • 必須是無副作用的純函數。
    function counterReducer(state = 0, action) {switch (action.type) {case 'INCREMENT':return state + action.payload;default:return state;}
    }
    

1.3 工作流程

  1. 用戶觸發操作(如點擊按鈕)。
  2. 應用 派發(Dispatch)一個 Action(例如 { type: 'INCREMENT' })。
  3. Redux 調用 Reducer,根據 Action 類型計算新狀態。
  4. Store 更新,所有訂閱了狀態變化的組件重新渲染。

redux數據流如下圖所示:

在這里插入圖片描述


1.4 中間件(Middleware)

  • 用于擴展 Redux 功能,處理異步操作或副作用(如 API 請求)。

  • 常用中間件:redux-thunk(處理異步)、redux-saga(復雜異步流)、redux-logger(日志記錄)。

  • 示例(使用 redux-thunk 發起異步請求):

    const fetchData = () => {return (dispatch) => {dispatch({ type: 'FETCH_START' });fetch('/api/data').then(res => res.json()).then(data => dispatch({ type: 'FETCH_SUCCESS', payload: data })).catch(error => dispatch({ type: 'FETCH_ERROR', error }));};
    };
    

1.5 適用場景

  • 復雜的大型應用,多個組件依賴同一狀態。
  • 需要跟蹤狀態變化歷史(如時間旅行調試)。
  • 跨組件、頁面或路由的狀態共享。

1.6 優缺點

優點

  • 狀態集中管理,易于調試(結合 Redux DevTools)。
  • 嚴格的更新模式確保可預測性。
  • 豐富的中間件生態。

缺點

  • 模板代碼較多(可通過 Redux Toolkit 簡化)。
  • 學習曲線較陡,尤其是異步處理。
  • 可能對小型項目過于復雜。

1.7 Redux Toolkit(現代推薦)

Redux 官方提供的工具集,簡化 Redux 代碼:

  • createSlice:自動生成 Action 和 Reducer。
  • configureStore:集成中間件和 DevTools。
  • createAsyncThunk:簡化異步操作。
    示例:
import { createSlice } from '@reduxjs/toolkit';const counterSlice = createSlice({name: 'counter',initialState: 0,reducers: {increment: (state) => state + 1,decrement: (state) => state - 1,},
});export const { increment, decrement } = counterSlice.actions;
export default counterSlice.reducer;

1.8 與其他工具的對比

  • Context API:適合簡單場景,但缺乏 Redux 的中間件、調試工具和性能優化。
  • MobX:基于響應式編程,更適合追求簡潔的小型項目。
  • Zustand:輕量級,API 更簡單,適合中等復雜度應用。

1.9 總結

Redux 通過嚴格的單向數據流和集中化狀態管理,解決了復雜應用的狀態混亂問題。盡管需要編寫一定模板代碼,但結合 Redux Toolkit 和中間件,它仍是大型 React 應用狀態管理的可靠選擇。對于簡單場景,可優先考慮輕量方案(如 Context API 或 Zustand)。

2 todoList 待辦事項案例

狀態todoList.tx代碼如下:

import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { nanoid } from "nanoid";export type TodoItemType = {id: string;title: string;completed: boolean;
};const INIT_STATE: TodoItemType[] = [{ id: nanoid(5), title: "吃飯", completed: false },{ id: nanoid(5), title: "睡覺", completed: false },
];export const todoListSlice = createSlice({name: "todoList",initialState: INIT_STATE,reducers: {addTodo(state: TodoItemType[], action: PayloadAction<TodoItemType>) {return [...state, action.payload];},removeTodo(state: TodoItemType[], action: PayloadAction<string>) {return state.filter((todo) => todo.id !== action.payload);},toggleCompleted(state: TodoItemType[], action: PayloadAction<string>) {return state.map((todo) => {const { id, completed } = todo;if (id !== action.payload) {return todo;}return {...todo,completed: !completed,};});},},
});export const { addTodo, removeTodo, toggleCompleted } = todoListSlice.actions;export default todoListSlice.reducer;

store/index.ts擴展todoList模塊代碼如下:

import { configureStore } from "@reduxjs/toolkit";
import countReducer from "./count";
import todoListReducer, { TodoItemType } from './todoList'export type StateType = {count: number,todoList: TodoItemType
}export default configureStore({reducer: {count: countReducer,todoList: todoListReducer// 擴展其他模塊},
});

代辦頁面TodoList.tsx代碼如下所示:

import { FC } from "react";
import { useSelector, useDispatch } from "react-redux";
import {addTodo,removeTodo,TodoItemType,toggleCompleted,
} from "../store/todoList";
import { StateType } from "../store";
import { nanoid } from "nanoid";const TodoList: FC = () => {const todoList = useSelector<StateType>((state) => state.todoList) as TodoItemType[];const dispatch = useDispatch();function add() {const id = nanoid(5);dispatch(addTodo({id,title: `待辦事項-${id}`,completed: false,}));}function del(id: string) {dispatch(removeTodo(id));}function toggle(id: string) {dispatch(toggleCompleted(id));}return (<><p>todoList demo</p><div><button onClick={() => add()}>添加 todo</button></div><ul>{todoList.map((todo) => {const { id, title, completed } = todo;return (<likey={id}style={{ textDecoration: completed ? "line-through" : "" }}><span onClick={() => toggle(id)}>{title}</span>&emsp;<button onClick={() => del(id)}>刪除</button></li>);})}</ul></>);
};export default TodoList;

效果如下圖所示:在這里插入圖片描述

3 Redux開發者工具

Redux DevTools 是一個強大的瀏覽器開發者工具擴展,用于調試 Redux 應用的狀態變化。它提供了時間旅行調試、狀態快照查看、Action 追蹤等功能,極大簡化了復雜狀態管理的調試過程。以下是 Redux DevTools 的核心功能和使用指南:


3.1 核心功能

  1. 實時狀態監控
    • 可視化查看整個 Redux Store 的狀態樹。
    • 支持展開/折疊嵌套對象,快速定位狀態字段。
  2. Action 歷史追蹤
    • 記錄所有派發的 Action 及其觸發順序。
    • 顯示每個 Action 的 typepayload 信息。
  3. 時間旅行調試(Time Travel)
    • 通過回放 Action 歷史,動態切換應用狀態到任意時間點。
    • 直接跳過或撤銷某個 Action,驗證狀態變化的正確性。
  4. 狀態差異對比
    • 高亮顯示兩次狀態變更之間的差異(Diff 功能)。
  5. 導入/導出狀態
    • 將當前狀態導出為 JSON 文件,方便共享或復現問題。
    • 導入外部狀態文件,快速還原調試場景。
  6. 遠程調試
    • 支持跨設備調試(如手機端與電腦端同步狀態)。

3.2 安裝與配置

步驟 1:安裝瀏覽器擴展
  • Chrome: Redux DevTools Chrome 擴展
  • Firefox: Redux DevTools Firefox 擴展
步驟 2:配置 Redux Store
  • Redux Toolkit(推薦)**:
    configureStore 已默認啟用 DevTools,無需額外配置。

    import { configureStore } from '@reduxjs/toolkit';const store = configureStore({reducer: rootReducer,middleware: (getDefaultMiddleware) => getDefaultMiddleware(),
    });
    

3.3 使用示例

1. 打開 DevTools
  • 瀏覽器開發者工具 → 切換到 Redux 標簽頁。
    在這里插入圖片描述
2. 查看狀態樹
  • State 面板中瀏覽當前 Store 的完整狀態。
3. 追蹤 Action 歷史
  • Actions 面板中查看所有已派發的 Action,點擊任意 Action 查看其詳情和對應狀態快照。
4. 時間旅行調試
  • 點擊 Action 列表中的某個條目,應用狀態會自動回退到該時間點。
  • 使用 跳過(Skip)撤銷(Revert) 按鈕手動控制狀態變更。
5. 導出/導入狀態
  • 點擊 Export 導出當前狀態為 JSON 文件。
  • 點擊 Import 導入外部狀態文件,快速恢復調試場景。

3.4 高級功能

  1. Action 日志過濾

    • 通過關鍵字或正則表達式過濾特定 Action(如 FETCH_*)。
  2. 鎖定狀態變更

    • 在調試時鎖定狀態,防止意外修改。
  3. 遠程調試配置

    • 使用 remote-redux-devtools 包調試遠程設備或服務端渲染的應用:

      javascript

      復制

      下載

      import { composeWithDevTools } from '@redux-devtools/extension';
      const store = createStore(reducer,composeWithDevTools({ hostname: 'localhost', port: 8000 })
      );
      

3.5 常見問題

Q1: DevTools 不顯示數據?
  • 確保正確配置了 Redux Store(如使用 composeWithDevTools)。
  • 檢查是否安裝了瀏覽器擴展并啟用了 Redux 標簽頁。
  • 確認應用實際使用了 Redux(如非 React 應用需手動連接)。
Q2: 生產環境如何禁用 DevTools?
  • 通過環境變量動態關閉:

    javascript

    復制

    下載

    const composeEnhancers = process.env.NODE_ENV === 'development'? composeWithDevTools({ trace: true }): compose;const store = createStore(reducer, composeEnhancers(applyMiddleware(thunk)));
    
Q3: 支持其他狀態庫嗎?
  • 支持部分兼容 Redux API 的庫(如 Zustand、Flux),但功能可能受限。

3.6 總結

Redux DevTools 是 Redux 開發者的必備工具,通過時間旅行調試和狀態可視化大幅提升開發效率。結合 Redux Toolkit 的默認集成,可以快速上手并應用于復雜應用的調試場景。

結語

?QQ:806797785

??倉庫地址:https://gitee.com/gaogzhen

??倉庫地址:https://github.com/gaogzhen

[1]Redux官網[CP/OL].

[2]Redux Toolkit官網[CP/OL].

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

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

相關文章

《ATPL地面培訓教材13:飛行原理》——第6章:阻力

翻譯&#xff1a;Leweslyh&#xff1b;工具&#xff1a;Cursor & Claude 3.7&#xff1b;過程稿 第6章&#xff1a;阻力 目錄 引言寄生阻力誘導阻力減少誘導阻力的方法升力對寄生阻力的影響飛機總阻力飛機總重量對總阻力的影響高度對總阻力的影響構型對總阻力的影響速度穩…

C++總結01-類型相關

一、數據存儲 1.程序數據段 ? 靜態&#xff08;全局&#xff09;數據區&#xff1a;全局變量、靜態變量 ? 堆內存&#xff1a;程序員手動分配、手動釋放 ? 棧內存&#xff1a;編譯器自動分配、自動釋放 ? 常量區&#xff1a;編譯時大小、值確定不可修改 2.程序代碼段 ?…

【Hot 100】94. 二叉樹的中序遍歷

目錄 引言二叉樹的中序遍歷我的解題代碼優化更清晰的表述建議&#xff1a; &#x1f64b;?♂? 作者&#xff1a;海碼007&#x1f4dc; 專欄&#xff1a;算法專欄&#x1f4a5; 標題&#xff1a;【Hot 100】94. 二叉樹的中序遍歷?? 寄語&#xff1a;書到用時方恨少&#xff…

大語言模型(LLMs)微調技術總結

文章目錄 全面總結當前大語言模型&#xff08;LLM&#xff09;微調技術1. 引言2. 為什么需要微調&#xff1f;3. 微調技術分類概覽4. 各種微調技術詳細介紹4.1 基礎微調方法4.1.1 有監督微調&#xff08;Supervised Fine-Tuning, SFT&#xff09;4.1.2 全參數微調&#xff08;F…

解決Maven項目中報錯“java不支持版本6即更高的版本 7”

錯誤背景 當Maven項目編譯或運行時出現錯誤提示 Java不支持版本6即更高的版本7&#xff0c;通常是由于項目配置的JDK版本與當前環境或編譯器設置不一致導致的。例如&#xff1a; 項目配置的Java版本為6或7&#xff0c;但實際使用的是JDK 17。Maven或IDE的編譯器未正確指定目標…

C++筆記-多態(包含虛函數,純虛函數和虛函數表等)

1.多態的概念 多態(polymorphism)的概念:通俗來說&#xff0c;就是多種形態。多態分為編譯時多態(靜態多態)和運行時多態(動態多態)&#xff0c;這里我們重點講運行時多態&#xff0c;編譯時多態(靜態多態)和運行時多態(動態多態)。編譯時多態(靜態多態)主要就是我們前面講的函…

【Unity】MVP框架的使用例子

在提到MVP之前&#xff0c;可以先看看這篇MVC的帖子&#xff1a; 【Unity】MVC的簡單分享以及一個在UI中使用的例子 MVC的不足之處&#xff1a; 在MVC的使用中&#xff0c;會發現View層直接調用了Model層的引用&#xff0c;即這兩個層之間存在著一定的耦合性&#xff0c;而MV…

前端js學算法-實踐

1、兩數之和 const twoSum (nums, target) > {const obj {}for (let m 0; m < nums.length; m) {const cur nums[m]const diff target - curif(obj.hasOwnProperty(diff)){ // 查詢對象中是否存在目標值-當前值鍵值對console.log([obj[diff], m]) // 存在則直接獲取…

《MATLAB實戰訓練營:從入門到工業級應用》趣味入門篇-用聲音合成玩音樂:MATLAB電子琴制作(超級趣味實踐版)

《MATLAB實戰訓練營&#xff1a;從入門到工業級應用》趣味入門篇-用聲音合成玩音樂&#xff1a;MATLAB電子琴制作&#xff08;超級趣味實踐版&#xff09; 開篇&#xff1a;當MATLAB遇見音樂 - 一場數字與藝術的浪漫邂逅 想象一下&#xff0c;你正坐在一臺古老的鋼琴前&#x…

實戰探討:為什么 Redis Zset 選擇跳表?

在了解了跳表的原理和實現后&#xff0c;一個常見的問題&#xff08;尤其是在面試中&#xff09;隨之而來&#xff1a;為什么像 Redis 的有序集合 (Zset) 這樣的高性能組件會選擇使用跳表&#xff0c;而不是大家熟知的平衡樹&#xff08;如紅黑樹&#xff09;呢&#xff1f; 對…

數據結構-線性結構(鏈表、棧、隊列)實現

公共頭文件common.h #define TRUE 1 #define FALSE 0// 定義節點數據類型 #define DATA_TYPE int單鏈表C語言實現 SingleList.h #pragma once#include "common.h"typedef struct Node {DATA_TYPE data;struct Node *next; } Node;Node *initList();void headInser…

高中數學聯賽模擬試題精選學數學系列第3套幾何題

△ A B C \triangle ABC △ABC 的內切圓 ⊙ I \odot I ⊙I 分別與邊 B C BC BC, C A CA CA, A B AB AB 相切于點 D D D, E E E, F F F, D D ′ DD DD′ 為 ⊙ I \odot I ⊙I 的直徑, 過圓心 I I I 作直線 A D ′ AD AD′ 的垂線 l l l, 直線 l l l 分別與 D E DE…

使用 ossutil 上傳文件到阿里云 OSS

在處理文件存儲和傳輸時&#xff0c;阿里云的對象存儲服務&#xff08;OSS&#xff09;是一個非常方便的選擇。特別是在需要批量上傳文件或通過命令行工具進行文件管理時&#xff0c;ossutil提供了強大的功能。本文將詳細說明如何使用 ossutil 上傳文件到阿里云 OSS&#xff0c…

DeepSeek與MySQL:開啟數據智能新時代

目錄 一、引言&#xff1a;技術融合的力量二、DeepSeek 與 MySQL&#xff1a;技術基石2.1 DeepSeek 技術探秘2.2 MySQL 數據庫深度解析 三、DeepSeek 與 MySQL 集成&#xff1a;從理論到實踐3.1 集成原理剖析3.2 集成步驟詳解 四、應用案例&#xff1a;實戰中的價值體現4.1 電商…

WebAPI項目從Newtonsoft.Json遷移到System.Text.Json踩坑備忘

1.控制器層方法返回類型不能為元組 控制器層方法返回類型為元組時&#xff0c;序列化結果為空。 因為元組沒有屬性只有field&#xff0c;除非使用IncludeFields參數專門指定&#xff0c;否則使用System.Text.Json進行序列化時不會序列化field var options new JsonSerializ…

202553-sql

目錄 一、196. 刪除重復的電子郵箱 - 力扣&#xff08;LeetCode&#xff09; 二、602. 好友申請 II &#xff1a;誰有最多的好友 - 力扣&#xff08;LeetCode&#xff09; 三、176. 第二高的薪水 - 力扣&#xff08;LeetCode&#xff09; 一、196. 刪除重復的電子郵箱 - 力扣…

Spring Boot的GraalVM支持:構建低資源消耗微服務

文章目錄 引言一、GraalVM原生鏡像技術概述二、Spring Boot 3.x的GraalVM支持三、適配GraalVM的關鍵技術點四、構建原生鏡像微服務實例五、性能優化與最佳實踐總結 引言 微服務架構已成為企業應用開發的主流模式&#xff0c;但隨著微服務數量的增加&#xff0c;資源消耗問題日…

pip 常用命令及配置

一、python -m pip install 和 pip install 的區別 在講解 pip 的命令之前&#xff0c;我們有必要了解一下 python -m pip install 和 pip install 的區別&#xff0c;以便于我們在不同的場景使用不同的方式。 python -m pip install 命令使用 python 可執行文件將 pip 模塊作…

Vue高級特性實戰:自定義指令、插槽與路由全解析

一、自定義指令 1.如何自定義指令 ⑴.全局注冊語法 通過 Vue.directive 方法注冊&#xff0c;語法格式為&#xff1a; Vue.directive(指令名, {// 鉤子函數&#xff0c;元素插入父節點時觸發&#xff08;僅保證父節點存在&#xff0c;不一定已插入文檔&#xff09;inserted(…

本地大模型編程實戰(32)用websocket顯示大模型的流式輸出

在與 LLM(大語言模型) 對話時&#xff0c;如果每次都等 LLM 處理完畢再返回給客戶端&#xff0c;會顯得比較卡頓&#xff0c;不友好。如何能夠像主流的AI平臺那樣&#xff1a;可以一點一點吐出字符呢&#xff1f; 本文將模仿后端流式輸出文字&#xff0c;前端一塊一塊的顯示文字…