React?Redux管理庫(kù)示例詳解
前言:
什么是redux?redux和vuex一樣,都被統(tǒng)稱為狀態(tài)管理庫(kù),是核心數(shù)據(jù)存貯與分發(fā)、監(jiān)聽數(shù)據(jù)改變的核心所在。
可以簡(jiǎn)單說下redux和vuex的區(qū)別:
相同點(diǎn)
- state 共享數(shù)據(jù)
- 流程一致:定義全局state,觸發(fā),修改state
- 原理相似,通過全局注入store。
不同點(diǎn)
- vuex定義了state、getter、mutation、action四個(gè)對(duì)象;redux定義了state、reducer、action。
- vuex觸發(fā)方式有兩種commit同步和dispatch異步;redux同步和異步都使用dispatch
- vuex中state統(tǒng)一存放,方便理解;reduxstate依賴所有reducer的初始值
- vuex有g(shù)etter,目的是快捷得到state;redux沒有這層,react-redux mapStateToProps參數(shù)做了這個(gè)工作。
- vuex中mutation只是單純賦值(很淺的一層);redux中reducer只是單純?cè)O(shè)置新state(很淺的一層)。他倆作用類似,但書寫方式不同
- vuex中action有較為復(fù)雜的異步ajax請(qǐng)求;redux中action中可簡(jiǎn)單可復(fù)雜,簡(jiǎn)單就直接發(fā)送數(shù)據(jù)對(duì)象({type:xxx, your-data}),復(fù)雜需要調(diào)用異步ajax(依賴redux-thunk插件)。
- Redux 使用的是不可變數(shù)據(jù),而Vuex的數(shù)據(jù)是可變的。Redux每次都是用新的state替換舊的state,而Vuex是直接修改
- Redux 在檢測(cè)數(shù)據(jù)變化的時(shí)候,是通過 diff 的方式比較差異的,而Vuex其實(shí)和Vue的原理一樣,是通過 getter/setter來比較的
vuex 數(shù)據(jù)交互 思維圖:
redux數(shù)據(jù)交互思維圖:
接下來詳細(xì)說說redux:
配置總共分為三部分
一.actions:負(fù)責(zé)收集并向reduces提交state的變化,自身可分為兩部分actions類型和actions函數(shù)創(chuàng)建
(1)actions —type 常量類型,主負(fù)責(zé)向reduces
(2)actions —fn 函數(shù)創(chuàng)建 組件中觸發(fā)提交函數(shù)
二.reducers 更新state狀態(tài),可根據(jù)state數(shù)據(jù)類型拆分成單個(gè)reducer,把reducers細(xì)化,后面通過集合構(gòu)建出最終的大state
三.全局只需要有一個(gè)store,不需要像網(wǎng)站中資料介紹的在每一個(gè)組件一樣去初始化一個(gè)store,一個(gè)項(xiàng)目集合在這初始化一次就可以;
store.dispatch() // 提交
store.sbuscribe() // 組件中監(jiān)聽reducer的變化,即state的變化回調(diào)
store.getState() // 獲取state的值,通常和store.sbuscribe() 結(jié)合使用
源碼部分:
目錄配置
actions:
index.js
/* actions 類型 * TYPE_GET_LIST 這是一個(gè)關(guān)于點(diǎn)擊類型獲取列表的定義 */ import {TYPE_GET_LIST,IS_LOGIN} from "./type" /* actions 創(chuàng)建函數(shù) *actions 創(chuàng)建函數(shù)和actions是兩個(gè)概念 */ export function getType(opt){ return {type: TYPE_GET_LIST, opt} } export function isLogin(flag){ return {type: IS_LOGIN, flag} }
type.js
/* actions 類型type */ export const TYPE_GET_LIST = "TYPE_GET_LIST"; export const IS_LOGIN = "IS_LOGIN"; /* 其他常量 */ export const otherType = { TO_DO: "TO_DO" }
reducers
index.js
/** * redux 管理入口 */ import {combineReducers} from "redux" import userBasketReducer from './userReducer'; import {TYPE_GET_LIST, IS_LOGIN} from "../actions/type" /* 不同數(shù)據(jù)結(jié)構(gòu)的單個(gè)state */ function typeInfo(state={}, action) { console.log(state, action, "這個(gè)是tyInfo的信息"); switch (action.type) { case TYPE_GET_LIST: return Object.assign({}, state, {typeInfo: action.opt}); default: return state; } }; function isLogin(state=false, action) { console.log(state, action); switch (action.type) { case IS_LOGIN: return Object.assign({}, state, {isLogin: action.flag}); case ....; // default: return state; } }; // 匯總成一個(gè)大的state,供全局使用 const reducers = combineReducers({ userBasket: userBasketReducer, typeInfo, isLogin }); export default reducers;
store
import { createStore } from 'redux' import reducers from '../reducers' const store = createStore(reducers) export default store;
至此,一個(gè)完整的redux搭建成功,需要拓展什么樣的業(yè)務(wù)只需要根據(jù)自己的業(yè)務(wù)定義常量函數(shù)名和創(chuàng)建函數(shù)就可以了,然后通過在組件中dispatch分發(fā)的方式提交,就能直接掛載到state對(duì)象上供組件間相互使用。
接下來看看如何在組件中使用:
如何提交:
在組件中引入store庫(kù),和函數(shù)創(chuàng)建的方法
import {isLogin} from "../../redux/actions" import store from "../../redux/store"; // 提交 store.dispatch(isLogin({flag: true})) // 登錄成功賦值更新已登錄邏輯
如何動(dòng)態(tài)獲取監(jiān)聽改變的值監(jiān)聽,全局監(jiān)聽state的值
import store from "../../redux/store"; store.subscribe(() => { const { selectedFolderId } = store.getState().selectedFolderId; this.setState({ checkFolderId: selectedFolderId }); });
Redux 將組件區(qū)分為 容器組件 和 UI 組件
- 前者會(huì)處理邏輯
- 后者只負(fù)責(zé)顯示和交互,內(nèi)部不處理邏輯,狀態(tài)完全由外部掌控
Provider
看我上邊那個(gè)代碼的頂層組件4個(gè)字。對(duì),你沒有猜錯(cuò)。這個(gè)頂級(jí)組件就是Provider,一般我們都將頂層組件包裹在Provider組件之中,這樣的話,所有組件就都可以在react-redux的控制之下了,但是store必須作為參數(shù)放到Provider組件中去
<Provider store = {store}> <App /> <Provider>
這個(gè)組件的目的是讓所有組件都能夠訪問到Redux中的數(shù)據(jù)。
connect 的使用:
connect(mapStateToProps, mapDispatchToProps)(MyComponent)
mapStateToProps 把Redux中的數(shù)據(jù)映射到React中的props中去。
如:
const mapStateToProps = (state) => { return { // prop : state.xxx | 意思是將state中的某個(gè)數(shù)據(jù)映射到props中 foo: state.bar } }
組件中:
class Foo extends Component { constructor(props){ super(props); } render(){ return( // 這樣子渲染的其實(shí)就是state.bar的數(shù)據(jù)了 <div>this.props.foo</div> ) } } Foo = connect()(Foo); export default Foo;
mapDispatchToProps 把各種dispatch也變成了props讓你可以直接使用
const mapDispatchToProps = (dispatch) => { // 默認(rèn)傳遞參數(shù)就是dispatch return { onClick: () => { dispatch({ type: 'increatment' }); } }; }
class Foo extends Component { constructor(props){ super(props); } render(){ return( <button onClick = {this.props.onClick}>點(diǎn)擊increase</button> ) } } Foo = connect()(Foo); export default Foo;
可以直接通過this.props.onClick,來調(diào)用dispatch,這樣子就不需要在代碼中來進(jìn)行store.dispatch了
如果哪兒不懂可以留言我會(huì)快速回復(fù),拆分的比較細(xì),有些地方可能沒必要拆分,完全是為了自己練習(xí)和做個(gè)筆記,也方便大家閱讀
到此這篇關(guān)于React Redux管理庫(kù)示例詳解的文章就介紹到這了,更多相關(guān)React Redux內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何在React?Native開發(fā)中防止滑動(dòng)過程中的誤觸
在使用React?Native開發(fā)的時(shí),當(dāng)我們快速滑動(dòng)應(yīng)用的時(shí)候,可能會(huì)出現(xiàn)誤觸,導(dǎo)致我們會(huì)點(diǎn)擊到頁(yè)面中的某一些點(diǎn)擊事件,誤觸導(dǎo)致頁(yè)面元素響應(yīng)從而進(jìn)行其他操作,表現(xiàn)出非常不好的用戶體驗(yàn)。2023-05-05React中常見的動(dòng)畫實(shí)現(xiàn)的幾種方式
本篇文章主要介紹了React中常見的動(dòng)畫實(shí)現(xiàn)的幾種方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01React-router?v6在Class組件和非組件代碼中的正確使用
這篇文章主要介紹了React-router?v6在Class組件和非組件代碼中的正確使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03詳解React Angular Vue三大前端技術(shù)
當(dāng)前世界中,技術(shù)發(fā)展非常迅速并且變化迅速,開發(fā)者需要更多的開發(fā)工具來解決不同的問題。本文就對(duì)于當(dāng)下主流的前端開發(fā)技術(shù)React、Vue、Angular這三個(gè)框架做個(gè)相對(duì)詳盡的探究,目的是為了解開這些前端技術(shù)的面紗,看看各自的廬山真面目。2021-05-05react的滑動(dòng)圖片驗(yàn)證碼組件的示例代碼
這篇文章主要介紹了react的滑動(dòng)圖片驗(yàn)證碼組件的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02React?SSR架構(gòu)Stream?Rendering與Suspense?for?Data?Fetching
這篇文章主要為大家介紹了React?SSR架構(gòu)Stream?Rendering與Suspense?for?Data?Fetching解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03react項(xiàng)目如何運(yùn)行在微信公眾號(hào)
這篇文章主要介紹了react項(xiàng)目如何運(yùn)行在微信公眾號(hào),幫助大家更好的理解和學(xué)習(xí)使用react,感興趣的朋友可以了解下2021-04-04淺談react?16.8版本新特性以及對(duì)react開發(fā)的影響
本文主要介紹了react?16.8版本新特性以及對(duì)react開發(fā)的影響,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03