Immutable.js

Immutable.js在react + router + redux項(xiàng)目中的應(yīng)用

先介紹一下Immutable:

Immutable.js的出現(xiàn)源于Functional Programming的思想,即所有數(shù)據(jù)應(yīng)該是復(fù)制過來簿晓,而不是直接修改眶拉。相關(guān)介紹看它官網(wǎng):
https://facebook.github.io/immutable-js/

所以如果你有一些編程經(jīng)驗(yàn),可以理解為Immutable就是另外一個(gè)數(shù)據(jù)結(jié)構(gòu)的庫憔儿。就好像從ArrayList換成LinkedList一樣忆植。在Immutable.js下,就是從JavaScript語法自有的Array(就是[])和Object{ }),換到Immutable.ListImmutable.Map了坞淮。

但是ArrayListLinkedList畢竟都繼承于List负懦,接口上比較一致,換起來問題不大拾氓,但是想用Immutable換JavaScript原生,就要略復(fù)雜些底哥。

var map1 = Immutable.Map({a:1, b:2, c:3});
var map2 = map1.set('b', 50);
map1.get('b'); // 2
/* ----------------悠長悠長的分割線---------------- */
var list1 = Immutable.List.of(1, 2);
var list2 = list1.push(3, 4, 5);
var list3 = list2.unshift(0);
var list4 = list1.concat(list2, list3);

復(fù)雜歸復(fù)雜咙鞍,不過是多注意一點(diǎn)吧。

然后要說到redux和router

Redux有一個(gè)combineReducers方法趾徽,可以做到Reducer的拆分续滋。比如:

combineReducers({
  user: userReducer,
  dashboard: dashboardReducer,
})

那么問題來了:
當(dāng)你獲取state的時(shí)候,你是用state.get('user')還是用state.user孵奶?

顯然要用state.user吃粒。因?yàn)?code>combineReducers不認(rèn)識(shí)Immutable啊。
(不要告訴我混用拒课,一層結(jié)構(gòu)可以這樣徐勃,多層呢?多人合作呢早像?一處蒙逼僻肖,處處報(bào)錯(cuò)啊)

所以如果你想在一個(gè)react + router + redux的項(xiàng)目下用Immutable卢鹦,要么就局部使用(局部的話臀脏,基本會(huì)很nightmare吧)劝堪,要么就換全套的。
然后就是看這里(這哥們把combineReducers給重新寫了):
https://github.com/gajus/redux-immutable

用他們家的combineReducers揉稚,你就可以放心地用state.get('user')秒啦。

在解決combineReducers的同時(shí)搀玖,他們家還順帶解決了react-router-redux的問題(試想router作為state下的routing模塊卻不懂用Immutable該多呵呵):

https://github.com/gajus/redux-immutable#using-with-react-router-redux

說了這么多余境,怎么用呢

首先你的項(xiàng)目是react + router + redux的標(biāo)配。
然后你要引入Immutable灌诅。

那么你該這樣:

  1. 引入redux-immutable
  2. 按照redux-immutable的README.md把history什么的配置好(Ctrl+C, Ctrl+V)
  3. 所有reducer合并的時(shí)候換用redux-immutable的combineReducers
  4. 所有數(shù)據(jù)出入state用Immutable.js的Immutable.ListImmutable.Map(這個(gè)才是正題)

還有什么要注意的嗎芳来?

組件的問題:

從redux過來的思想是把組件分成Smart和Dumb。Smart組件負(fù)責(zé)把數(shù)據(jù)接進(jìn)來猜拾,Dumb組件負(fù)責(zé)使用數(shù)據(jù)即舌,并只關(guān)注props。所以Immutable要覆蓋Smart和Dumb嗎挎袜?

我個(gè)人觀點(diǎn)是這樣的:
Dumb組件基本都是要抽象出來給多個(gè)項(xiàng)目共用的顽聂。這部分組件不支持Immutable應(yīng)該更好些,否則就被綁死在Immutable上了盯仪。

那這么說紊搪,Dumb里的數(shù)據(jù)是JavaScript原生的,豈不是享受不到Immutable帶來的好處磨总?
數(shù)據(jù)已經(jīng)復(fù)制給了組件嗦明,為了兼容性犧牲一點(diǎn)這個(gè)也沒啥吧笼沥?

這個(gè)想法背后的結(jié)論就是:
redux概念里的Container在做state與props之間蚪燕,props與dispatch之間的對(duì)接的時(shí)候,也同時(shí)做了Immutable與原生的相互轉(zhuǎn)換奔浅。(Adapter Pattern吧)

測試的時(shí)候:

你會(huì)想console.log一下當(dāng)前的數(shù)據(jù)吧馆纳,把Immutable.List打出來看著很累的,建議用console.log(imtb.toJS())

可是debug的時(shí)候呢汹桦?

題外話

如果這些特性是JavaScript本身內(nèi)置的就好了鲁驶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舞骆,隨后出現(xiàn)的幾起案子钥弯,更是在濱河造成了極大的恐慌,老刑警劉巖督禽,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脆霎,死亡現(xiàn)場離奇詭異,居然都是意外死亡狈惫,警方通過查閱死者的電腦和手機(jī)睛蛛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忆肾,你說我怎么就攤上這事荸频。” “怎么了客冈?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵旭从,是天一觀的道長。 經(jīng)常有香客問我郊酒,道長遇绞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任燎窘,我火速辦了婚禮摹闽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘褐健。我一直安慰自己付鹿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布蚜迅。 她就那樣靜靜地躺著舵匾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谁不。 梳的紋絲不亂的頭發(fā)上坐梯,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音刹帕,去河邊找鬼吵血。 笑死,一個(gè)胖子當(dāng)著我的面吹牛偷溺,可吹牛的內(nèi)容都是我干的蹋辅。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼挫掏,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼侦另!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尉共,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤褒傅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后袄友,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殿托,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年杠河,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碌尔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浇辜。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖唾戚,靈堂內(nèi)的尸體忽然破棺而出柳洋,到底是詐尸還是另有隱情,我是刑警寧澤叹坦,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布熊镣,位于F島的核電站,受9級(jí)特大地震影響募书,放射性物質(zhì)發(fā)生泄漏绪囱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一莹捡、第九天 我趴在偏房一處隱蔽的房頂上張望鬼吵。 院中可真熱鬧,春花似錦篮赢、人聲如沸齿椅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涣脚。三九已至,卻和暖如春寥茫,著一層夾襖步出監(jiān)牢的瞬間遣蚀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國打工纱耻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芭梯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓膝迎,卻偏偏與公主長得像粥帚,于是被迫代替她去往敵國和親胰耗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子限次,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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