從零開始學習 Redux:React Native 項目中的狀態管理

Redux 是一個用于 JavaScript 應用程序的狀態管理庫,通常與 React 或 React Native 配合使用,幫助管理應用的狀態和數據流。其核心原理是通過集中式的“單一數據源”來管理應用狀態,避免組件之間的“層層傳遞”狀態和副作用。

Redux 的原理

  1. 單一數據源(Store)
    Redux 維護一個全局狀態樹(即 Store),所有組件都通過讀取這個狀態樹來獲取數據。應用中的所有狀態(數據)都存儲在這個單一的 store 中,這樣可以保證應用狀態的一致性。

  2. State 是只讀的
    在 Redux 中,整個應用的狀態是只讀的,你不能直接修改狀態。要改變狀態,必須通過觸發 action 來執行。

  3. Actions
    Action 是描述要發生什么的普通 JavaScript 對象,通常包含 type 字段(標識該 Action 的類型),可能還會包含其他數據(payload)。例如:

    {type: 'ADD_TODO',payload: 'Buy milk'
    }
    

    Actions 是 Redux 的唯一方式來改變 state。

  4. Reducers
    Reducer 是純函數,用來指定如何根據不同的 action 來更新 state。它接收當前的 state 和 action,然后返回一個新的 state。Reducer 不會直接修改原始 state,而是返回一個新的對象,確保 Redux 的不可變性原則。

    const todosReducer = (state = [], action) => {switch (action.type) {case 'ADD_TODO':return [...state, action.payload];default:return state;}
    };
    
  5. Dispatch
    dispatch 是一個函數,允許你發送 Action 到 Redux store。這樣就會觸發相應的 Reducer 來更新 state。

  6. Store
    Store 是 Redux 中的核心,它保存了應用的狀態,并允許你獲取狀態、發送 Action、以及訂閱狀態變化。通常,我們通過 createStore() 創建一個 store。

    import { createStore } from 'redux';
    const store = createStore(todosReducer);
    
  7. 訂閱(Subscribe)
    組件可以通過訂閱 store 來獲取狀態的更新,通常使用 store.subscribe() 方法。Redux 與 React 的集成通常通過 React-Redux 庫來簡化訂閱和更新的過程。

什么時候使用 Redux 管理狀態

Redux 主要適用于以下幾種情況:

  1. 多個組件共享狀態
    如果應用中的多個組件需要訪問或修改相同的數據,Redux 可以有效地避免數據傳遞問題,確保所有組件共享的是一致的狀態。

  2. 復雜的狀態邏輯
    如果應用的狀態邏輯復雜,包含很多狀態之間的依賴關系,或者需要執行大量的異步操作,Redux 提供了清晰的結構來管理這些狀態變更。

  3. 跨組件通信
    如果你有多個不直接相關的組件需要通信(例如,在某個組件中修改了數據,其他組件需要更新),使用 Redux 可以避免復雜的傳遞關系,簡化跨組件通信。

  4. 調試和持久化
    Redux 的狀態是不可變的,便于調試。你可以通過 Redux DevTools 查看應用狀態的變化過程,還可以方便地在應用崩潰時恢復狀態。

在 React Native 項目中使用 Redux

以下是如何在 React Native 項目中具體使用 Redux 的步驟:

1. 安裝相關依賴

首先,安裝 Redux 和 React-Redux:

npm install redux react-redux
2. 創建 Action 和 Reducer

創建 Action(例如:添加任務)

// actions/todoActions.js
export const addTodo = (text) => ({type: 'ADD_TODO',payload: text,
});

創建 Reducer

// reducers/todoReducer.js
const initialState = {todos: [],
};const todoReducer = (state = initialState, action) => {switch (action.type) {case 'ADD_TODO':return {...state,todos: [...state.todos, action.payload],};default:return state;}
};export default todoReducer;
3. 創建 Store
// store.js
import { createStore } from 'redux';
import todoReducer from './reducers/todoReducer';const store = createStore(todoReducer);export default store;
4. 使用 Provider 將 Store 注入到組件樹
// App.js
import React from 'react';
import { Provider } from 'react-redux';
import store from './store';
import TodoApp from './TodoApp';const App = () => {return (<Provider store={store}><TodoApp /></Provider>);
};export default App;
5. 使用 connect 從 Redux 中獲取狀態并派發 Action

在組件中,通過 connect 將 Redux 狀態映射到組件的 props 中,并通過 dispatch 派發 Action。

// TodoApp.js
import React from 'react';
import { View, Text, TextInput, Button } from 'react-native';
import { connect } from 'react-redux';
import { addTodo } from './actions/todoActions';const TodoApp = ({ todos, addTodo }) => {const [text, setText] = React.useState('');const handleAddTodo = () => {addTodo(text);setText('');};return (<View><TextInputvalue={text}onChangeText={setText}placeholder="Add a new todo"/><Button title="Add Todo" onPress={handleAddTodo} />{todos.map((todo, index) => (<Text key={index}>{todo}</Text>))}</View>);
};const mapStateToProps = (state) => ({todos: state.todos,
});const mapDispatchToProps = {addTodo,
};export default connect(mapStateToProps, mapDispatchToProps)(TodoApp);

Redux小結

  • Redux 的核心原理是使用單一的數據源(Store),通過 actions 觸發 state 更新,Reducers 負責如何更新 state,組件通過訂閱 store 來獲取和渲染數據。
  • 什么時候使用 Redux:當你的應用狀態管理變得復雜,多個組件需要共享狀態時,Redux 是一個很好的解決方案。
  • 在 React Native 中的使用:通過安裝 reduxreact-redux,創建 Store,定義 Actions 和 Reducers,使用 Provider 注入 Store,最后在組件中通過 connect 獲取和修改狀態。

Redux 雖然提供了強大的狀態管理能力,但對于一些簡單的應用,可以選擇其他更輕量的狀態管理方式(比如 React 的 useStateuseReducer)。

推薦使用 Redux Toolkit

它是 Redux 官方發布的一個工具集,旨在簡化 Redux 的使用。Redux Toolkit 提供了更簡單、更高效的 API,使得我們可以更加輕松地實現 Redux 狀態管理,同時避免了傳統 Redux 中的樣板代碼。

為什么使用 Redux Toolkit?

  1. 簡化配置
    Redux Toolkit 內置了 configureStore 函數,自動配置了 Redux DevTools 和 Redux 中間件,避免了手動配置的繁瑣過程。

  2. 簡化 Reducer 和 Action
    使用 createSlice 可以同時定義 Action 和 Reducer,減少了重復的代碼。你不再需要手動編寫 action type 和 action creators。

  3. 默認啟用開發工具
    Redux Toolkit 默認啟用了 Redux DevTools,方便你調試應用程序中的狀態變化。

  4. 增強的 Immutability 檢查
    Redux Toolkit 使用了 Immer 庫,允許你直接修改 state,而不需要擔心不小心修改原始對象的問題,避免了不可變性管理的麻煩。

如何在 React Native 中使用 Redux Toolkit?

以下是如何在 React Native 項目中使用 Redux Toolkit 的步驟:

1. 安裝 Redux Toolkit 和 React-Redux
npm install @reduxjs/toolkit react-redux
2. 創建一個 Slice(包含 Actions 和 Reducer)
// features/todos/todoSlice.js
import { createSlice } from '@reduxjs/toolkit';const todoSlice = createSlice({name: 'todos',initialState: [],reducers: {addTodo: (state, action) => {state.push(action.payload);},removeTodo: (state, action) => {return state.filter(todo => todo !== action.payload);}}
});export const { addTodo, removeTodo } = todoSlice.actions;export default todoSlice.reducer;
3. 配置 Store
// store.js
import { configureStore } from '@reduxjs/toolkit';
import todoReducer from './features/todos/todoSlice';const store = configureStore({reducer: {todos: todoReducer}
});export default store;
4. 使用 Provider 包裹應用并傳遞 Store
// App.js
import React from 'react';
import { Provider } from 'react-redux';
import store from './store';
import TodoApp from './TodoApp';const App = () => {return (<Provider store={store}><TodoApp /></Provider>);
};export default App;
5. 在組件中使用 Redux 狀態和派發 Actions
// TodoApp.js
import React, { useState } from 'react';
import { View, Text, TextInput, Button } from 'react-native';
import { useDispatch, useSelector } from 'react-redux';
import { addTodo, removeTodo } from './features/todos/todoSlice';const TodoApp = () => {const [text, setText] = useState('');const todos = useSelector(state => state.todos);const dispatch = useDispatch();const handleAddTodo = () => {if (text.trim()) {dispatch(addTodo(text));setText('');}};const handleRemoveTodo = (todo) => {dispatch(removeTodo(todo));};return (<View><TextInputvalue={text}onChangeText={setText}placeholder="Add a new todo"/><Button title="Add Todo" onPress={handleAddTodo} />{todos.map((todo, index) => (<View key={index}><Text>{todo}</Text><Button title="Remove" onPress={() => handleRemoveTodo(todo)} /></View>))}</View>);
};export default TodoApp;

總結

  • Redux Toolkit 提供了比傳統 Redux 更簡潔和高效的 API,推薦在新項目中使用。
  • 它減少了大量的樣板代碼,同時增強了狀態管理的可讀性和易用性。
  • Redux Toolkit 包含了很多功能,如自動配置 store、簡化 reducer、內置開發工具支持等,提升了開發體驗。

因此,在現代 React 和 React Native 項目中,使用 Redux Toolkit 會讓狀態管理更加簡潔和高效。

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

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

相關文章

[特殊字符] CentOS 7 離線安裝 MySQL 5.7 實驗

&#x1f427; CentOS 7 離線安裝 MySQL 5.7 實驗 針對企業無互聯網環境的系統&#xff0c;設計了如何在 CentOS 7 系統中&#xff0c;使用一臺可以聯網的主機&#xff08;NodeA&#xff09;為另一臺無法聯網的主機&#xff08;NodeB&#xff09;安裝 MySQL 5.7 數據庫及其依賴…

Redis 概率型數據結構實戰指南

1. 為什么要用「近似」&#xff1f; 隨著業務量爆發式增長&#xff0c;精確統計 的內存或 CPU 成本可能難以接受。例如&#xff1a; 統計一天內 唯一 IP 數 —— 用 SET 精確去重&#xff0c;百萬 IP→占用數百 MB。統計海量商品銷量、實時計算 P99 延遲、獲取 TOP-N 熱門頁面……

Android開發工程師:Linux一條find grep命令通關搜索內容與文件

find . -type f \( -name "*.java" -o -name "*.xml" \) -not -path "./out/*" -exec grep -irnE activity|class {} 多關鍵詞搜索&#xff1a;使用正則表達式 pattern1|pattern2 同時搜索多個關鍵詞&#xff08;如 activity|class&#xff09;單…

深入理解瀏覽器解析機制和XSS向量編碼

URL 編碼 "javascript:alert(1)"---->%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29<a href"%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a>-------瀏覽器解析不了。 頁面識別在url解碼之前&#xff0c;在…

ThinkPHP8極簡上手指南:開啟高效開發之旅

目錄一、環境搭建1.1 安裝 PHP1.2 安裝 Composer二、安裝 ThinkPHP8三、目錄結構解析四、第一個簡單示例&#xff1a;Hello, ThinkPHP84.1 創建控制器4.2 編寫控制器方法4.3 配置路由4.4 訪問測試五、進階示例&#xff1a;數據庫查詢5.1 配置數據庫連接5.2 創建模型5.3 編寫查詢…

智能制造之物料詳解

在制造業業務系統中&#xff0c;物料流轉貫穿“需求→采購→入庫→生產→成品→交付”全流程&#xff0c;各系統通過數據協同實現物料狀態、位置、數量的精準追蹤。以下按流轉階段拆解&#xff1a;一、需求發起與計劃階段&#xff08;CRM/ERP/PLM主導&#xff09;1. 需求源頭…

Qt的安裝和環境配置

QT開發環境的搭建&#xff0c;需要安裝3個部分&#xff0c;C編譯器、Qt SDK(SDK是軟件開發工具包)、QT的集成開發環境(IDE)Qt的3種集成開發環境&#xff1a;Qt Creator&#xff1a;是由Qt官方提供的&#xff0c;容易上手&#xff0c;不需要額外的配置&#xff0c;但是有一些bug…

解析MCUboot的實現原理和Image結構

目錄 概述 1 MCUboot的功能 1.1 代碼包結構 1.2 限制 2 MCUboot Image 2.1 Image格式 2.2 Flash Map 2.3 Image 槽 2.4 使用scratch交換 2.5 Image 尾部數據結構 3 交換區 3.1 單交換區 3.2 Multiple Image boot 3.3 Image交換 4 交換狀態&#xff08;swap statu…

YOLOv8目標檢測項目代碼詳解與習題

YOLOv8目標檢測項目代碼詳解與習題一、項目代碼詳解該代碼是基于 YOLOv8 和 OpenCV 實現的圖像目標檢測項目&#xff0c;核心功能是加載預訓練的 YOLOv8 模型&#xff0c;對指定圖像進行目標檢測&#xff0c;然后可視化檢測結果并保存或顯示。以下是逐行解析&#xff1a;# -*- …

gradle關于dependency-management的使用

1、相關文檔Spring官方文檔&#xff1a;https://docs.spring.io/dependency-management-plugin/docs/current-SNAPSHOT/reference/html/#introduction倉庫版本查看&#xff1a;https://mvnrepository.com/artifact/io.spring.gradle/dependency-management-plugin/1.0.15.RELEA…

Java SpringBoot 對接FreeSwitch

1.增加Maven依賴<dependency><groupId>org.freeswitch.esl.client</groupId><artifactId>org.freeswitch.esl.client</artifactId><version>0.9.2</version></dependency><!-- XML-RPC --><dependency><groupI…

限流算法與實現

費曼學習法學習限流算法為什么要限流mysql插入600次/秒超過這個閾值&#xff0c;要么使用mysql集群、要么限流&#xff0c;防止宕機有哪些算法固定窗口就是個計數器&#xff0c;一秒內超過閾值&#xff0c;不允許訪問缺點&#xff1a;不均勻&#xff0c;跨越臨界點的一秒內&…

Android本地瀏覽PDF(Android PDF.js 簡要學習手冊)

環境 Min SDK: 21 依賴&#xff1a; implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1" implementation "androidx.webkit:webkit:1.12.0"權限&#xff1a; <uses-permission android:name"android.permission.INTERNE…

CVE-2022-41128

概述CVE-2022-41128 是 Microsoft Internet Explorer&#xff08;IE&#xff09;瀏覽器中 JavaScript 引擎&#xff08;JScript/Chakra&#xff09;的一個 0day 漏洞&#xff08;披露時無官方補丁&#xff09;&#xff0c;屬于內存破壞類漏洞&#xff0c;可被用于遠程代碼執行&…

基于LSTM的時間序列到時間序列的回歸模擬

獲取項目源碼點擊文末名片項目背景與目標 本項目旨在開發一種基于長短期記憶網絡&#xff08;LSTM&#xff09;的模型&#xff0c;用于時間序列到時間序列的回歸模擬任務。通過處理多組不同來源的時間序列數據&#xff0c;本模型的目標是從給定的輸入序列中預測相應的輸出序列。…

Linux基礎命令詳解:從入門到精通

本文整理了Linux系統中最常用的基礎命令&#xff0c;每個命令都配有詳細說明和具體示例&#xff0c;幫助你快速掌握Linux操作技巧。文章中用的終端是XShell,系統是Centos&#x1f4c1; 1. ls - 列出目錄&#xff08;文件夾&#xff09;內容 功能&#xff1a;顯示當前目錄下的文…

正點原子stm32F407學習筆記10——輸入捕獲實驗

一、輸入捕獲簡介 輸入捕獲模式可以用來測量脈沖寬度或者測量頻率。我們以測量脈寬為例&#xff0c;用一個簡圖來 說明輸入捕獲的原理&#xff0c;如圖所示&#xff1a;假定定時器工作在向上計數模式&#xff0c;圖中 t1到t2 時間&#xff0c;就是我們需要測量的高電平時間。測…

深入理解設計模式:狀態模式(State Pattern)

在軟件開發中&#xff0c;我們經常會遇到對象的行為隨著其內部狀態的變化而變化的情況。例如&#xff0c;一個訂單可能處于"待支付"、"已支付"、"已發貨"或"已完成"等不同狀態&#xff0c;每個狀態下訂單的操作邏輯可能完全不同。如果…

企業級網絡綜合集成實踐:VLAN、Trunk、STP、路由協議(OSPF/RIP)、PPP、服務管理(TELNET/FTP)與安全(ACL)

NE綜合實驗4 一、實驗拓撲二、實驗需求 按照圖示配置IP地址。Sw7和sw8之間的直連鏈路配置鏈路聚合。公司內部業務網段為vlan10和vlan20&#xff0c;vlan10是市場部&#xff0c;vlan20是技術部&#xff0c;要求對vlan進行命名以便區分識別&#xff1b;pc10屬于vlan10&#xff0c…

小架構step系列20:請求和響應的擴展點

1 概述通過上一篇了解請求和響應的流程&#xff0c;Spring在設計上留了不少擴展點。里面通過查找接口的方式獲取的地方&#xff0c;都可以成為一種擴展點&#xff0c;因為只要實現這類接口就可以成為Spring加載的一部分。本文了解一下這些擴展點&#xff0c;方便后面進行擴展。…