摘要:再次將子返回的單個進行合并成一個新的完整的。此時發(fā)生了變化。如果不相同則調(diào)用觸發(fā)組件的更新,傳入組件,觸發(fā)組件的更新,此時組件獲得新的,的一次流程結(jié)束。
react-redux提供了connect和provider兩個好方式,provider將組件和redux關(guān)聯(lián)起來,將store傳給組件,組件通過dispatch發(fā)出action,store根據(jù)action的type屬性,調(diào)用對應(yīng)的reducer并傳入state和這個action,reducer對state進行處理并返回一個新的state放入store,connect監(jiān)聽store發(fā)生變化,調(diào)用setState更新組件,此時組件的props也就跟著發(fā)生變化
connect,Provider,mapStateToProps,mapDispatchToProps,是react-redux提供的,redux本身和react沒有關(guān)系,它只是數(shù)據(jù)處理中心,是react-redux讓它們聯(lián)系在一起。
redux由store,reducer,action組成
dispatch:用于action的分發(fā),在creactStore中對dispatch進行改造,比如當(dāng)action傳入dispatch中會立即觸發(fā)reducer,有時我們不希望立即觸發(fā),而是等待異步操作結(jié)束后觸發(fā),這時不是只能傳入一個對象,而是能傳入一個函數(shù),在函數(shù)里我們dispatch一個action對象,實現(xiàn)了異步
subscribe:監(jiān)聽state的變化,這個函數(shù)調(diào)用dispatch時會注冊一個listener監(jiān)聽state變化當(dāng)我們需要知道state是否變化時可以調(diào)用,它返回一個函數(shù),調(diào)用這個返回的函數(shù)可以注銷監(jiān)聽,let unsubscribe=store.subscribe(()=>{console.log("state發(fā)生了變化")})
getState: 兩個需要用到的地方: 1.獲取store中的state,用action觸發(fā)reducer改變了state時,并將數(shù)據(jù)傳給reducer這個過程是自動執(zhí)行的 2.利用subscribe監(jiān)聽到state發(fā)生變化后調(diào)用它來獲取新的state數(shù)據(jù)
replaceReducer: 替換reducer,改變state修改的邏輯
store通過createStore()方法創(chuàng)建,接受三個參數(shù),經(jīng)過combineReducers合并的reducer和state初始狀態(tài)以及改變dispatch的中間件,后兩個參數(shù)不是必須的,store的主要作用是將action和reducer聯(lián)系起來并改變state,
actionaction是一個對象,其中type屬性是必須的,同時可以傳入一些數(shù)據(jù),action可以用actionCreator進行創(chuàng)造,dispatch就是把action對象發(fā)送出去reducer
reducer是一個函數(shù),它接受一個state和一個action,根據(jù)action的type返回一個新的state根據(jù)業(yè)務(wù)邏輯可以分為多個reducer,然后通過combineReducers將它們合并,state中有很多對象,每個state對象對應(yīng)一個reducer, eg: const reducer =combineReducers( { a:doSomethingWithA, b:processB, c:c } )
combineReducers:
其實它也是一個reducer,它接受整個state和一個action,然后將整個state拆分發(fā)送給對應(yīng)的reducer進行處理,所有的reducer會收到相同的action,不過他們會根據(jù)action的type進行判斷,有這個就進行處理然后返回新的state,沒有就返回默認值,然后分散的state又會整合在一起返回一個新的state,connect
connect(mapStateToProps,mapDispatchToProps,mergeProps,options)是一個函數(shù),它接受 四個參數(shù)并且再返回一個函數(shù),wrapWithConnect,wrapWithConnect接受一個組件作為參數(shù),它的內(nèi)部定義一個新組件,并將傳入的組件作為Connect的子組件然后return回去。
完整寫法: connect(mapStateToProps,mapDispatchToProps,mergeProps,options)(component)mapStateToProps(state,[ownProps])
1.mapStateToProps接受兩個參數(shù),store的state和自定義的props, 2.并返回一個新的對象,這個對象會作為props的一部分傳入ui組件, 3.我們可以根據(jù)組件所需要的數(shù)據(jù)自定義返回一個對象,ownProps的變化也會觸發(fā)mapStateProps function mapStateToProps(state){ return {todos:state.todos}; }mapDispatchToProps(dispatch,[ownProps])
1.mapDispatchToProps如果是對象,那么會和store綁定作為props的一部分傳入ui組件 2.如果是個函數(shù),它接受兩個參數(shù),bindActionCreators會將action和dispatch綁定并返回一個對象,這個對象會和ownProps一起作為props的一部分傳入ui組件, 3.所以不論mapDispatchToProps是對象還是函數(shù),它最終都會返回一個對象,如果是函數(shù),這個對象的key值是可以自定義的。 4.mapDispatchToProps返回的對象屬性其實就是一個個actionCeator,因為已經(jīng)和dispatch綁定,所以當(dāng)調(diào)用actionCreator時會立即發(fā)送action,而不是手動dispatch, 5.ownProps的變化也會觸發(fā)mapDispatchToPropsmergeProps(tateProps,dispatchProps,ownProps)
將 mapStateToProps()和mapDispatchToProps()返回的對象和組件自身的props合并成新的props并傳入組件,默認返回stateProps和dispatchProps的結(jié)果之和options:
pure=true表示Connect容器組件將在shouldComponentUpdate中對store的state和ownProps進行淺對比,判斷是否發(fā)生變化,優(yōu)化性能,為false則不對比。完整的React--Redux--React流程
一.Provider組件接受redux的store作為props,然后通過context往下傳
二.connect函數(shù)在初始化的時候會將mapDispatchToProps對象綁定到store,
如果mapDispatchToProps是函數(shù)則在Connect組件獲得store之后,
根據(jù)傳入的store.dispatch和action通過bindActionCreators進行綁定,再將返回的對象綁定到store,connect函數(shù)會返回一個wrapWithConnect函數(shù),
同時wrapWithConnect會被調(diào)用且傳入一個ui組件,wrapWithConnect內(nèi)部定義了一個Connect組件,傳入的ui組件是Connect的子組件,
然后Connect組件會通過context獲得store,并通過store.getState獲得完整的state對象,將state傳入mapStateToProps返回stateProps對象,
然后Connect組件會通過context獲得store,并通過store.getState獲得完整的state對象,將state傳入mapStateToProps返回stateProps對象、mapDispatchToProps對象或mapDispatchToProps函數(shù)會返回一個dispatchProps對象,stateProps、dispatchProps以及Connect組件的props
三.
此時ui組件就可以在props中找到actionCreator,
當(dāng)我們調(diào)用actionCreator時會自動調(diào)用dispatch,
在dispatch中會調(diào)用getState獲取整個state,同時注冊一個listener監(jiān)聽state的變化,
store將獲得的state和action傳給combineReducers,
combineReducers會將state依據(jù)state的key值分別傳給子reducer,并將action傳給全部子reducer,
reducer會被依次執(zhí)行進行action.type的判斷,如果有則返回一個新的state,如果沒有則返回默認。
combineReducers再次將子reducer返回的單個state進行合并成一個新的完整的state。此時state發(fā)生了變化。
dispatch在state返回新的值之后會調(diào)用所有注冊的listener函數(shù)其中包括handleChange函數(shù),
handleChange函數(shù)內(nèi)部首先調(diào)用getState獲取新的state值并對新舊兩個state進行淺對比,如果相同直接return,
如果不同則調(diào)用mapStateToProps獲取stateProps并將新舊兩個stateProps進行淺對比,如果相同,直接return結(jié)束,不進行后續(xù)操作。
如果不相同則調(diào)用this.setState()觸發(fā)Connect組件的更新,傳入ui組件,觸發(fā)ui組件的更新,此時ui組件獲得新的props,
react --> redux --> react 的一次流程結(jié)束。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/102199.html
摘要:與大多數(shù)全局對象不同,沒有構(gòu)造函數(shù)。為什么要設(shè)計更加有用的返回值早期寫法寫法函數(shù)式操作早期寫法寫法可變參數(shù)形式的構(gòu)造函數(shù)一般寫法寫法當(dāng)然還有很多,大家可以自行到上查看什么是代理設(shè)計模式代理模式,為其他對象提供一種代理以控制對這個對象的訪問。 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 19 篇。 如果你錯過了前面的章節(jié),可以在這里找到它們: 想閱讀更多優(yōu)質(zhì)文章請...
摘要:為了方便大家共同學(xué)習(xí),整理了之前博客系列的文章,目前已整理是如何工作這個系列,可以請猛戳博客查看。以下列出該系列目錄,歡迎點個星星,我將更友動力整理理優(yōu)質(zhì)的文章,一起學(xué)習(xí)。 為了方便大家共同學(xué)習(xí),整理了之前博客系列的文章,目前已整理 JavaScript 是如何工作這個系列,可以請猛戳GitHub博客查看。 以下列出該系列目錄,歡迎點個星星,我將更友動力整理理優(yōu)質(zhì)的文章,一起學(xué)習(xí)。 J...
摘要:在他的重學(xué)前端課程中提到到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系中的重要崗位之一。大部分前端工程師的知識,其實都是來自于實踐和工作中零散的學(xué)習(xí)。一基礎(chǔ)前端工程師吃飯的家伙,深度廣度一樣都不能差。 開篇 前端開發(fā)是一個非常特殊的行業(yè),它的歷史實際上不是很長,但是知識之繁雜,技術(shù)迭代速度之快是其他技術(shù)所不能比擬的。 winter在他的《重學(xué)前端》課程中提到: 到現(xiàn)在為止,前端工程師已經(jīng)成為研...
摘要:在他的重學(xué)前端課程中提到到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系中的重要崗位之一。大部分前端工程師的知識,其實都是來自于實踐和工作中零散的學(xué)習(xí)。一基礎(chǔ)前端工程師吃飯的家伙,深度廣度一樣都不能差。開篇 前端開發(fā)是一個非常特殊的行業(yè),它的歷史實際上不是很長,但是知識之繁雜,技術(shù)迭代速度之快是其他技術(shù)所不能比擬的。 winter在他的《重學(xué)前端》課程中提到: 到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系...
摘要:是流行的框架之一,在年及以后將會更加流行。于年首次發(fā)布,多年來廣受歡迎。下面是另一個名為的高階函數(shù)示例,該函數(shù)接受另外兩個函數(shù),分別是和。將所有較小的函數(shù)組合成更大的函數(shù),最終,得到一個應(yīng)用程序,這稱為組合。 React是流行的javascript框架之一,在2019年及以后將會更加流行。React于2013年首次發(fā)布,多年來廣受歡迎。它是一個聲明性的、基于組件的、用于構(gòu)建用戶界面的高...
閱讀 3026·2021-11-24 09:39
閱讀 2255·2021-10-08 10:05
閱讀 2749·2021-09-24 13:52
閱讀 1569·2021-09-22 15:07
閱讀 589·2019-08-30 15:55
閱讀 1808·2019-08-30 15:53
閱讀 687·2019-08-30 15:44
閱讀 3116·2019-08-30 11:20