React + Redux 從單向數(shù)據(jù)流到閉環(huán)實(shí)現(xiàn)
一、 核心關(guān)系:為什么需要 Redux?
在 React 中,數(shù)據(jù)通過 props 單向流動(dòng)。但當(dāng)應(yīng)用變得復(fù)雜時(shí),跨層級(jí)組件通信和狀態(tài)共享變得困難。Redux 應(yīng)運(yùn)而生,它提供了一個(gè)全局狀態(tài)容器(Store),讓所有組件都能通過統(tǒng)一的規(guī)則訪問和修改數(shù)據(jù)。
1.1 核心角色定義
| 角色 | 類比 | 職責(zé) |
|---|---|---|
| Store | 圖書館總登記簿 | 存儲(chǔ)整個(gè)應(yīng)用的狀態(tài)(State),是唯一的數(shù)據(jù)源 |
| Action | 申請(qǐng)表 | 描述“發(fā)生了什么”的普通對(duì)象,是改變狀態(tài)的唯一方式 |
| Reducer | 圖書管理員 | 純函數(shù),接收舊 State 和 Action,返回新 State |
| Dispatch | 申請(qǐng)?zhí)峤幌?/td> | 觸發(fā) Action 的唯一方法 |
二、 邏輯閉環(huán):?jiǎn)蜗驍?shù)據(jù)流是如何運(yùn)作的?
Redux 的核心是嚴(yán)格的單向數(shù)據(jù)流。整個(gè)數(shù)據(jù)流動(dòng)遵循一個(gè)清晰的閉環(huán)路徑:

2.1 詳細(xì)步驟解析
View 觸發(fā) Action
- 場(chǎng)景:用戶在界面點(diǎn)擊按鈕(如“添加待辦事項(xiàng)”)。
- 實(shí)現(xiàn):組件調(diào)用
dispatch(action)方法,發(fā)送一個(gè) Action 對(duì)象。 - Action 結(jié)構(gòu):必須包含
type字段,描述動(dòng)作類型。
// Action 示例 { type: 'ADD_TODO', text: 'Learn Redux' }Reducer 計(jì)算新狀態(tài)
- 場(chǎng)景:Store 接收到 Action。
- 實(shí)現(xiàn):Store 將當(dāng)前的 State 和收到的 Action 一起傳給 Reducer 函數(shù)。
- Reducer 邏輯:根據(jù) Action 的
type,計(jì)算并返回全新的 State 對(duì)象(不可變數(shù)據(jù))。
// Reducer 示例 function todoReducer(state = [], action) { switch (action.type) { case 'ADD_TODO': return [...state, { text: action.text, completed: false }]; default: return state; } }Store 更新狀態(tài)
- 場(chǎng)景:Reducer 返回了新 State。
- 實(shí)現(xiàn):Store 用新 State 替換舊 State,并觸發(fā)所有已注冊(cè)的監(jiān)聽器(Listener)。
View 響應(yīng)更新
- 場(chǎng)景:監(jiān)聽器被觸發(fā)。
- 實(shí)現(xiàn):通過
connect或useSelector連接的 React 組件接收到新的 State,觸發(fā)重新渲染(Re-render),界面更新。
三、 實(shí)現(xiàn)原理:Redux 的“黑魔法”揭秘
3.1 Store 的實(shí)現(xiàn)(發(fā)布-訂閱模式)
Redux 的 Store 本質(zhì)上是一個(gè)發(fā)布-訂閱模式的實(shí)現(xiàn)。它維護(hù)了一個(gè)狀態(tài)樹和一個(gè)監(jiān)聽器數(shù)組。
// 簡(jiǎn)化版 createStore 實(shí)現(xiàn)
function createStore(reducer, initialState) {
let state = initialState;
let listeners = [];
// 獲取當(dāng)前狀態(tài)
function getState() {
return state;
}
// 分發(fā) Action
function dispatch(action) {
// 關(guān)鍵步驟:調(diào)用 Reducer 計(jì)算新狀態(tài)
state = reducer(state, action);
// 通知所有訂閱者
listeners.forEach(listener => listener());
return action;
}
// 訂閱狀態(tài)變化
function subscribe(listener) {
listeners.push(listener);
// 返回取消訂閱的函數(shù)
return () => {
listeners = listeners.filter(l => l !== listener);
};
}
return { getState, dispatch, subscribe };
}
3.2 React-Redux 的連接機(jī)制(Context + HOC)
React-Redux 通過 Provider 和 connect 將 React 和 Redux 連接起來:
- Provider:利用 React 的 Context API,將 Store 注入到整個(gè)應(yīng)用樹下。
- Connect:高階組件(HOC),它訂閱 Store 的變化,并將 Store 中的 State 和 Dispatch 方法映射為組件的 Props。
關(guān)鍵邏輯:connect 在組件掛載時(shí)調(diào)用 store.subscribe(),當(dāng) Store 變化時(shí),它會(huì)執(zhí)行 mapStateToProps 獲取新數(shù)據(jù),并通過淺比較(Shallow Compare)決定是否觸發(fā)組件的 setState,從而避免不必要的重渲染。
四、 設(shè)計(jì)哲學(xué):為什么這樣設(shè)計(jì)?
4.1 不可變數(shù)據(jù)(Immutability)
- 原因:Reducer 必須返回新對(duì)象,而不是修改原對(duì)象。
- 優(yōu)勢(shì):
- 可預(yù)測(cè)性:相同的輸入永遠(yuǎn)得到相同的輸出。
- 性能優(yōu)化:通過引用比較(
===)可以快速判斷數(shù)據(jù)是否變化,避免深比較。 - 時(shí)間旅行調(diào)試:可以保存歷史狀態(tài)快照。
4.2 純函數(shù)(Pure Function)
- 原因:Reducer 必須是純函數(shù)。
- 優(yōu)勢(shì):
- 無副作用:不修改傳入?yún)?shù),不依賴外部變量,易于測(cè)試和調(diào)試。
- 確定性:狀態(tài)變更邏輯集中且清晰。
五、 總結(jié):閉環(huán)的意義
React + Redux 的閉環(huán)設(shè)計(jì),本質(zhì)上是在前端應(yīng)用中建立了一套**“審批流程”**:
- 統(tǒng)一入口:所有狀態(tài)變更必須通過
dispatch(action),杜絕了隨意修改數(shù)據(jù)的混亂。 - 集中處理:所有變更邏輯集中在 Reducer 中,便于追蹤和調(diào)試。
- 自動(dòng)同步:Store 的變化自動(dòng)同步到 View,實(shí)現(xiàn)了數(shù)據(jù)與 UI 的分離。
這種單向數(shù)據(jù)流的閉環(huán),使得大型應(yīng)用的狀態(tài)管理變得可預(yù)測(cè)、可維護(hù)、可測(cè)試,是構(gòu)建復(fù)雜前端應(yīng)用的基石。
到此這篇關(guān)于React + Redux 從單向數(shù)據(jù)流到閉環(huán)實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)React Redux 單向數(shù)據(jù)流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react中使用js實(shí)現(xiàn)頁面滾動(dòng)監(jiān)聽(推薦)
這篇文章主要介紹了react中使用js實(shí)現(xiàn)頁面滾動(dòng)監(jiān)聽,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04
一文詳解手動(dòng)實(shí)現(xiàn)Recoil狀態(tài)管理基本原理
這篇文章主要為大家介紹了一文詳解手動(dòng)實(shí)現(xiàn)Recoil狀態(tài)管理基本原理實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
react ant protable自定義實(shí)現(xiàn)搜索下拉框
這篇文章主要介紹了react ant protable自定義實(shí)現(xiàn)搜索下拉框,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
使用Ant Design Anchor組件的一個(gè)坑及解決
這篇文章主要介紹了使用Ant Design Anchor組件的一個(gè)坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04

