Redux是如何工作的 (一)

凡是用reactjs開(kāi)發(fā)的項(xiàng)目扒腕,但凡規(guī)模稍微大一些客年,都很可能要引入redux來(lái)管理組件狀態(tài)的變遷和組件彼此之間的通信投放,權(quán)威的解釋和說(shuō)明當(dāng)然是官方的這篇文章叮贩,但是几于,但是吃引,但是筹陵,這篇長(zhǎng)文處處透露著一種玄妙而不可言說(shuō)的味道,處處是一些principle镊尺,best practice朦佩,never,absolutely庐氮,you should……的字眼语稠,到處是強(qiáng)調(diào),加粗的段落旭愧,一些模糊的store颅筋,action,reducer之類(lèi)的抽象用詞输枯,我嘗試著寫(xiě)篇小文來(lái)記錄自己對(duì)Redux的學(xué)習(xí)理解過(guò)程议泵。

1. 從reactjs本身談起

正如官方文檔強(qiáng)調(diào)的,我們只做view層桃熄,是的先口,reactjs利用JSX把UI的開(kāi)發(fā)演進(jìn)到另一種模式,就個(gè)人觀點(diǎn)瞳收,我并不覺(jué)得其比其他基于模版的view技術(shù)究竟高到哪里去碉京,有人說(shuō)virtual dom技術(shù)比原來(lái)的直接操作dom來(lái)得效率高,拜托螟深,它只是節(jié)省了dom元素的尋找時(shí)間谐宙,react使得程序員從數(shù)據(jù)變化耦合ui變化的面條代碼中抽離出來(lái),每個(gè)組件保持了極高的內(nèi)聚性界弧,給使用者帶來(lái)了極大的方便凡蜻,使得在view層堆積木式的開(kāi)發(fā)成為可能,每個(gè)UI組件的state對(duì)于使用者是完全透明的垢箕,使用者只要為它設(shè)置好初始的props划栓,組件本身可以響應(yīng)各種事件來(lái)改變自身的狀態(tài),重新渲染外觀条获。如果每一個(gè)組件都不需要跟外界通信忠荞,都不需要跟別的組件聯(lián)動(dòng),那傳統(tǒng)的state,props便足以對(duì)付所有的開(kāi)發(fā)委煤。但是組件之間的通信堂油,這對(duì)一個(gè)稍微大型的SPA應(yīng)用來(lái)說(shuō),都是必須要有的功能素标。

2. 我們能從傳統(tǒng)的設(shè)計(jì)模式汲取什么

observer/observable称诗,Event Listener是我們最常用的手段來(lái)注冊(cè)萍悴,監(jiān)聽(tīng)头遭,響應(yīng)外界感興趣的變化,假設(shè)react組件A監(jiān)聽(tīng)了組件B的變化癣诱,當(dāng)組件B變化時(shí)它調(diào)用A注冊(cè)的回調(diào)函數(shù)计维,同時(shí)把自己的state傳遞給B,注意撕予,這里已經(jīng)完全破壞了組件的邊界鲫惶,當(dāng)A拿到B的state時(shí),它可以做任何修改实抡,所以實(shí)現(xiàn)時(shí)欠母,B應(yīng)該clone了一份自己最新的的state給A,那么問(wèn)題來(lái)了吆寨,

1. A組件必須理解B組件的實(shí)現(xiàn)細(xì)節(jié)赏淌,不然它沒(méi)辦法理解B的state的含義,但state本身是應(yīng)該對(duì)外界透明的啄清。

2. 每個(gè)UI組件都必須暴露注冊(cè)監(jiān)聽(tīng)的接口

3. 大量的state復(fù)制操作

我們想一想如何自己解決這些問(wèn)題六水,

1. ?想不到,是的辣卒,真的想不到啊

2. ?加個(gè)屬性掷贾,不好辦啊,A,C組件都想監(jiān)聽(tīng)B的變化怎么辦荣茫?

3. ?前兩個(gè)解決不了想帅,這個(gè)就不是個(gè)問(wèn)題啊

3. Redux 是怎么解決問(wèn)題的

1. ?計(jì)算機(jī)問(wèn)題總是可以通過(guò)分層來(lái)解決,Redux引入了一個(gè)稱(chēng)之為store的層啡莉,所有的組件不再維護(hù)自身的狀態(tài)港准,所有的狀態(tài)都在這一層來(lái)維護(hù),作為一個(gè)best practice票罐,Redux推薦用扁平的方式來(lái)為維護(hù)這個(gè)store叉趣,所以每個(gè)狀態(tài)都必須小心命名以防止同名沖突,一般的我都會(huì)加組件名作為前綴该押。

2. ?既然組件不再維護(hù)狀態(tài)的變化疗杉,那么組件的渲染必須通過(guò)組件屬性的變化來(lái)完成,所以Redux在原組件外面重新包了一層,然后外層通過(guò)更新內(nèi)層屬性來(lái)觸發(fā)內(nèi)層UI的重新渲染烟具,內(nèi)層組件所有的數(shù)據(jù)通過(guò)props來(lái)綁定梢什,同時(shí)調(diào)用通過(guò)屬性傳過(guò)來(lái)的回調(diào)函數(shù)來(lái)與外界通信,所以組件本身的內(nèi)聚性得到了保證朝聋,組件總是通過(guò)屬性來(lái)工作嗡午,需要特別指出的是,組件本身并不需要知道是否工作在Redux的上下文冀痕,它只是根據(jù)自身的業(yè)務(wù)邏輯來(lái)調(diào)函數(shù)荔睹,所以Redux本身也不需要必須和reactjs綁定,這個(gè)外部組件傳進(jìn)來(lái)的回調(diào)函數(shù)一般只會(huì)dispatch一個(gè)action言蛇,action本身只是一個(gè)必須包含type屬性的普通javascript對(duì)象僻他,所謂的reducer就是actionlistener,它根據(jù)action的type來(lái)更新全局的store腊尚,很顯然reducer針對(duì)同一個(gè)action會(huì)有多份實(shí)現(xiàn)吨拗,比如A,C組件對(duì)于B組件dispatch出來(lái)的同一個(gè)action有不同的反應(yīng)。

(未完待續(xù))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婿斥,一起剝皮案震驚了整個(gè)濱河市劝篷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌民宿,老刑警劉巖娇妓,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異勘高,居然都是意外死亡峡蟋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)华望,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蕊蝗,“玉大人,你說(shuō)我怎么就攤上這事赖舟∨钇荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵宾抓,是天一觀的道長(zhǎng)子漩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)石洗,這世上最難降的妖魔是什么幢泼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮讲衫,結(jié)果婚禮上缕棵,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好招驴,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布篙程。 她就那樣靜靜地躺著,像睡著了一般别厘。 火紅的嫁衣襯著肌膚如雪虱饿。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天触趴,我揣著相機(jī)與錄音氮发,去河邊找鬼。 笑死雕蔽,一個(gè)胖子當(dāng)著我的面吹牛折柠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播批狐,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼前塔!你這毒婦竟也來(lái)了嚣艇?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤华弓,失蹤者是張志新(化名)和其女友劉穎食零,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體寂屏,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贰谣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了迁霎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吱抚。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖考廉,靈堂內(nèi)的尸體忽然破棺而出秘豹,到底是詐尸還是另有隱情,我是刑警寧澤昌粤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布既绕,位于F島的核電站,受9級(jí)特大地震影響涮坐,放射性物質(zhì)發(fā)生泄漏凄贩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一袱讹、第九天 我趴在偏房一處隱蔽的房頂上張望疲扎。 院中可真熱鬧,春花似錦、人聲如沸评肆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瓜挽。三九已至盹廷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間久橙,已是汗流浹背俄占。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淆衷,地道東北人缸榄。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像祝拯,于是被迫代替她去往敵國(guó)和親甚带。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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