網站首頁 編程語言 正文
一、是什么
React
是用于構建用戶界面的,幫助我們解決渲染DOM
的過程
而在整個應用中會存在很多個組件,每個組件的state
是由自身進行管理,包括組件定義自身的state
、組件之間的通信通過props
傳遞、使用Context
實現數據共享
如果讓每個組件都存儲自身相關的狀態,理論上來講不會影響應用的運行,但在開發及后續維護階段,我們將花費大量精力去查詢狀態的變化過程
這種情況下,如果將所有的狀態進行集中管理,當需要更新狀態的時候,僅需要對這個管理集中處理,而不用去關心狀態是如何分發到每一個組件內部的
redux
就是一個實現上述集中管理的容器,遵循三大基本原則:
- 單一數據源
- state 是只讀的
- 使用純函數來執行修改
注意的是,redux
并不是只應用在react
中,還與其他界面庫一起使用,如Vue
二、工作原理
redux
要求我們把數據都放在?store
公共存儲空間
一個組件改變了?store
?里的數據內容,其他組件就能感知到?store
的變化,再來取數據,從而間接的實現了這些數據傳遞的功能
工作流程圖如下所示:
根據流程圖,可以想象,React Components
?是借書的用戶,?Action Creactor
?是借書時說的話(借什么書),?Store
?是圖書館管理員,Reducer
?是記錄本(借什么書,還什么書,在哪兒,需要查一下),?state
?是書籍信息
整個流程就是借書的用戶需要先存在,然后需要借書,需要一句話來描述借什么書,圖書館管理員聽到后需要查一下記錄本,了解圖書的位置,最后圖書館管理員會把這本書給到這個借書人
轉換為代碼是,React Components
?需要獲取一些數據, 然后它就告知?Store
?需要獲取數據,這就是就是?Action Creactor
?,?Store
?接收到之后去?Reducer
?查一下,?Reducer
?會告訴?Store
?應該給這個組件什么數據
三、如何使用
創建一個store
的公共數據區域
import { createStore } from 'redux' // 引入一個第三方的方法 const store = createStore() // 創建數據的公共存儲區域(管理員)
還需要創建一個記錄本去輔助管理數據,也就是reduecer
,本質就是一個函數,接收兩個參數state
,action
,返回state
// 設置默認值 const initialState = { counter: 0 } const reducer = (state = initialState, action) => { }
然后就可以將記錄本傳遞給store
,兩者建立連接。
如下:
const store = createStore(reducer)
如果想要獲取store
里面的數據,則通過store.getState()
來獲取當前state
console.log(store.getState());
下面再看看如何更改store
里面數據,是通過dispatch
來派發action
,通常action
中都會有type
屬性,也可以攜帶其他的數據
store.dispatch({ type: "INCREMENT" }) store.dispath({ type: "DECREMENT" }) store.dispatch({ type: "ADD_NUMBER", number: 5 })
下面再來看看修改reducer
中的處理邏輯:
const reducer = (state = initialState, action) => { switch (action.type) { case "INCREMENT": return {...state, counter: state.counter + 1}; case "DECREMENT": return {...state, counter: state.counter - 1}; case "ADD_NUMBER": return {...state, counter: state.counter + action.number} default: return state; } }
注意,reducer
是一個純函數,不需要直接修改state
這樣派發action
之后,既可以通過store.subscribe
監聽store
的變化,如下:
store.subscribe(() => { console.log(store.getState()); })
在React
項目中,會搭配react-redux
進行使用
完整代碼如下:
const redux = require('redux'); const initialState = { counter: 0 } // 創建reducer const reducer = (state = initialState, action) => { switch (action.type) { case "INCREMENT": return {...state, counter: state.counter + 1}; case "DECREMENT": return {...state, counter: state.counter - 1}; case "ADD_NUMBER": return {...state, counter: state.counter + action.number} default: return state; } } // 根據reducer創建store const store = redux.createStore(reducer); store.subscribe(() => { console.log(store.getState()); }) // 修改store中的state store.dispatch({ type: "INCREMENT" }) // console.log(store.getState()); store.dispatch({ type: "DECREMENT" }) // console.log(store.getState()); store.dispatch({ type: "ADD_NUMBER", number: 5 }) // console.log(store.getState());
小結
- createStore可以幫助創建 store
- store.dispatch 幫助派發 action , action 會傳遞給 store
- store.getState 這個方法可以幫助獲取 store 里邊所有的數據內容
- store.subscrible 方法訂閱 store 的改變,只要 store 發生改變, store.subscrible 這個函數接收的這個回調函數就會被執行
原文鏈接:https://juejin.cn/post/7142037320206647327
相關推薦
- 2022-11-18 如何使用Python生成Hilbert矩陣_python
- 2022-08-11 python?scatter繪制散點圖_python
- 2022-02-13 上傳文件出現 413 Request Entity Too Large
- 2022-03-15 線性表的順序存儲結構靜態分配C語言實現
- 2021-12-07 C語言SetConsoleTextAttribute函數使用方法_C 語言
- 2022-07-02 C++分析構造函數與析造函數的特點梳理_C 語言
- 2023-02-09 Rust?所有權機制原理深入剖析_Rust語言
- 2022-08-21 python數字圖像處理之基本形態學濾波_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支