一、Flux
Redux是Flux思想的另一種實現(xiàn)方式,F(xiàn)lux一族框架(包括Redux)貫徹的最重要的觀點是單向數(shù)據(jù)流;
創(chuàng)新互聯(lián)公司成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務公司,擁有項目做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元昌寧做網(wǎng)站,已為上家服務,為昌寧各地企業(yè)和個人服務,聯(lián)系電話:18982081108
1.MVC框架的缺陷
MVC是業(yè)界廣泛接受的一種前端應用框架類型,這種框架把應用分為3個部分:
但是,在實際框架實現(xiàn)中,總是可以允許View和Model直接通信,因此會變得非?;靵y!
2.Flux
2.1 Flux包含4個部分:
2.2 Flux的優(yōu)勢與不足
(1)優(yōu)勢:單向數(shù)據(jù)流。在Flux的理念里,如果想改變界面,就必須改變store中的狀態(tài),如果要改變store中的狀態(tài),必須派發(fā)一個action對象。
(2)不足:store之間依賴關(guān)系(如果兩個store之間有依賴關(guān)系,就必須用上Dispatcher的waitFor函數(shù));難以進行服務器端渲染;store混雜了邏輯和狀態(tài)。
二、Redux
1.Redux的基本原則:
1.1 唯一數(shù)據(jù)源:
指應用的狀態(tài)數(shù)據(jù)應該只存儲在唯一的一個store上,所有組件的數(shù)據(jù)源就是這個store上的狀態(tài)。store是一個樹形的對象,每個組件往往只是用樹形對象上的一部分數(shù)據(jù)。要驅(qū)動用戶界面渲染,就要改變應用的狀態(tài),但是改變狀態(tài)的方法不是去修改狀態(tài)上的值,而是創(chuàng)建一個新的狀態(tài)對象返回給Redux,由Redux完成新的狀態(tài)的組裝。
1.2 數(shù)據(jù)改變只能通過純函數(shù)完成:
這個純函數(shù)就是Reducer,在Redux中,每個reducer的函數(shù)簽名如下:
reducer(state,action)
第一個參數(shù)state是當前的狀態(tài),第二個參數(shù)action是接收到的action對象,而reducer要做的事情,就是根據(jù)state和action的值產(chǎn)生一個新的對象返回。reducer只負責計算狀態(tài),不負責存儲狀態(tài)。因為reducer是純函數(shù),函數(shù)的返回結(jié)果必須由參數(shù)state和action決定,而且不產(chǎn)生任何副作用,也不能修改參數(shù)state和action對象。
容器組件和傻瓜組件
(1)容器組件:和Redux Store打交道,讀取Store的狀態(tài),用于初始化組件的狀態(tài),同時還要監(jiān)聽Store的狀態(tài)改變;當Store狀態(tài)發(fā)生變化時,需要更新組件狀態(tài),從而驅(qū)動組件重新渲染;當需要更新Store狀態(tài)時,就要派發(fā)action對象。
(2)傻瓜組件:根據(jù)當前props和state,渲染出用戶界面。這是一個純函數(shù),根據(jù)props產(chǎn)生結(jié)果。
3.1 connect:
export default connect(mapStateToProps,mapDispatchToProps)(Counter)
connect是React-Redux提供的一個方法,它接收兩個參數(shù)mapStateToProps和mapDispatch-ToProps,執(zhí)行結(jié)果依然是一個函數(shù),所以才在后面又加一個圓括號,把connect函數(shù)執(zhí)行的結(jié)果立刻執(zhí)行,這一次參數(shù)是Counter這個傻瓜組件。這里有兩個函數(shù)執(zhí)行,第一次是connect函數(shù)的執(zhí)行,第二次是把connect函數(shù)返回的函數(shù)再次執(zhí)行,最后產(chǎn)生的就是容器組件。
connect函數(shù)作為容器組件,做的事情無外乎兩件事:
(1)把store上的狀態(tài)轉(zhuǎn)換為內(nèi)層傻瓜組件的prop;
(2)把內(nèi)層傻瓜組件中的用戶動作轉(zhuǎn)化為派送給Store的動作,即把內(nèi)層傻瓜組件暴露出來的函數(shù)類型的prop關(guān)聯(lián)上dispatch函數(shù)的調(diào)用,每個prop代表的回調(diào)函數(shù)的主要區(qū)別就是dispatch函數(shù)的參數(shù)不同,這就是mapDispatchToProps函數(shù)做的事情。
3.2 Provider
React-Redux幾乎就是provider。
React-Redux要求store是包含以下3個函數(shù)的object:
另外,React-Redux定義了provider的componentWillReceiveProps函數(shù),React-Redux在componentWillReceiveProps函數(shù)中會檢查這一次渲染時代表store的prop和上次的是否一樣。如果不一樣,就會告警,這樣做是為了避免多次渲染用了不同的Redux store,每個Redux應用只能有一個Redux store,在整個Redux的生命周期中都應該保持Store的唯一性。