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