淺談從React到Redux

關(guān)于redux的發(fā)展惩琉,其實(shí)我也不太清除,似乎使用React的都會(huì)過(guò)度到Redux诵次,大概算是React的全家桶之一吧秒裕,這里在了解Redux之前袱蚓,不妨先了解下React設(shè)計(jì)應(yīng)用的一些特性:

React 算是V層框架,它的組件化開(kāi)發(fā)和單向數(shù)據(jù)流構(gòu)特性構(gòu)成了它設(shè)計(jì)的核心思想几蜻,組件化開(kāi)發(fā)喇潘,將一個(gè)頁(yè)面劃分成多個(gè)組件,獨(dú)立開(kāi)發(fā)每塊功能獨(dú)立的組件 梭稚,使得頁(yè)面靈活可插拔可復(fù)用颖低,然而組件的獨(dú)立劃分也必然會(huì)帶來(lái)組件間的數(shù)據(jù)交互問(wèn)題,因此對(duì)應(yīng)提出了單向數(shù)據(jù)流的特性哨毁,要求設(shè)計(jì)好state數(shù)據(jù)結(jié)構(gòu)枫甲,并放置在合理的位置,使得數(shù)據(jù)最大化的單向流動(dòng)扼褪,然而盡管如此想幻,在實(shí)際開(kāi)發(fā)中,我們?nèi)员苊獠涣耸褂梅聪驍?shù)據(jù)流话浇,詳見(jiàn)thinking React


一般來(lái)說(shuō)脏毯,React的這兩個(gè)特性,基本能合理設(shè)計(jì)并開(kāi)發(fā)出許多結(jié)構(gòu)不錯(cuò)的應(yīng)用幔崖,但隨著應(yīng)用的規(guī)模龐大食店,把state作為數(shù)據(jù)層,就需要多個(gè)數(shù)據(jù)層(state)對(duì)應(yīng)多個(gè)組件(view) 赏寇,那么假設(shè)state和view交互構(gòu)成了如下數(shù)據(jù)流:

隨著應(yīng)用的龐大吉嫩,一些反向數(shù)據(jù)流的存在就會(huì)造成錯(cuò)綜復(fù)雜,不可預(yù)測(cè)的問(wèn)題嗅定。

然而在Redux認(rèn)為自娩,用戶(hù)在view層對(duì)數(shù)據(jù)的操作只能發(fā)起action,也就是將上面的數(shù)據(jù)流結(jié)構(gòu)轉(zhuǎn)換為如下結(jié)構(gòu):


從上圖可以看出渠退,引入了actions忙迁,從而將錯(cuò)綜復(fù)雜的數(shù)據(jù)流變成了單向數(shù)據(jù)流(這里暫時(shí)不管圓圈里面是什么),進(jìn)而強(qiáng)化了React的單向數(shù)據(jù)流的核心思想碎乃。

因此姊扔,引入了redux使得數(shù)據(jù)的變動(dòng)變得可追溯,結(jié)構(gòu)更清晰梅誓。


有了上面的過(guò)度后恰梢,接下來(lái)就該討論,redux是如何做到這種數(shù)據(jù)流動(dòng)的梗掰,關(guān)于redux的設(shè)計(jì)核心删豺,這里先設(shè)計(jì)這幅循環(huán)圖來(lái)直接解釋?zhuān)?/p>


上圖是一個(gè)比較好解釋redux數(shù)據(jù)流的循環(huán)圖,這幅圖里有五個(gè)部分五個(gè)箭頭愧怜,這里就先簡(jiǎn)單介紹這五大塊呀页,再對(duì)每塊具體操作詳細(xì)分析。

1. 有defines箭頭可以看出拥坛,只有State的變化才會(huì)引起UI的變化蓬蝶。

2. 由triggers箭頭可以看出,UI 只能統(tǒng)一觸發(fā) Actions操作猜惋。

3. 由sent to可以看出丸氛,Actions需要分發(fā)(dispatch)到Reducers上去決定如何執(zhí)行。

4. 由Updates可以看出著摔,Reducers可以更新Store中的狀態(tài)缓窜,然而Store中的狀態(tài)是什么呢?

5. 由contains可以看出Store可以認(rèn)為是State的集合,也就是說(shuō)禾锤,Reducers決定著State如何改變私股,Store用于統(tǒng)一化管理State。


那么Redux這種循環(huán)流向的特性恩掷,也就決定著在設(shè)計(jì)應(yīng)用流程上應(yīng)該遵照的統(tǒng)一化步驟:

1. 首先是actions倡鲸,actions簡(jiǎn)單來(lái)說(shuō)就是用戶(hù)操作UI界面能發(fā)起的動(dòng)作,它其就是用json對(duì)象定義的黄娘,其中必須要有一個(gè)type字段峭状,指明是哪種類(lèi)型的操作,type字段的值一般是字符串逼争,使用字符串常量會(huì)更好一些优床,同時(shí)可以傳遞該操作需要傳遞的參數(shù)。

2. 其次需要設(shè)計(jì)的是Reducers誓焦, Reducers其實(shí)是用來(lái)決定不同類(lèi)型(type)的actions需要怎么修改state胆敞,(這也就意味著在此之前最好先考慮一下state結(jié)構(gòu)的設(shè)計(jì)),Reducers必須是一個(gè)純函數(shù)罩阵,它接受舊的state和actions竿秆,返回的是新的state,在redux-react中稿壁,可以根據(jù)類(lèi)型不同設(shè)計(jì)不同的reducers幽钢,這也就對(duì)應(yīng)著state結(jié)構(gòu)中不同的字段了,最后將他們combine傅是。

3. 對(duì)于combine的reducers匪燕,需要將其注冊(cè)到統(tǒng)一且唯一的store中去才能達(dá)到統(tǒng)一化管理的效果,然而要想在react中引入store并在整個(gè)組件中使用喧笔,就需要react-redux提供的Providers組件了帽驯,用它來(lái)讓React組件中共享store。

4. 關(guān)于UI組件书闸,這里放在最后尼变,其實(shí)也可以不這樣,先設(shè)計(jì)UI組件也是可以的浆劲,只是這里要討論state將要如何決定UI組件的改變嫌术,而且UI組件又如何發(fā)起action,這兩步是打通整個(gè)循環(huán)的最基礎(chǔ)也是最重要的一步牌借,為了區(qū)分UI組件和交互相關(guān)度气,在Redux中提出了兩種不同類(lèi)型的組件,Components組件和Containers組件膨报,兩種組件可能對(duì)應(yīng)于同一頁(yè)面同一部分磷籍,但兩者負(fù)責(zé)的任務(wù)不同适荣,簡(jiǎn)單來(lái)說(shuō)Components組件只負(fù)責(zé)展示,傳遞什么參數(shù)就渲染什么內(nèi)容院领,而Container組件負(fù)責(zé)數(shù)據(jù)流入流出弛矛,決定組件需要什么數(shù)據(jù)和能觸發(fā)什么actions,從某種模型上來(lái)說(shuō)栅盲,Containers或許就是Components外層的一個(gè)包裝汪诉,因此在某些特殊的情況中废恋,可以將Components合并到Containers中去谈秫。

這里也展示了容器組件和展示組件之間的區(qū)別



因此對(duì)于Components組件來(lái)說(shuō),所有的數(shù)據(jù)都是通過(guò)組件的屬性props來(lái)決定的鱼鼓。

對(duì)于containers組件來(lái)說(shuō)拟烫,就需要決定哪些state的流入和哪些actions的流出或者說(shuō)是分發(fā)(dispatch),因此也就有了兩個(gè)函數(shù)? mapStateToProps和mapDispatchToProps迄本,mapStateToProps提供兩個(gè)參數(shù)硕淑,一個(gè)是整個(gè)state數(shù)據(jù),另一個(gè)則是原始屬性值Prop嘉赎,它的返回值即是需要映射到組件數(shù)據(jù)(用于渲染頁(yè)面)的state數(shù)據(jù)置媳。

mapDispatchToProps提供一個(gè)dispatch函數(shù)參數(shù),它其實(shí)是store的函數(shù)公条,用于分發(fā)action到reducers中去拇囊。mapDispatchToProp返回值就是一系列的方法,用于映射用戶(hù)對(duì)UI的哪些操作對(duì)應(yīng)需要分發(fā)哪些actions靶橱。

最后需要做的是將容器組件和展示組件綁定起來(lái)寥袭,這時(shí)候需要用到的方法就是react-redux提供的connect方法,connect方法是一個(gè)高階函數(shù)关霸,第一階函數(shù)需要兩個(gè)函數(shù)參數(shù)传黄,其實(shí)就是上面所說(shuō)的那兩個(gè)函數(shù),這兩個(gè)參數(shù)是有順序的队寇,但又不是必須的膘掰,如果不需要傳遞null即可,第二階函數(shù)則需要傳遞這兩個(gè)函數(shù)綁定的組件佳遣,就像上圖那樣把組件裝進(jìn)容器里合并在一起识埋,這樣我們最中需要渲染展示的頁(yè)面是connect后的組件,而不是之前所說(shuō)的展示組件了苍日,因?yàn)閏onnect后的組件才會(huì)有數(shù)據(jù)流的傳遞惭聂,才能享受redux提供的數(shù)據(jù)狀態(tài)循環(huán)流動(dòng)的便利。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末相恃,一起剝皮案震驚了整個(gè)濱河市辜纲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖耕腾,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件见剩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡扫俺,警方通過(guò)查閱死者的電腦和手機(jī)苍苞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狼纬,“玉大人羹呵,你說(shuō)我怎么就攤上這事×屏穑” “怎么了冈欢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盈简。 經(jīng)常有香客問(wèn)我凑耻,道長(zhǎng),這世上最難降的妖魔是什么柠贤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任香浩,我火速辦了婚禮,結(jié)果婚禮上臼勉,老公的妹妹穿的比我還像新娘邻吭。我一直安慰自己,他們只是感情好坚俗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布镜盯。 她就那樣靜靜地躺著,像睡著了一般猖败。 火紅的嫁衣襯著肌膚如雪速缆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天恩闻,我揣著相機(jī)與錄音艺糜,去河邊找鬼。 笑死幢尚,一個(gè)胖子當(dāng)著我的面吹牛破停,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尉剩,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼真慢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了理茎?” 一聲冷哼從身側(cè)響起黑界,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤管嬉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后朗鸠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蚯撩,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年烛占,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胎挎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡忆家,死狀恐怖犹菇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弦赖,我是刑警寧澤项栏,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布浦辨,位于F島的核電站蹬竖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏流酬。R本人自食惡果不足惜币厕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芽腾。 院中可真熱鬧旦装,春花似錦、人聲如沸摊滔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)艰躺。三九已至呻袭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腺兴,已是汗流浹背左电。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留页响,地道東北人篓足。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像闰蚕,于是被迫代替她去往敵國(guó)和親栈拖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 為了學(xué)習(xí)相關(guān)的原理没陡,使用Empty Application模板建立工程涩哟;在開(kāi)始輸入正常學(xué)習(xí)的代碼之前烟瞧,要先:1、將...
    每日總結(jié)閱讀 439評(píng)論 0 1
  • 版本1 讓每個(gè)程序就做好一件事染簇。如果有新任務(wù)参滴,就重新開(kāi)始,不要往原程序中加入新功能而搞得復(fù)雜锻弓。 假定每個(gè)程序的輸出...
    饑人谷_晴天小雨多云閱讀 1,025評(píng)論 1 2
  • 今天早上被媽媽叫醒砾赔,快速洗完臉后,吃早餐青灼,雞蛋湯暴心,饅頭,腐乳杂拨,狼吞虎咽吃完以后专普,穿好衣服出門(mén)買(mǎi)菜,去媽媽熟悉的“菜...
    二苗_5c0f閱讀 223評(píng)論 0 1
  • 像我,我很喜歡看電影策橘。我主動(dòng)買(mǎi)票約他看電影炸渡,看的是他喜歡的類(lèi)型,不是我自己喜歡的丽已。好感恩蚌堵。這種愛(ài)從哪里來(lái)?從我所親...
    陳悅_55fd閱讀 267評(píng)論 0 0