mobx+react入坑心得

1.關(guān)于裝飾器無法啟用解決辦法:

1.1安裝修改 CRA 配置的工具


npm install react-app-rewired --save-dev


1.2 react-app-rewired不兼容CRA2匾竿,可以使用customize-cra來兼容CRA2


npm install customize-cra --save-dev


1.3安裝裝飾器插件


npm install @babel/plugin-proposal-decorators --save-dev


1.4在項目根目錄新建文件config-overrides.js 并配置:


const{override,addDecoratorsLegacy}=require('customize-cra');

module.exports=override(addDecoratorsLegacy());


1.5修改package.json文件


"scripts":{

??? "start": "react-app-rewiredstart",

??? "build": "react-app-rewiredbuild",

??? "test": "react-app-rewiredtest",

??? "eject": "react-app-rewiredeject"

? },

"babel":{

??? "plugins": [

????? [

???????"@babel/plugin-proposal-decorators",

??????? {

????????? "legacy": true

??????? }

????? ]

??? ]

? }


1.6啟動項目逸寓,可以使用裝飾器


2. 使用react

2.1 react的provider傳遞store


ReactDOM.render((

?<Provider store={userStore}}>

? ? ? ? <App />

? ? </Provider>

? ), document.getElementById('container'));


多個store:


const stores = {

? mainStore, userStore, commonStore

};

ReactDOM.render((

? ? <Provider {...stores}>

? ? ? ? <App />

? ? </Provider>

? ), document.getElementById('container'));


2.2 @inject? 將組件從Provider提供給組件的state數(shù)據(jù)中選取所需數(shù)據(jù)峡眶,以props的形式傳遞給目標(biāo)組件。


@inject( 'userStore')

render(){

// 可以以this.props.userStore形式獲取store內(nèi)state

const { user } = this.props.userStore;

}


3. mobx的狀態(tài)管理

3.1 observable 可觀察狀態(tài)

@observable 使數(shù)據(jù)處于可觀察狀態(tài)


@observable? ? welcome = 'WelCome!';

@observable? ? count = 0;

@observable? ? object = {

?? name: 'test',

?? code: '1000',

?? age: 20

}


基本數(shù)據(jù)類型京革,@observable會將保存值的變量變?yōu)榭捎^察狀態(tài),注意基本值本身不能改變幸斥,因此不是可觀察的匹摇。

數(shù)組,數(shù)組本身及元素都是可觀察的

對象甲葬,對象內(nèi)所有的屬性都是可觀察的

數(shù)組對象廊勃,數(shù)組本身及對象元素都是,每個元素內(nèi)部的屬性也是可觀察的

嵌套對象/嵌套數(shù)組经窖,從本身遞歸到最小元素坡垫,即基本數(shù)據(jù)都是可觀察的

自定義類對象,構(gòu)造函數(shù)為自定義画侣,需要在構(gòu)造函數(shù)中自行處理才可變?yōu)榭捎^察的


class User{ //自定義類

??? @observable name;

??? @observable role;

??? constructor(name, role){ //需要在構(gòu)造函數(shù)中處理

??????? this.name = name;

??????? this.role = role;

??? }

}

user = new?User('admin', '管理員'); // 更改屬性值冰悠,會被觀測到


3.2 @computed計算屬性值

根據(jù)現(xiàn)有的狀態(tài)或其他計算屬性值衍生出的值。有助于使實際可修改的狀態(tài)盡可能的小配乱,可以盡量多的使用它溉卓。


@computed get? ? getInfo() {

return `\nname:${this.object.name}

\ncode:${this.object.code}

\nage:${this.object.age}`;

?}


@computed 只有其依賴的@observable 屬性和其他@computed改變時才會觸發(fā)重新計算更新。

@computed只有被使用時才會計算搬泥,比如@observer桑寨,其他@computed,autorun等

3.3 autorun 永遠(yuǎn)不會被觀察的響應(yīng)式函數(shù)


disposer=autorun(()? ? => {

??? console.log(this.getInfo);

??? if (this.count >=5 ) {

????? this.disposer();

??? }

? });


接受一個函數(shù)作為參數(shù)忿檩,此參數(shù)函數(shù)會在使用autorun時立刻執(zhí)行一次尉尾,之后會在autorun 參數(shù)函數(shù)依賴的@observable 和@computed改變時觸發(fā)執(zhí)行

和@computed不同,autorun沒有觀察者燥透,觸發(fā)條件僅限于依賴值的改變沙咏,自動運行

autorun應(yīng)作為打印日志和更新UI的函數(shù),不產(chǎn)生返回新值

autorun的返回值為autorun的終止函數(shù)兽掰,用來清除autorun芭碍,執(zhí)行之后autorun將不再執(zhí)行。

3.4 reaction 屬于autorun的變更版本


reaction=reaction(()? ? => this.count, count => {

??? console.log(this.count);

??? if (count >= 8) {

????? this.reaction();

??? }

? });


reaction接收兩個函數(shù)作為參數(shù)孽尽,第一個為數(shù)據(jù)函數(shù)窖壕,第二個為效果函數(shù)。數(shù)據(jù)函數(shù)的返回值作為效果函數(shù)的參數(shù)

reaction在使用時不會自動運行一次,與autorun不同

reaction只有在數(shù)據(jù)函數(shù)依賴的屬性值變化時才會執(zhí)行瞻讽,而效果函數(shù)只有在數(shù)據(jù)函數(shù)的返回值變化時才會執(zhí)行鸳吸,效果函數(shù)不會觀測屬性值的變化。

reaction的返回值是其終止函數(shù)速勇,在reaction不用時進(jìn)行清理

3.5 when


when = when(()? ? => this.object.age >= 23, () => {

??? alert(this.object.age);

? } );


when接收兩個函數(shù)作為參數(shù)晌砾,第一個為條件函數(shù),第二個為效果函數(shù)烦磁。條件函數(shù)的返回值作為效果函數(shù)執(zhí)行的條件养匈。

條件函數(shù)會觀察屬性值的變化,并根據(jù)屬性值執(zhí)行都伪。當(dāng)其返回值為true時呕乎,執(zhí)行效果函數(shù),并且只執(zhí)行這一次陨晶,之后when會被自動清理猬仁。

when的返回值是when的終止函數(shù),可用于主動清除先誉。

when最多執(zhí)行一次湿刽。

3.6 @observer 將react組件變?yōu)轫憫?yīng)式組件,參考前面mobx-react

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褐耳,一起剝皮案震驚了整個濱河市诈闺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漱病,老刑警劉巖买雾,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杨帽,居然都是意外死亡漓穿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門注盈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晃危,“玉大人,你說我怎么就攤上這事老客×欧梗” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵胧砰,是天一觀的道長鳍鸵。 經(jīng)常有香客問我,道長尉间,這世上最難降的妖魔是什么偿乖? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任击罪,我火速辦了婚禮,結(jié)果婚禮上贪薪,老公的妹妹穿的比我還像新娘媳禁。我一直安慰自己,他們只是感情好画切,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布竣稽。 她就那樣靜靜地躺著,像睡著了一般霍弹。 火紅的嫁衣襯著肌膚如雪毫别。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天庞萍,我揣著相機與錄音拧烦,去河邊找鬼。 笑死钝计,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的齐佳。 我是一名探鬼主播私恬,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炼吴!你這毒婦竟也來了本鸣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤硅蹦,失蹤者是張志新(化名)和其女友劉穎荣德,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體童芹,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡涮瞻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了假褪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片署咽。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖生音,靈堂內(nèi)的尸體忽然破棺而出宁否,到底是詐尸還是另有隱情,我是刑警寧澤缀遍,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布慕匠,位于F島的核電站,受9級特大地震影響域醇,放射性物質(zhì)發(fā)生泄漏台谊。R本人自食惡果不足惜蓉媳,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望青伤。 院中可真熱鬧督怜,春花似錦、人聲如沸狠角。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丰歌。三九已至姨蟋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間立帖,已是汗流浹背眼溶。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晓勇,地道東北人堂飞。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像绑咱,于是被迫代替她去往敵國和親绰筛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

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

  • Mobx解決的問題 傳統(tǒng)React使用的數(shù)據(jù)管理庫為Redux描融。Redux要解決的問題是統(tǒng)一數(shù)據(jù)流铝噩,數(shù)據(jù)流完全可控...
    前端大神888閱讀 443評論 1 0
  • MobX 簡單、可擴展的狀態(tài)管理(可觀察的數(shù)據(jù)) 使用: 安裝: npm install mobx --save窿克。...
    jevons_lee_閱讀 662評論 0 1
  • Mobx 安裝 安裝:npm install mobx --save年叮。 React 綁定庫: npm instal...
    淡退閱讀 683評論 0 0
  • 注意:這不是教學(xué)具被,僅僅是學(xué)習(xí)筆記 Mobx 原則 Mobx 是單向的數(shù)據(jù)流,也就是 Action 改變 state...
    yyscc閱讀 674評論 0 0
  • 稀缺+猶豫 恐懼+封閉 低效+盲目 這就是思維壓力的巨大影響力
    三十不惑666閱讀 208評論 0 0