React狀態管理——react-redux

目錄

一、redux介紹

二、安裝

三、基本實現步驟

3.1 創建Action Types

3.2 創建counterAction

3.3 創建counterReducer

3.4 結合所有Reducer

3.5 創建store

3.6 入口文件中提供store

3.7 在組件中的使用

3.8 使用thunk實現異步支持

3.8.1 安裝

3.8.2 在counterAction中添加異步操作

3.8.3 在store文件中添加異步支持

3.8.4 在組件中進行異步操作

3.9 函數式組件使用hooks代替connect


一、redux介紹

Redux 基于三個基本原則:

  • 單一數據源:整個應用的狀態存儲在一個對象樹中

  • 狀態是只讀的:唯一改變狀態的方法是觸發 action

  • 使用純函數執行修改:reducer 是純函數,接收舊 state 和 action,返回新 state

二、安裝

npm install redux react-redux

三、基本實現步驟

3.1 創建Action Types

// actionTypes.js
export const INCREMENT = "INCREMENT";
export const DECREMENT = "DECREMENT";

3.2 創建counterAction

// store/actions/counterAction.jsimport { INCREMENT, DECREMENT } from "../../utils/actionTypes";export const increment = () => ({type: INCREMENT,
});export const decrement = () => ({type: DECREMENT,
});

3.3 創建counterReducer

// store/reducers/counterReducer.jsimport { INCREMENT, DECREMENT } from "../../utils/actionTypes";const initialState = {count: 0,
};export default function counterReducer(state = initialState, action) {switch (action.type) {case INCREMENT:return { ...state, count: state.count + 1 };case DECREMENT:return { ...state, count: state.count - 1 };default:return state;}
}

3.4 結合所有Reducer

// store/reducers/index.jsimport { combineReducers } from "redux";
import counterReducer from "./counterReducer";export default combineReducers({counter: counterReducer,
});

3.5 創建store

// store/index.js
import { createStore } from "redux";
import reducers from "./reducers";const store = createStore(reducers);export default store;

3.6 入口文件中提供store

// index.jsimport React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import store from "./store";
import { Provider } from "react-redux";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<Provider store={store}><App /></Provider>
);

3.7 在組件中的使用

import React from "react";
import { connect } from "react-redux";
import { increment, decrement } from "./store/actions/counterAction";function App(props) {const { count, increment, decrement } = props;return (<div><div>數值:{count}</div><button onClick={() => increment()}>點我+1</button><button onClick={() => decrement()}>點我-1</button></div>);
}
const mapStateToProps = (state) => ({count: state.counter.count, // store/reducers/index.js中的counter映射
});const mapDispatchToProps = {increment,decrement,
};export default connect(mapStateToProps, mapDispatchToProps)(App);

3.8 使用thunk實現異步支持

3.8.1 安裝

npm install redux-thunk

3.8.2 在counterAction中添加異步操作

// store/actions/counterAction.jsimport { INCREMENT, DECREMENT } from "../../utils/actionTypes";export const increment = () => ({type: INCREMENT,
});export const decrement = () => ({type: DECREMENT,
});export const fetchIncrement = (timeout) => {return (dispatch) => {setTimeout(() => {dispatch(increment());}, timeout);};
};

3.8.3 在store文件中添加異步支持

// store.js
import { createStore, applyMiddleware } from "redux";
import { thunk } from "redux-thunk";
import reducers from "./reducers";const store = createStore(reducers, applyMiddleware(thunk));export default store;

3.8.4 在組件中進行異步操作

import React from "react";
import { connect } from "react-redux";
import {increment,decrement,fetchIncrement,
} from "./store/actions/counterAction";function App(props) {const { count, increment, decrement, fetchIncrement } = props;return (<div><div>數值:{count}</div><button onClick={() => increment()}>點我+1</button><button onClick={() => decrement()}>點我-1</button><button onClick={() => fetchIncrement(1000)}>點我異步+1</button></div>);
}
const mapStateToProps = (state) => ({count: state.counter.count, // store/reducers/index.js中的counter映射
});const mapDispatchToProps = {increment,decrement,fetchIncrement,
};export default connect(mapStateToProps, mapDispatchToProps)(App);

3.9 函數式組件使用hooks代替connect

// App.jsimport React from "react";
import { useSelector, useDispatch } from "react-redux";
import {increment,decrement,fetchIncrement,
} from "./store/actions/counterAction";export default function App(props) {const { count } = useSelector((state) => state.counter); // store/reducers/index.js中的counter映射const dispatch = useDispatch();return (<div><div>數值:{count}</div><button onClick={() => dispatch(increment())}>點我+1</button><button onClick={() => dispatch(decrement())}>點我-1</button><button onClick={() => dispatch(fetchIncrement(1000))}>點我異步+1</button></div>);
}

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

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

相關文章

Java 零工市場小程序 | 靈活就業平臺 | 智能匹配 | 日結薪系統 | 用工一站式解決方案

在就業形勢如此嚴峻的情況下&#xff0c;很多小伙伴都會選擇零工的工作方式來賺取外快&#xff0c;很多用人單位也會因為職為短暫空缺或是暫時人手不夠而選擇招用兼職人員。 而Java 作為企業級開發的主流語言&#xff0c;以其卓越的性能和穩定性著稱。把零工的需求&#xff08…

數據可視化——一圖勝千言

第04篇&#xff1a;數據可視化——一圖勝千言 寫在前面&#xff1a;大家好&#xff0c;我是藍皮怪&#xff01;前面幾篇我們聊了統計學的基本概念、數據類型和描述性統計&#xff0c;這一篇我們要聊聊數據分析中最直觀、最有趣的部分——數據可視化。你有沒有發現&#xff0c;很…

1.1 Linux 編譯FFmpeg 4.4.1

一、安裝編譯工具 sudo apt install -y autoconf automake build-essential cmake git pkg-config nasm yasm libtool zlib1g-dev說明&#xff1a; autoconf&#xff1a;生成 configure 腳本&#xff0c;用于自動配置源碼。automake&#xff1a;與 autoconf 配合&#xff0c;…

【圖片識別改名】如何批量識別大量圖片的文字并重命名圖片,基于WPF和京東OCR識別接口的實現方案

應用場景 在企業文檔管理、數字圖書館、電商商品管理等場景中&#xff0c;經常需要處理大量圖片中的文字信息。例如&#xff1a; 電商平臺需要將商品圖片中的型號、規格等信息提取出來作為文件名圖書館需要將掃描的圖書頁面識別為文字并整理歸檔企業需要將紙質文檔電子化并按…

簡歷模板2——數據挖掘工程師5年經驗

姓名 / Your Name 數據挖掘工程師 | 5年經驗 | 推薦/風控/圖模型 &#x1f4de; 138-XXXX-XXXX | ?? your.emailexample.com | &#x1f310; github.com/yourname | &#x1f4cd; 北京 &#x1f3af; 個人簡介 / Summary 5年大廠數據挖掘經驗&#xff0c;碩士學歷。擅長推…

CSS3 漸變效果

1. 引言 CSS3 漸變能夠在指定顏色之間創建平滑過渡效果。這種設計元素不僅能為網頁增添豐富的視覺層次&#xff0c;更是現代網頁設計的重要組成部分。CSS3 提供兩種主要的漸變類型&#xff1a;線性漸變(Linear Gradient) - 沿直線方向進行顏色過渡&#xff1b;徑向漸變(Radial…

A Survey on 3D Gaussian Splatting——3D高斯領域綜述

原文鏈接&#xff1a;[2401.03890] A Survey on 3D Gaussian Splatting 動態更新的GitHub倉庫&#xff08;包含性能對比與最新文獻追蹤&#xff09;&#xff1a; https://github.com/guikunchen/3DGS-Benchmarks https://github.com/guikunchen/Awesome3DGS 摘要&#xff1…

計算機網絡 期末實訓 eNSP 校園網

eNSP 綜合實訓 小型校園網 計算機網絡期末實訓 01 搭建拓撲 1.設計任務 構建一個小型校園網絡,涵蓋以下設備與區域: 學生宿舍區:50臺計算機辦公樓區:30臺計算機(細分為財務部門、人事部門及其他科室)圖書館:10臺計算機教學樓:30臺計算機服務器集群:2臺服務器,分別用…

Smart Form Adobe form 強制更改內表:TNAPR

強制更改內表:TNAPR se16-> Smart Form總覽 Smart form 變量格式說明: &symbol& (括號中,小寫字母為變量) &symbol& 屏蔽從第一位開始的N位 &symbol (n)& 只顯示前N位 &symbol (S)& 忽略正負號 &symbol (<)& 符號在…

頁面配置文件pages.json和小程序配置

頁面配置文件pages.json和小程序配置 pages.jsonpagesstyle-navigationBarBackgroundColorstyle-navigationBarTitleTextstyle-navigationStylestyle-enablePullDownRefresh注意事項不同平臺區分配置新建頁面 globalStyletabBar代碼 manifest.json授權web配置代理 pages.json …

Linux網絡配置工具ifconfig與ip命令的全面對比

在Linux網絡管理中&#xff0c;ifconfig和 ip命令是最常用的兩個工具。隨著時間的推移&#xff0c;ip命令逐漸取代了 ifconfig&#xff0c;成為更強大和靈活的網絡配置工具。本文將對這兩個工具進行全面對比&#xff0c;幫助您理解它們的區別和各自的優勢。 一、ifconfig命令 …

STM32 實現解析自定義協議

一、環形隊列設計與實現&#xff08;核心緩沖機制&#xff09; 數據結構設計&#xff1a; #define BUFFER_SIZE 512 #define BUFFER_MASK (BUFFER_SIZE - 1) typedef struct {volatile uint8_t buffer[BUFFER_SIZE]; // 環形緩沖區&#xff08;大小可配置&#xff09;volati…

NGINX 四層上游模塊`ngx_stream_upstream_module` 實戰指南

一、模塊定位與引入 模塊名稱&#xff1a;ngx_stream_upstream_module 首次引入&#xff1a;NGINX 1.9.0&#xff08;2015-08-04&#xff09; 編譯選項&#xff1a;啟用 --with-stream&#xff08;含此模塊&#xff09; 作用&#xff1a; 定義后端服務器組&#xff08;upstr…

WinUI3入門2:DataGrid動態更新 添加刪除和修改字段

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

基于Python學習《Head First設計模式》第十三章 現實世界中的模式

定義設計模式 設計模式要素 模式名稱、分類意圖&#xff1a;描述模式是什么動機&#xff1a;描述什么時候使用這個模式&#xff0c;具體場景適用性&#xff1a;描述什么地方使用這個模式&#xff0c;用在什么場合結構&#xff1a;類圖參與者&#xff1a;類和對象的責任和角色…

線性代數(1)線性方程組的多種解法

求解線性方程組是線性代數的核心問題之一&#xff0c;根據方程組的類型&#xff08;如齊次/非齊次、方陣/非方陣、稀疏/稠密等&#xff09;&#xff0c;可以采用不同的解法。以下是常見的線性方程組解法分類及簡要說明&#xff1a; 一、直接解法&#xff08;精確解&#xff09…

肝臟/肝臟腫瘤圖像分割數據集(貓臉碼客第261期)

探秘肝臟/肝臟腫瘤圖像分割&#xff1a;醫學影像技術的新突破 一、引言 肝臟/肝臟腫瘤圖像分割在醫學領域占據著愈發重要的地位&#xff0c;為肝臟疾病的精準診斷與有效治療提供了關鍵技術支撐。隨著醫學成像技術的飛速進步&#xff0c;如磁共振成像&#xff08;MRI&#xff…

【LLM05---位置編碼】

文章目錄 位置編碼引出Transformer中位置編碼方法:Sinusoidal functions兩個重要性質位置編碼 最近在學習位置編碼,想找一個講的比較透徹的文章或視頻,找了半天,滿意的一個也沒有,所以自己記錄一下。 注意,本篇筆記只作為自己的學習記錄用,更好的講解的內容請看鏈接:位…

pikachu——ssrf

概念補充&#xff1a; 內網&#xff1a;局部范圍內的私有網絡&#xff0c;比如局域網就是一個小范圍的內網&#xff0c;有私有IP&#xff0c;并且內網受防火墻的保護&#xff0c;外網無法直接訪問 外網&#xff1a;全球范圍的公共網絡&#xff0c;公有ip ip地址&#xff1a;…

java 設計模式_行為型_13備忘錄模式

13.備忘錄模式 模式定義 備忘錄模式&#xff08;Memento Pattern&#xff09;模式的定義&#xff1a;在不破壞封裝性的前提下&#xff0c;捕獲一個對象的內部狀態&#xff0c;并在該對象之外保存這個狀態&#xff0c;以便以后當需要時能將該對象恢復到原先保存的狀態。該模式又…