Redux - Redux在React函數式組件中的基本使用

在這里插入圖片描述

文章目錄

    • 一,簡介
    • 二,安裝
    • 三,三大核心概念Store、Action、Reducer
      • 3.1 Store
      • 3.2 Reducer
      • 3.3 Action
    • 四,開始函數式組件中使用
      • 4.1,引入store
      • 4.1,store.getState()方法
      • 4.3,store.dispatch()方法
      • 4.4,store.subscribe()方法
    • 五,Redux 的三大原則

一,簡介

Redux 是 JavaScript 應用的狀態容器,提供可預測的狀態管理。

它主要的幾個方法如下:

在這里插入圖片描述
重要的有方法 有 dispatch(分發action)getState(獲取state)subscribe(監聽state的變化),下面會介紹到,另外兩個可以不用管;


那什么時候使用Redux呢?

當遇到如下問題時,建議開始使用 Redux

  1. 你有很多數據隨時間而變化
  2. 你希望狀態有一個唯一確定的來源(single source of truth)
  3. 你發現將所有狀態放在頂層組件中管理已不可維護

二,安裝

我這里安裝的是 "redux": "^4.2.1"版本;

npm install redux --save

項目的src目錄下面新建store文件夾index.js,reducer.js;如下:

在這里插入圖片描述

三,三大核心概念Store、Action、Reducer

3.1 Store

Store:存儲數據的地方。最好整個應用只有一個 Store。

createStore() :用來生成 Store。接收 Reducer 作為其參數。

index.js

/*** 引入createStore 專門創建最為核心的store對象* 目前createStore已經棄用,所以我們要引用legacy_createStore */iimport { legacy_createStore } from "redux";
import reducer from './reducer.ts'// 創建數據倉庫 引入reducer函數進行對數據的處理
const store = legacy_createStore(reducer)export default store

3.2 Reducer

reduce的本質就是一個函數 ,作用是初始化狀態和加工狀態。

reduce函數里面接收兩個參數,第一個參數是state的初始值,第二個參數是一個action對象,對象里的第一個屬性是type也就是函數的名稱,第二個屬性就是傳進來的值,用于后續更改state;

reducer.ts


// 約束類型
interface Eula {name: string;age: number;
}
// 定義數據
const defaultState: Eula = {name: "Eula",age: 18
};// reducer 函數 用于更改數據
let reducer = (preState = defaultState, action: { type: string; data: number }) => {// action解構出來let { type, data } = action;// 第一種寫法 每個分支使用return進行返回// switch (type) {//   case "update_age"://     preState.age = data;//     return preState;//   case "add_age"://     preState.age++;//     return preState;//   case "del_age"://     preState.age--;//     return preState;//   default://     return preState; // 初始化時// }// 第二種寫法 break 與最終的return返回結果switch (type) {case "update_age":preState.age = data;break;case "add_age":preState.age++;break;case "del_age":preState.age--;break;default:preState; // 初始化時}return preState;  // 此處 一定要使用return進行返回最終改變的值
};export default reducer;

注意: 初次加載 Store 會自動調用一次 Reducer 進行初始化狀態,此時 state 是 undefined,action 對象中的 type 為 @@redux/INITxxx。手動調用 store.dispatch() 也會觸發 Reducer 的自動執行。

3.3 Action

Action 就是一個普通的 JS 對象,用于描述要更新的數據類型和內容,其中 type 屬性是必須的,表示 Action 的名稱,其他屬性可以自由設置。

redux.tsx

// 引入store
import store from "../../../store/index";
// 更改數據時調用
store.dispatch({ type: "update_age", data: 100 });

store.dispatch():所有數據的變化,必須通過派發(dispatch) Action 來更新。接受一個 Action 對象作為參數,將其發送出去。

四,開始函數式組件中使用

redux.tsx

import React, { useState } from "react";
//  1,引入store
import store from "../../../store/index";// 渲染數據
const myList:[] = [];const Redux: React.FC = () => {let [list, setList] = useState(myList);console.log("store:", store);// 監聽數據的變化const unsubscribe = store.subscribe(() => {console.log("訂閱數據的變化", store.getState());// 此處用來觸發視圖的更新setList([]);});// 改變store中的數據const update = () => {store.dispatch({ type: "update_age", data: 100 });};const add = () => {store.dispatch({ type: "add_age" });};const del = () => {store.dispatch({ type: "del_age" });};// 此處才是真正渲染的頁面return (<div className="redux"><h3>redux演示</h3><button onClick={update}>更改store的數據+100</button><button onClick={add}>更改store的數據++</button><button onClick={del}>更改store的數據--</button><p>store的num數據:{store.getState().age}</p></div>);
};
export default Redux;

效果圖:

在這里插入圖片描述

上面的組件是一個簡單的案例演示,定義了三個點擊事件,點擊第一個按鈕state.age+100,點擊第二個按鈕每次state.age+1,點擊第三個按鈕age每次減一;下面會詳細介紹幾個重點內容:

4.1,引入store

先引進來,這個沒什么好說的;

import store from "../../../store/index";

4.1,store.getState()方法

getState()方法是redux實例下的方法之一,上面的第一張截圖已經通過store實例打印出來了;

getState()的作用是獲取當前狀態下運行在redux中的state;也就是說獲取store中最新的數據;

   <p>store的num數據:{store.getState().age}</p>

4.3,store.dispatch()方法

dispatch() 是唯一能夠修改 state 數據的行為。通過分發action (其實就是一個對象),配合 dispatch 函數傳入的 action 及其 payload 計算得到新的 state,并更新到閉包數據中,這樣就實現了 state 的更新;

如下:
reducer.tsx

  // 改變store中的數據const update = () => {store.dispatch({ type: "update_age", data: 100 });};const add = () => {store.dispatch({ type: "add_age" });};const del = () => {store.dispatch({ type: "del_age" });};

上面的代碼會和下面的 switch case 表達式所判斷的type要一 一對應,用于更新state;

reducer.ts

let reducer = (preState = defaultState, action: { type: string; data: number }) => {let { type, data } = action;// 第一種寫法 每個分支使用return進行返回// switch (type) {//   case "update_age"://     preState.age = data;//     return preState;//   case "add_age"://     preState.age++;//     return preState;//   case "del_age"://     preState.age--;//     return preState;//   default://     return preState; // 初始化時// }// 第二種寫法 break 與最終的return返回結果switch (type) {case "update_age":preState.age = data;break;case "add_age":preState.age++;break;case "del_age":preState.age--;break;default:preState; // 初始化時}return preState;  // 此處 一定要使用return進行返回最終改變的值
};

上面的兩種寫法是一樣的;對比一下;

4.4,store.subscribe()方法

subscribe函數只要store中的state數據變化了,就會觸發subscribe方法,相當注冊了一個監聽器;監聽store中的數據變化;

從 react 層面來說,redux 的 store 是隔離開的,我們需要一個橋梁,使得數據層出現更新的同時更新UI層邏輯,這時 store 中的最后一個方法,subscribe 方法就派上用場了。

注意: setList([]):是為了主動觸發react視圖更新的方法,否則store中數據改變了,視圖卻沒有重新渲染。

import React, { useState } from "react";
const Redux: React.FC = () => { let [list, setList] = useState(myList);
// 監聽數據的變化const unsubscribe = store.subscribe(() => {console.log("訂閱數據的變化", store.getState());// 此處用來觸發視圖的更新setList([]);});
}

subscribe也同時返回了一個 unsubscribe 函數。當我們不在希望訂閱這個監聽器時,調用 unsubscribe(),對應的函數就會從監聽器隊列中被移除。

unsubscrib() // 不再監聽

五,Redux 的三大原則

  1. 單一數據源:整個應用程序的 State 被存儲在一棵 object tree 中,并且這棵 object tree 只存儲在一個 Store 中。單一數據源可以讓整個應用程序的 State 變得方便維護、修改、追蹤。
  2. State 是只讀的:唯一修改 State 的方法就是觸發 Action,不要試圖在其他地方通過任何的方式來修改State。這樣可以保證所有的修改都被集中化處理,并且按照嚴格的順序來執行。
  3. 使用純函數來執行修改:通過 Reducer 將舊的 State 和 Action 聯系在一起,返回一個新的 State。所有的Reducer 都應該是純函數,不能產生任何的副作用。

End:


[redux中文網]: https://cn.redux.js.org/

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

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

相關文章

cookie和session的區別及原理

Cookie概念 在瀏覽某些 網站 時,這些網站會把 一些數據存在 客戶端 , 用于使用網站 等跟蹤用戶,實現用戶自定義 功能. 是否設置過期時間: 如果不設置 過期時間,則表示這個 Cookie生命周期為 瀏覽器會話期間 , 只要關閉瀏覽器,cookie就消失了. 這個生命期為瀏覽會話期的cookie,就…

其他行業跳槽轉入計算機領域簡單看法

其他行業跳槽轉入計算機領域簡單看法 本人選擇從以下幾個方向談談自己的想法和觀點。 如何規劃才能實現轉碼 自我評估和目標設定&#xff1a;首先&#xff0c;你需要評估自己的技能和興趣&#xff0c;確定你希望在計算機領域從事的具體職位或領域。這有助于你更好地規劃學習路…

深入了解 Rancher Desktop 設置

Rancher Desktop 設置的全面概述 Rancher Desktop 擁有方便、強大的功能&#xff0c;是最佳的開發者工具之一&#xff0c;也是在本地構建和部署 Kubernetes 的最快捷方式。 本文將介紹 Rancher Desktop 的功能和特性&#xff0c;以及 Rancher Desktop 作為容器管理平臺和本地…

人工智能原理(2)

目錄 一、知識與知識表示 1、知識 2、知識表示 3、知識表示方法 二、謂詞邏輯表示法 1、命題邏輯 2、謂詞邏輯 三、產生式表達法 1、知識的表示方法 2、產生式系統組成 3、推理方式 4、產生式表示法特點 四、語義網絡 1、概念及結構 2、語義網絡的基本語義聯系 …

zookeeper案例

目錄 案例一&#xff1a;服務器動態上下線 服務端&#xff1a; &#xff08;1&#xff09;先獲取zookeeper連接 &#xff08;2&#xff09;注冊服務器到zookeeper集群&#xff1a; &#xff08;3&#xff09;業務邏輯&#xff08;睡眠&#xff09;&#xff1a; 服務端代碼…

Java+Excel+POI+testNG基于數據驅動做一個簡單的接口測試【杭州多測師_王sir】

一、創建一個apicases.xlsx放入到eclipse的resource里面&#xff0c;然后refresh刷新一下 二、在pom.xml文件中加入poi和testng的mvn repository、然后在eclipse的對應目錄下放入features和plugins&#xff0c;重啟eclipse就可以看到testNG了 <!--poi excel解析 --><d…

運維監控學習筆記3

DELL的IPMI頁面的登錄&#xff1a; 風扇的狀態&#xff1a; 電源溫度&#xff1a;超過70度就告警&#xff1a; 日志信息&#xff1a; 可以看到更換過磁盤。 iDRAC的設置 虛擬控制臺&#xff1a;啟動遠程控制臺&#xff1a; 可以進行遠程控制。 機房工程師幫我們接遠程控制&…

【云原生】kubernetes中容器的資源限制

目錄 1 metrics-server 2 指定內存請求和限制 3 指定 CPU 請求和限制 資源限制 在k8s中對于容器資源限制主要分為以下兩類: 內存資源限制: 內存請求&#xff08;request&#xff09;和內存限制&#xff08;limit&#xff09;分配給一個容器。 我們保障容器擁有它請求數量的…

【云原生】K8S集群

目錄 一、調度約束1.1 POT的創建過程1.1調度過程 二、指定節點調度2.1 通過標簽選擇節點 三、親和性3.1requiredDuringSchedulingIgnoredDuringExecution&#xff1a;硬策略3.1 preferredDuringSchedulingIgnoredDuringExecution&#xff1a;軟策略3.3Pod親和性與反親和性3.4使…

(2)原神角色數據分析-2

功能一&#xff1a; 得到某個屬性的全部角色&#xff0c;將其封裝在class中 """各元素角色信息&#xff1a;一對多""" from pandas import DataFrame, Series import pandas as pd import numpy as npclass FindType:# 自動執行&#xff0c;將…

山東布谷科技直播平臺搭建游戲開發技術分享:數據存儲的重要意義

在市場上的熱門的直播平臺中&#xff0c;有很多小程序為用戶提供各種各樣的功能&#xff0c;這其中就有很多游戲小程序&#xff0c;當今社會獨生子女眾多&#xff0c;很多作為獨生子女的用戶都會去選擇一個能夠社交互動的APP來填補內心的空虛&#xff0c;而直播平臺的實時互動的…

SAP 選擇屏幕組件名描述翻譯時字符長度不夠問題處理

問題&#xff1a;有時候我們在開發report程序的時候&#xff0c;要求程序顯示支持中英文&#xff0c;如果程序是在中文環境下開發的時候&#xff0c;需要進行翻譯處理&#xff0c;但是我們發現選擇屏幕上的組件的描述支持的默認長度是30位&#xff0c;如果超過該如何處理呢 解…

《路由與交換技術》讀書筆記

小小感悟 工作近3年&#xff0c;基本沒去看路由交換相關書籍&#xff0c;趁著搬家后&#xff0c;周末閑暇時間&#xff0c;快速看了一遍《路由與交換技術》&#xff0c;溫習了一遍&#xff0c;很有收獲&#xff0c;以后還是要多花時間看看其他類型的書。 讀書筆記 1.1 移動通…

構建一個LLM應用所需的所有信息

一、說明 您是否對大型語言模型&#xff08;LLM&#xff09;的潛力感興趣&#xff0c;并渴望創建您的第一個基于LLM的應用程序&#xff1f;或者&#xff0c;也許您是一位經驗豐富的開發人員&#xff0c;希望簡化工作流程&#xff1f;看看DemoGPT就是您的最佳選擇。該工具旨在簡…

【軟件測試】Linux環境下Docker搭建+Docker搭建MySQL服務(詳細)

目錄&#xff1a;導讀 前言 一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 Linux之docker搭…

CDN(內容分發網絡)

CDN的全稱是 Content Delivery Network, 即內容分發網絡。CDN是構建在現有網絡基礎之上的智能虛擬網絡&#xff0c;依靠部署在各地的邊緣服務器&#xff0c;通過中心平臺的負載均衡、內容分發、調度等功能模塊&#xff0c;使用戶就近獲取所需內容&#xff0c;降低網絡擁塞&a…

詳談MongoDB的那些事

概念區分 什么是關系型數據庫 關系型數據庫&#xff08;Relational Database&#xff09;是一種基于關系模型的數據庫管理系統&#xff08;DBMS&#xff09;。在關系型數據庫中&#xff0c;數據以表格的形式存儲&#xff0c;表格由行和列組成&#xff0c;行表示數據記錄&…

神秘的ip地址8.8.8.8,到底是什么類型的DNS服務器?

下午好&#xff0c;我的網工朋友。 DNS&#xff0c;咱們網工配置網絡連接或者路由器時&#xff0c;高低得和這玩意兒打交道吧。 它是互聯網中用于將人類可讀的域名&#xff08;例如http://www.example.com&#xff09;轉換為計算機可理解的IP地址&#xff08;例如192.0.2.1&a…

元宇宙核能發電VR模擬仿真實訓教學為建設新型電力系統提供重要支撐

隨著“碳達峰、碳中和”目標與建設新型能源體系的提出&#xff0c;在元宇宙環境下建設電力系統是未來發展的趨勢。以物聯網、區塊鏈、數字孿生、混合現實等技術為主要代表的元宇宙技術體系及其在電力和能源系統中的應用&#xff0c;將會促進智能電網的發展&#xff0c;為建設新…

Oracle 知識篇+分區表上的索引由global改為local注意事項

★ 知識點 二、知識點 ?Local型索引有如下優點 1.Only one index partition must be rebuilt when a maintenance operation other than SPLIT PARTITION or ADD PARTITION is performed on an underlying table partition. 2.The duration of a partition maintenance opera…