react+mobx:如何組織store之最佳實踐

上篇文章 create-react-app + webpack + antd + less + mobx 的demo入門配置 簡單介紹了一個筆者使用的最基本的react配置植袍,簡單引入了mobx。
現(xiàn)在問題是 如果store越來越多生蚁,會導致引用混亂崩哩,非常不便于開發(fā)巡球。因此在閱讀了幾篇文章之后,我嘗試給出一個相對較好的使用方法邓嘹。
參考文章酣栈;
保有對子store的引用
provider,inject引入react
官方文檔

統(tǒng)一管理 Store

針對越來越多的store, 可以考慮使用 一個總 Store汹押,保持對每個子 Store的引用矿筝。如有必要,可以在子Store中傳入父Store棚贾,讓子Store也可以訪問到父Store窖维。

import CountStore from './CountStore'
import ChangeNameStore from './ChangeNameStore'
class Store {
    constructor() {
        this.countStore = new CountStore()
        this.changeNameStore = new ChangeNameStore()
    }
}
export default new Store()

實踐一

如上,簡單創(chuàng)建的兩個子Store妙痹。在需要使用數(shù)據(jù)的地方铸史,import store即可, 看下面例子:

const ChangeName = (observer( ( {} ) => {
    return (
        <div className='Change'>
            <div>{store.changeNameStore.name}</div>
            <div className="buttons">
                <Button type="primary" className="btn" onClick={() =>
                    store.changeNameStore.changeName()
                }>change</Button>
            </div>
        </div>
    );
}))
export default ChangeName;

ChangeNameStore如下:

import {observable, action} from 'mobx'

class ChangeNameStore {

    @observable name = "sun"

    @action
    changeName() {
        if (this.name === "sun") {
            this.name = "wen"
        } else {
            this.name = "sun"
        }
    }
}

export default ChangeNameStore;

運行程序怯伊,點擊按鈕可以看到name改變琳轿。

這種方式引用方便,哪里用到store就哪里import耿芹。弊端就是如果store的層級越來越多崭篡,會導致代碼難以編寫。

實踐二

官方參考redux吧秕,給出了Provider和inject組件琉闪,推薦使用DI方式去管理store,這也是我覺得最好的方式寇甸。
首先也是由一個stores保持有對所有子store的引用,接著使用Provider組件將stores傳遞給父組件塘偎。

import CountStore from './mobx/CountStore'
import ChangeNameStore from './mobx/ChangeNameStore'

const countStore = new CountStore();
const changeNameStore = new ChangeNameStore();

const stores = {
    countStore,
    changeNameStore,
}

class App extends Component {
    render() {
        return (
            <Provider {...stores}>
                <Home/>
            </Provider>
        );
    }
}

export default App;

如上疗涉,下面是怎么使用inject是自組件可以訪問store拿霉。

const ChangeName = inject("changeNameStore")(observer( ( {changeNameStore} ) => {
    return (
        <div className='Change'>
            <div>{changeNameStore.name}</div>
            <div className="buttons">
                <Button type="primary" className="btn" onClick={() =>
                    changeNameStore.changeName()
                }>change</Button>
            </div>
        </div>
    );
}))

export default ChangeName;

推薦使用無狀態(tài)組件,將需要的store直接傳入組件咱扣,其他使用方法與之前無區(qū)別绽淘。
如此以來,無論store的層級有多少闹伪,針對單一功能組件原則沪铭, 可以將最小的store引入壮池,方便管理。

最佳實踐的代碼見github:https://github.com/yunshuipiao/react-web-demo

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杀怠,一起剝皮案震驚了整個濱河市椰憋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赔退,老刑警劉巖橙依,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異硕旗,居然都是意外死亡窗骑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門漆枚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來创译,“玉大人,你說我怎么就攤上這事墙基∪碜澹” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵残制,是天一觀的道長互订。 經(jīng)常有香客問我,道長痘拆,這世上最難降的妖魔是什么仰禽? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮纺蛆,結(jié)果婚禮上吐葵,老公的妹妹穿的比我還像新娘。我一直安慰自己桥氏,他們只是感情好温峭,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著字支,像睡著了一般凤藏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堕伪,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天揖庄,我揣著相機與錄音,去河邊找鬼欠雌。 笑死蹄梢,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的富俄。 我是一名探鬼主播禁炒,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼而咆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了幕袱?” 一聲冷哼從身側(cè)響起暴备,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎们豌,沒想到半個月后馍驯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡玛痊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年汰瘫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片擂煞。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡混弥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出对省,到底是詐尸還是另有隱情蝗拿,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布蒿涎,位于F島的核電站哀托,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏劳秋。R本人自食惡果不足惜仓手,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玻淑。 院中可真熱鬧嗽冒,春花似錦、人聲如沸补履。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箫锤。三九已至贬蛙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谚攒,已是汗流浹背阳准。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留五鲫,地道東北人溺职。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像位喂,于是被迫代替她去往敵國和親浪耘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

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