Mobx使用

一.Mobx是什么很魂?

它是簡單的讶泰,可擴(kuò)展的狀態(tài)管理咏瑟。通過透明的函數(shù)響應(yīng)式編程,使?fàn)顟B(tài)變得簡單和可擴(kuò)展痪署。

Mbox的中心思想就是:任何源自應(yīng)用狀態(tài)的東西都應(yīng)該自動(dòng)獲得响蕴。比如有一個(gè)需求,狀態(tài)B是根據(jù)狀態(tài)A計(jì)算得到的惠桃,當(dāng)狀態(tài)A發(fā)生改變的時(shí)候,狀態(tài)B也應(yīng)該重新計(jì)算。在Mobx里面應(yīng)用它的computed辜王,就會(huì)自動(dòng)幫我們更新狀態(tài)B劈狐。這樣比較方便處理。

二呐馆、Mbox運(yùn)行機(jī)制與核心概念肥缔?

運(yùn)行機(jī)制:

上面這個(gè)模型圖描述了單向數(shù)據(jù)流思想,主要是狀態(tài)state的改變汹来,會(huì)對(duì)應(yīng)頁面UI的改變续膳,頁面UI上用戶事件的操作會(huì)觸發(fā)Actions的操作再去更新狀態(tài)。

在Mobx里收班,它的狀態(tài)state叫做observables-可觀察的狀態(tài)值坟岔,它的UI和副作用(reactions)就是observers-觀察者,當(dāng)observables發(fā)生改變時(shí)會(huì)通知到它的observers,然后觀察者可以通過actions做一下處理,再通知observables更新摔桦。

要點(diǎn):

1社付、定義狀態(tài)使其可觀察

2、創(chuàng)建視圖響應(yīng)狀態(tài)變化

3邻耕、更改狀態(tài)

核心概念:

1.observable:可觀察的狀態(tài)值

2.actions:一些改變狀態(tài)值的動(dòng)作

3.computed:根據(jù)state的改變鸥咖,計(jì)算出來的值

4.reactions:因state或者computed value變化而引起的反應(yīng),主要指的是UI重新渲染

常用的裝飾器:

@observable:將一個(gè)變量變得可觀察

@observer常用于React組件兄世,可監(jiān)視r(shí)ender函數(shù)里使用的可觀察變量啼辣,從而做出相應(yīng)的reactions

@autorun常用于組件類或者store類里面,監(jiān)視函數(shù)參數(shù)里使用的可觀察變量御滩,一旦變量發(fā)生變化鸥拧。做出相對(duì)于的reactions

@action?改變觀察變量值的操作

@computed?通過可觀察變量經(jīng)過函數(shù)計(jì)算得來的值,使用的時(shí)候才會(huì)計(jì)算艾恼,沒有用到的時(shí)候不會(huì)計(jì)算住涉。

三、Mbox在React里面怎么使用钠绍?

首先在項(xiàng)目里面安裝mobx和mobx-react

第一步:npm install mobx mobx-react --save

mobx會(huì)使用裝飾器語法

第二步:npm install --save-dev babel-plugin-transform-decorators-legacy // 修飾符的插件

npm install @babel/plugin-proposal-decorators // 裝飾器的一個(gè)插件

第三步:修改.babelrc

Mobx大概的實(shí)現(xiàn)原理:

在被觀察者和觀察者之間建立依賴關(guān)系:

通過一個(gè)Reaction來track一個(gè)函數(shù)舆声,該函數(shù)中訪問了Observable變量,Observable變量的get方法會(huì)被執(zhí)行柳爽,此時(shí)可以進(jìn)行依賴收集媳握,將此函數(shù)加入到該Observable變量的依賴中。

類似于:

reaction.track(function() {

mobx.beginCollect();//開始收集

handler();//被觀察函數(shù)

mobx.endCollect();//結(jié)束收集})

觸發(fā)依賴函數(shù)

上一步中Observable中磷脯,已經(jīng)收集到了該函數(shù)蛾找。一旦Observable被修改,會(huì)調(diào)用set方法赵誓,就是依次執(zhí)行該Observable之前收集的依賴函數(shù)打毛,當(dāng)前函數(shù)就會(huì)自動(dòng)執(zhí)行柿赊。

mobx底層對(duì)數(shù)據(jù)的觀察,是使用Object.defineProperty(Mobx4)或Proxy(Mobx5)幻枉,Mobx4中Array是用類數(shù)組對(duì)象來模擬的碰声,原始值是裝箱為一個(gè)對(duì)象。

Mobx-react大致工作原理:

1.observe組件第一次渲染的時(shí)候熬甫,會(huì)創(chuàng)建Reaction胰挑,組件的render處于當(dāng)前這個(gè)Reaction的上下文中,并通過track建立render中用到的observable建立關(guān)系

2.當(dāng)observable屬性修改的時(shí)候椿肩,會(huì)觸發(fā)onInvalidate方法瞻颂,track中,還是先進(jìn)行依賴收集郑象,調(diào)用forceUpdate去更新組件,然后觸發(fā)組件渲染贡这,然后結(jié)束依賴收集。

四扣唱、Mbox與Redux對(duì)比藕坯?

首先它們都是狀態(tài)管理庫,無論是Redux還是Mobx噪沙,本質(zhì)都是為了解決狀態(tài)管理混亂炼彪,無法有效同步的問題,它們都支持:

統(tǒng)一維護(hù)管理應(yīng)用狀態(tài)正歼;

操作更新狀態(tài)方式統(tǒng)一辐马,并且可控(通常以action方式提供更新狀態(tài)的途徑);

支持將store與React組件連接局义,如react-redux喜爷,mobx-react;通常使用狀態(tài)管理庫后萄唇,我們將React組件從業(yè)務(wù)上劃分為兩類:

容器組件(Container Components):負(fù)責(zé)處理具體業(yè)務(wù)和狀態(tài)數(shù)據(jù)檩帐,將業(yè)務(wù)或狀態(tài)處理函數(shù)傳入展示型組件;

展示型組件(Presentation Components):負(fù)責(zé)展示視圖另萤,視圖交互回調(diào)內(nèi)調(diào)用傳入的處理函數(shù)湃密;

區(qū)別:

1.函數(shù)式和面向?qū)ο?/b>

Redux更多的是遵循函數(shù)式編程思想,而Mobx則更多從面相對(duì)象角度考慮問題四敞。

Redux提倡編寫函數(shù)式代碼泛源,如reducer就是一個(gè)純函數(shù),純函數(shù)忿危,接受輸入达箍,然后輸出結(jié)果,除此之外不會(huì)有任何影響铺厨,也包括不會(huì)影響接收的參數(shù)缎玫;對(duì)于相同的輸入總是輸出相同的結(jié)果硬纤。

Mobx設(shè)計(jì)更多偏向于面向?qū)ο缶幊毯晚憫?yīng)式編程,通常將狀態(tài)包裝成可觀察對(duì)象碘梢,于是我們就可以使用可觀察對(duì)象的所有能力咬摇,一旦狀態(tài)對(duì)象變更,就能自動(dòng)獲得更新煞躬。

2.單一store和多store

store是應(yīng)用管理數(shù)據(jù)的地方,在Redux應(yīng)用中逸邦,我們總是將所有共享的應(yīng)用數(shù)據(jù)集中在一個(gè)大的store中恩沛,而Mobx則通常按模塊將應(yīng)用狀態(tài)劃分,在多個(gè)獨(dú)立的store中管理缕减。

3.JavaScript對(duì)象和可觀察對(duì)象

Redux默認(rèn)以JavaScript原生對(duì)象形式存儲(chǔ)數(shù)據(jù)雷客,而Mobx使用可觀察對(duì)象:

?Redux需要手動(dòng)追蹤所有狀態(tài)對(duì)象的變更;

?Mobx中可以監(jiān)聽可觀察對(duì)象桥狡,當(dāng)其變更時(shí)將自動(dòng)觸發(fā)監(jiān)聽搅裙;

4.不可變和可變

Redux狀態(tài)對(duì)象通常是不可變的,我們不能直接操作狀態(tài)對(duì)象裹芝,而總是在原來狀態(tài)對(duì)象基礎(chǔ)上返回一個(gè)新的狀態(tài)對(duì)象部逮。

而Mobx中可以直接使用新值更新狀態(tài)對(duì)象。

5.mobx-react和react-redux

使用Redux和React應(yīng)用連接時(shí)嫂易,需要使用react-redux提供的Provider和connect:

Provider:負(fù)責(zé)將Store注入React應(yīng)用兄朋;

connect:負(fù)責(zé)將store state注入容器組件,并選擇特定狀態(tài)作為容器組件props傳遞怜械;

對(duì)于Mobx而言颅和,同樣需要兩個(gè)步驟:

Provider:使用mobx-react提供的Provider將所有stores注入應(yīng)用;

使用inject將特定store注入某組件缕允,store可以傳遞狀態(tài)或action峡扩;然后使用observer保證組件能響應(yīng)store中的可觀察對(duì)象(observable)變更,即store更新障本,組件視圖響應(yīng)式更新教届。

參考資料:

https://cn.mobx.js.org/Mobx中文文檔

https://juejin.im/post/6886742591720423438前端狀態(tài)管理框架redux和mobx解析

https://juejin.im/entry/6844903635776700429Mbox探究

?著作權(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)離奇詭異,居然都是意外死亡猜旬,警方通過查閱死者的電腦和手機(jī)脆栋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門倦卖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人椿争,你說我怎么就攤上這事怕膛。” “怎么了秦踪?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵褐捻,是天一觀的道長。 經(jīng)常有香客問我椅邓,道長柠逞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任景馁,我火速辦了婚禮板壮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘合住。我一直安慰自己绰精,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布透葛。 她就那樣靜靜地躺著笨使,像睡著了一般。 火紅的嫁衣襯著肌膚如雪获洲。 梳的紋絲不亂的頭發(fā)上阱表,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音贡珊,去河邊找鬼最爬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛门岔,可吹牛的內(nèi)容都是我干的爱致。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼寒随,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼糠悯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妻往,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤互艾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后讯泣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纫普,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有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
  • 文/蒙蒙 一剩岳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧入热,春花似錦拍棕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尚困,卻和暖如春蠢箩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背事甜。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工谬泌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逻谦。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓掌实,卻偏偏與公主長得像,于是被迫代替她去往敵國和親邦马。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贱鼻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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