React學習———Redux 、 React Redux和react-persist

Redux

Redux是一個流行的JavaScript狀態管理庫,通常用于React等前端框架結合使用。Redux 的設計思想是讓應用的狀態變得可預測、可追蹤、易于調試和測試。

Redux的核心l理念

  • 單一數據源:整個應用的狀態被存儲在一個唯一的Store對象中,所有組件都從這個Store讀取數據
  • 狀態只讀:唯一改變狀態的方法時觸發action,不能直接修改state
  • 使用純函數來執行修改:Reducer處理器是函數,接收當前的store和action,返回新的state,不產生副作用

Redux的核心概念

  • Store:是Redux的核心,它是一個包含整個應用程序狀態的對象。Redux應用只有一個單一的Store,通過createStore函數創建。提供了以下的方法
    - getStore():獲取當前狀態
    - dispatch(action):觸發狀態更新
    - subscribe(listener):監聽狀態變化
  • Action一個普通的JavaScript對象,用于描述狀態的變化,它必須有type字段,表示動作的類型,可以有其他自定義數據
const incrementAction = {type: 'INCREATE',payload: 1
}
  • Reducer::是一個純函數,接受當前stateaction作為參數,并返回一個新的狀態。Reducer必須保持純函數特性,既不直接修改原狀態,而是返回一個新的狀態對象
function counterReducer(state = 0,action){switch(action.type){case 'INCREATE':return state + action.payload;default:return state}
}
  • Dispatch:用于觸發action,通過調用store.dispatch(action)。React會將action傳遞給Reducer,從而更新狀態
  • Subscribe:訂閱Store的狀態,通常用于UI更新

Redux的工作流程

  • 組件通過dispatch發送一個action
  • Store接收到action,調用reduce
  • Reducer根據action的類型和數據,返回新的state
  • Store更新state,通知訂閱的組件重新渲染

React Redux

React Redux是官方推薦的React與Redux結合使用的庫,主要作用是讓React組件可以方便的訪問和操作Redux的全局狀態。它極大的簡化了React項目中全局狀態的管理和組件間的數據通信

React Redux的核心功能

  • Provider組件:用于將Reduxstore注入到整個React應用中。只需在應用的根組件外包裹一次,所有的子組件都能訪問到Redux的狀態
import { Provider } from 'react-redux'
import { store } from './store'
<Provider store={ store }><App />
</Provider>
  • useSelector:在函數組件獲取Redux store里的狀態;只會在依賴的狀態變化時自動觸發組件重新渲染
import { useSelector } from 'react-redux'
const menuIndex = useSelector(state => state.head.menuIndex)
  • useDispatch:獲取dispatch方法,用于分發action觸發reduce更新狀態
import { useDispatch } from 'react-redux'
const dispatch = useDispatch()
dispatch({type: 'SET_MENU', payload: 1})
  • connect(高階組件):用于將Reduxstatedispatch方法“連接”到React組件的props上。它主要用于類組件或早期函數組件(在hooks出現之前),現在雖然推薦使用useSelectoruseDispatch,但connect依然在很多老項目和復雜場景下被廣泛使用
import { connect } from ‘react-redux’// 1、映射 state 到 props
const mapStateProps = (state) => ({menuIndex: state.head.menuIndex
})// 2、映射 dispatch 到 props
const mapDispatchProps = (dispatch) => ({setMenu: (index) => dispatch({type: 'SET_MENU'})
})// 3、用connect包裹組件
class MyComponent extends React.Component {render(){const { menuIndex, setMenu } = this.propsreturn (<div><span>{menuIndex}</span><button onClick={() => setMenu(1)}>切換菜單</button></div>)}
}
export default connect(mapStateProps, mapDispatchProps)(MyComponent)

React Redux的工作流程

  • 創建Store:使用createStoreconfigureStore創建React store,并定義初始狀態和reducer
  • 提供Store:通過Provider將store注入到React應用中
  • 連接組件:使用connect或Hooks API(useSelectoruseDispatch)將組件與React store連接,獲取狀態和操作
  • 更新狀態:組件通過dispatch操作觸發狀態更新,Redux根據reduce更新store的狀態
  • 重新渲染:組件根據新的狀態重新渲染,完成UI更新

react-persist

react-persist是一個用于持久化Redux狀態的庫,它的作用是:把Redux store中的數據自動保存到本地存儲(如localStorage、sessionStorage、IndexedDB等),頁面刷新或關閉后再打開,狀態依然能恢復

基本使用

  • 安裝:npm install redux-persist
  • 配置
/** @format* createStore: 創建redux store* persistStore :持久化redux store* persistCombineReducers: 持久化多個reducer* storage:使用瀏覽器的lcaolStorage作為持久化存儲介質*/
import { legacy_createStore as createStore } from 'redux'
import { persistStore, persistCombineReducers } from 'redux-persist'
import storage from 'redux-persist/lib/storage' // 默認 localStorageimport user from './reducers/user'
import head from './reducers/head'const persistConfig = {key: 'root', // 本地存儲的key名storage, //存儲方式 也可以用 sessionStorage 或自定義// whitelist: 只持久化那些reducer// blacklist:不持久化哪些reducer}
// 將多個reduce合并
const reducers = { user, head }
//  創建持久化存儲的reducer
const persistedReducer = persistCombineReducers(persistConfig, reducers)
const store = createStore(persistedReducer)
const persist = persistStore(store)export { store, persist }
  • 在React 項目入口文件使用
/*** PersistGate:用于在 React 應用中延遲渲染 UI,直到 Redux 持久化的數據恢復完成。* 當你用 redux-persist 持久化 Redux 狀態時,頁面刷新后需要先從本地存儲(如 localStorage)恢復數據。* PersistGate 會在數據還原完成前,先渲染 loading 指定的內容(比如 loading 動畫或 null),等數據恢復好后再渲染你的應用。*/
import { Provider } from ‘react-redux’
// PersistGate 組件會在狀態恢復完成后再渲染應用,避免“閃屏”
import { PersistGate } from 'redux-persist/integration/react'
import { store, persist } from './store'<Provider store={store}>// persistor={persist} 是redux-persist創建的持久化控制對象<PersistGate loading={null} persistor={persist}></PersistGate>
</Provider>

注意事項

  • 存儲限制:localStorage 和 sessionStorage 有存儲大小限制(通常為 5MB),對于較大的狀態數據,可能需要考慮其他存儲方案
  • 安全性:敏感數據(如用戶憑證)不應直接存儲在 localStorage 中,建議使用加密或其他安全措施。
  • 性能優化:對于頻繁更新的狀態,持久化操作可能會影響性能,建議通過白名單或黑名單進行優化。

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

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

相關文章

Python字符串常用方法詳解

文章目錄 Python字符串常用方法詳解一、字符串大小寫轉換方法(常用)1. 基礎大小寫轉換2. 案例&#xff1a;驗證碼檢查&#xff08;不區分大小寫&#xff09; 二、字符串查找與替換方法1. 查找相關方法2. 替換相關方法 三、字符串判斷方法1. 內容判斷方法 四、字符串分割與連接方…

MyBatis—動態 SQL

MyBatis—動態 SQL 一、動態 SQL 的核心作用 動態 SQL 主要解決以下問題&#xff1a; 靈活性&#xff1a;根據不同的輸入參數生成不同的 SQL 語句&#xff08;如條件查詢、批量操作&#xff09;。 可維護性&#xff1a;減少重復代碼&#xff0c;通過標簽化邏輯提高 SQL 可讀…

Python機器學習筆記(二十五、算法鏈與管道)

對于許多機器學習算法,特定數據表示非常重要。首先對數據進行縮放,然后手動合并特征,再利用無監督機器學習來學習特征。因此,大多數機器學習應用不僅需要應用單個算法,而且還需要將許多不同的處理步驟和機器學習模型鏈接在一起。Pipeline類可以用來簡化構建變換和模型鏈的…

YOLOv3深度解析:多尺度特征融合與實時檢測的里程碑

一、YOLOv3的誕生&#xff1a;繼承與突破的起點 YOLOv3作為YOLO系列的第三代算法&#xff0c;于2018年由Joseph Redmon等人提出。它在YOLOv2的基礎上&#xff0c;針對小目標檢測精度低、多類別標簽預測受限等問題進行了系統性改進。通過引入多尺度特征圖檢測、殘差網絡架構和獨…

已解決(親測有效!):安裝部署Docker Deskpot之后啟動出現Docker Engine Stopped!

文章目錄 已解決&#xff1a;安裝部署Docker Deskpot之后啟動出現Docker Engine Stopped&#xff01;個人環境介紹自己的解決問題思路&#xff08;詳細過程附截圖&#xff09;1.打開控制面板2.點擊程序和功能3.點擊啟動或關閉windows功能4.Hyper-V5.右鍵菜單欄的windows圖標點擊…

PCIE接收端檢測機制分析

PCIE接收端檢測機制分析 1、PCIE的接收端檢測機制 接收器檢測電路作為發射器的一部分實現&#xff0c;必須正確檢測是否存在與ZRX-DC參數&#xff08;40Ω-60Ω&#xff09;隱含的直流阻抗等效的負載阻抗。 接收器檢測序列的推薦行為如下&#xff1a; ?初始狀態?&#xff…

[模型部署] 3. 性能優化

&#x1f44b; 你好&#xff01;這里有實用干貨與深度分享?? 若有幫助&#xff0c;歡迎&#xff1a;? &#x1f44d; 點贊 | ? 收藏 | &#x1f4ac; 評論 | ? 關注 &#xff0c;解鎖更多精彩&#xff01;? &#x1f4c1; 收藏專欄即可第一時間獲取最新推送&#x1f514;…

InternVL3: 利用AI處理文本、圖像、視頻、OCR和數據分析

InternVL3推動了視覺-語言理解、推理和感知的邊界。 在其前身InternVL 2.5的基礎上,這個新版本引入了工具使用、GUI代理操作、3D視覺和工業圖像分析方面的突破性能力。 讓我們來分析一下是什么讓InternVL3成為游戲規則的改變者 — 以及今天你如何開始嘗試使用它。 InternVL…

鴻蒙 ArkUI - ArkTS 組件 官方 UI組件 合集

ArkUI 組件速查表 鴻蒙應用開發頁面上需要實現的 UI 功能組件如果在這 100 多個組件里都找不到&#xff0c;那就需要組合造輪子了 使用技巧&#xff1a;先判斷需要實現的組件大方向&#xff0c;比如“選擇”、“文本”、“信息”等&#xff0c;或者是某種形狀比如“塊”、“圖…

HTTP GET報文解讀

考慮當瀏覽器發送一個HTTP GET報文時&#xff0c;通過Wireshark 俘獲到下列ASCII字符串&#xff1a; GET /cs453/index.html HTTP/1.1 Host: gaia.cs.umass.edu User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) Acc…

【Linux網絡】數據鏈路層

數據鏈路層 用于兩個設備&#xff08;同一種數據鏈路節點&#xff09;之間進行傳遞。 認識以太網 “以太網” 不是一種具體的網絡&#xff0c;而是一種技術標準&#xff1b;既包含了數據鏈路層的內容&#xff0c;也包含了一些物理層的內容。例如&#xff1a;規定了網絡拓撲結…

【打破信息差】萌新認識與入門算法競賽

閱前須知 XCPC萌新互助進步群2??&#xff1a;174495261 博客主頁&#xff1a;resot (關注resot謝謝喵) 針對具體問題&#xff0c;應當進行具體分析&#xff1b;并無放之四海而皆準的方法可適用于所有人。本人尊重并支持每位學習者對最佳學習路徑的自主選擇。本篇所列訓練方…

logrotate按文件大小進行日志切割

? 編寫logrotate文件&#xff0c;進行自定義切割方式 adminip-127-0-0-1:/data/test$ cat /etc/logrotate.d/test /data/test/test.log {size 1024M #文件達到1G就切割rotate 100 #保留100個文件compressdelaycompressmissingoknotifemptycopytruncate #這個情況服務不用…

2025認證杯二階段C題完整論文講解+多模型對比

基于延遲估計與多模型預測的化工生產過程不合格事件預警方法研究 摘要 化工生產過程中&#xff0c;污染物濃度如SO?和H?S對生產過程的控制至關重要。本文旨在通過數據分析與模型預測&#xff0c;提出一種基于延遲估計與特征提取的多模型預測方法&#xff0c;優化閾值設置&a…

前端精度問題全解析:用“挖掘機”快速“填平精度坑”的完美解決方案

寫在前面 “為什么我的計算在 React Native 中總是出現奇怪的精度問題?” —— 這可能是許多開發者在作前端程序猿的朋友們都會遇到的第一個頭疼問題。本文將深入探討前端精度問題的根源,我將以RN為例,并提供一系列實用解決方案,讓你的應用告別計算誤差。 一、精度問題的…

2024 睿抗機器人開發者大賽CAIP-編程技能賽-本科組(國賽) 解題報告 | 珂學家

前言 題解 2024 睿抗機器人開發者大賽CAIP-編程技能賽-本科組(國賽)。 國賽比省賽難一些&#xff0c;做得汗流浹背&#xff0c;T_T. RC-u1 大家一起查作弊 分值: 15分 這題真的太有意思&#xff0c;看看描述 在今年的睿抗比賽上&#xff0c;有同學的提交代碼如下&#xff1…

hghac和hgproxy版本升級相關操作和注意事項

文章目錄 環境文檔用途詳細信息 環境 系統平臺&#xff1a;N/A 版本&#xff1a;4.5.6,4.5.7,4.5.8 文檔用途 本文檔用于高可用集群環境中hghac組件和hgproxy組件替換和升級操作 詳細信息 1.關閉服務 所有數據節點都執行 1、關閉hgproxy服務 [roothgdb01 tools]# system…

userfaultfd內核線程D狀態問題排查

問題現象 運維反應機器上出現了很多D狀態進程&#xff0c;也kill不掉,然后將現場保留下來進行排查。 排查過程 都是內核線程&#xff0c;先看下內核棧D在哪了&#xff0c;發現D在了userfaultfd的pagefault流程。 uffd知識補充 uffd探究 uffd在firecracker與e2b的架構下使…

深入解析:構建高性能異步HTTP客戶端的工程實踐

一、架構設計原理與核心優勢 HTTP/2多路復用技術的本質是通過單一的TCP連接并行處理多個請求/響應流&#xff0c;突破了HTTP/1.1的隊頭阻塞限制。在異步編程模型下&#xff0c;這種特性與事件循環機制完美結合&#xff0c;形成了高性能網絡通信的黃金組合。相較于傳統同步客戶…

根據臺賬批量制作個人表

1. 前期材料準備 1&#xff09;要有 人員總的信息臺賬 2&#xff09;要有 個人明白卡模板 2. 開始操作 1&#xff09;打開 人員總的信息臺賬&#xff0c;選擇所需要的數據模塊&#xff1b; 2&#xff09;點擊插入&#xff0c;選擇數據透視表&#xff0c;按流程操作&…