redux工作原理講解及使用方法
1. redux 是什么?
React 只是 DOM 的一個(gè)抽象層,并不是 Web 應(yīng)用的完整解決方案。react只是一個(gè)輕量級(jí)的視圖層框架,如果要做大型應(yīng)用就要搭配視圖層框架redux一起使用。主要引用于多交互、多數(shù)據(jù)源的場(chǎng)景,并不是必須使用,但是必須要會(huì)。
2.redux的原理
redux的原理,首先用一張圖來(lái)說明,很容易理解
首先,用戶發(fā)出 Action。
store.dispatch(action);
然后,Store 自動(dòng)調(diào)用 Reducer,并且傳入兩個(gè)參數(shù):當(dāng)前 State 和收到的 Action。 Reducer 會(huì)返回新的 State 。
let nextState = todoApp(previousState, action);
State 一旦有變化,Store 就會(huì)調(diào)用監(jiān)聽函數(shù)。
// 設(shè)置監(jiān)聽函數(shù) store.subscribe(listener);
listener可以通過store.getState()得到當(dāng)前狀態(tài)。如果使用的是 React,這時(shí)可以觸發(fā)重新渲染 View。
function listerner() { let newState = store.getState(); component.setState(newState); }
3. 如何使用 redux?
(1).安裝redux,創(chuàng)建redux文件夾,建立store.js
該文件專門用于暴露一個(gè)store對(duì)象,整個(gè)應(yīng)用只有一個(gè)store對(duì)象
安裝redux:yarn add redux
/ npm install redux
//引入createStore,專門用于創(chuàng)建redux中最為核心的store對(duì)象 import {createStore,applyMiddleware} from 'redux' //引入為Count組件服務(wù)的reducer import countReducer from './count_reducer' //引入redux-thunk,用于支持異步action import thunk from 'redux-thunk' //暴露store //applyMiddleware 是中間位 中使用thunk export default createStore(countReducer,applyMiddleware(thunk))
(2).建立reducers.js
- 1.該文件是用于創(chuàng)建一個(gè)為Count組件服務(wù)的reducer,reducer的本質(zhì)就是一個(gè)函數(shù)
- 2.reducer函數(shù)會(huì)接到兩個(gè)參數(shù),分別為:之前的狀態(tài)(preState),動(dòng)作對(duì)象(action)
const initState = 0 //初始化狀態(tài) export default function countReducer(preState=initState,action){ // console.log(preState); //從action對(duì)象中獲取:type、data const {type,data} = action //根據(jù)type決定如何加工數(shù)據(jù) switch (type) { case 'increment': //如果是加 return preState + data case 'decrement': //若果是減 return preState - data default: return preState } }
(3).引入store.subscribe
主要用subscribe監(jiān)聽store中每次修改情況
// 公共 index.js import store from './redux/store' //subscribe當(dāng)store中數(shù)據(jù)發(fā)生變化就會(huì)更新數(shù)據(jù),寫在這里是讓全局擁有 store.subscribe(()=>{ ReactDOM.render(<App/>,document.getElementById('root')) })
(4). 引入react-redux
react-redux是redux作者封裝的一個(gè)庫(kù),是第三方模塊,對(duì)Redux進(jìn)一步簡(jiǎn)化,提供了一些額外的API(例如:Provider,connect等),使用它可以更好的組織和管理我們的代碼,在React中更方便的使用Redux。
下載 react-redux
創(chuàng)建count 文件
//引入Count的UI組件 import CountUI from '../../components/Count' //引入connect用于連接UI組件與redux import {connect} from 'react-redux' ------------------------------------------------------------- /* 1.mapStateToProps函數(shù)返回的是一個(gè)對(duì)象; 2.返回的對(duì)象中的key就作為傳遞給UI組件props的key,value就作為傳遞給UI組件props的value 3.mapStateToProps用于傳遞狀態(tài) */ function mapStateToProps(state){ return {count:state} } ----------------------------------------------------------------- /* 1.mapDispatchToProps函數(shù)返回的是一個(gè)對(duì)象; 2.返回的對(duì)象中的key就作為傳遞給UI組件props的key,value就作為傳遞給UI組件props的value 3.mapDispatchToProps用于傳遞操作狀態(tài)的方法 */ function mapDispatchToProps(dispatch){ return { jia:number => dispatch(createIncrementAction(number)), jian:number => dispatch(createDecrementAction(number)), jiaAsync:(number,time) => dispatch(createIncrementAsyncAction(number,time)), } } //使用connect()()創(chuàng)建并暴露一個(gè)Count的容器組件 export default connect(mapStateToProps,mapDispatchToProps)(CountUI) //改良 export default connect( state => ({count:state}), //mapDispatchToProps的一般寫法 /* dispatch => ({ jia:number => dispatch(createIncrementAction(number)), jian:number => dispatch(createDecrementAction(number)), jiaAsync:(number,time) => dispatch(createIncrementAsyncAction(number,time)), }) */ //mapDispatchToProps的簡(jiǎn)寫 { jia:createIncrementAction, jian:createDecrementAction, jiaAsync:createIncrementAsyncAction, } )(Count)
生成action對(duì)象,并分別暴露
/* 該文件專門為Count組件生成action對(duì)象 */ import {INCREMENT,DECREMENT} from '../constant' //同步action,就是指action的值為Object類型的一般對(duì)象 export const increment = data => ({type:INCREMENT,data}) export const decrement = data => ({type:DECREMENT,data}) //異步action,就是指action的值為函數(shù),異步action中一般都會(huì)調(diào)用同步action,異步action不是必須要用的。 export const incrementAsync = (data,time) => { return (dispatch)=>{ setTimeout(()=>{ dispatch(increment(data)) },time) } }
到此這篇關(guān)于redux工作原理講解及使用方法的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
react 組件實(shí)現(xiàn)無(wú)縫輪播示例詳解
這篇文章主要為大家介紹了react 組件實(shí)現(xiàn)無(wú)縫輪播示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Remix路由模塊輸出對(duì)象loader函數(shù)詳解
這篇文章主要為大家介紹了Remix路由模塊輸出對(duì)象loader函數(shù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2023-04-04React + webpack 環(huán)境配置的方法步驟
本篇文章主要介紹了React + webpack 環(huán)境配置的方法步驟,詳解的介紹了開發(fā)環(huán)境的配置搭建,有興趣的可以了解一下2017-09-09ReactNative實(shí)現(xiàn)弧形拖動(dòng)條的代碼案例
本文介紹了ReactNative實(shí)現(xiàn)弧形拖動(dòng)條,本組件使用到了react-native-svg和PanResponder,結(jié)合示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-02-02詳解React項(xiàng)目的服務(wù)端渲染改造(koa2+webpack3.11)
本篇文章主要介紹了詳解React項(xiàng)目的服務(wù)端渲染改造(koa2+webpack3.11),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-03-03使用react-virtualized實(shí)現(xiàn)圖片動(dòng)態(tài)高度長(zhǎng)列表的問題
一般我們?cè)趯憆eact項(xiàng)目中,同時(shí)渲染很多dom節(jié)點(diǎn),會(huì)造成頁(yè)面卡頓, 空白的情況。為了解決這個(gè)問題,今天小編給大家分享一篇教程關(guān)于react-virtualized實(shí)現(xiàn)圖片動(dòng)態(tài)高度長(zhǎng)列表的問題,感興趣的朋友跟隨小編一起看看吧2021-05-05