react+mobx:如何組織store之最佳實(shí)踐

上篇文章 create-react-app + webpack + antd + less + mobx 的demo入門配置 簡單介紹了一個筆者使用的最基本的react配置,簡單引入了mobx。
現(xiàn)在問題是 如果store越來越多,會導(dǎo)致引用混亂,非常不便于開發(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()

實(shí)踐一

如上,簡單創(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;

運(yùn)行程序,點(diǎn)擊按鈕可以看到name改變。

這種方式引用方便,哪里用到store就哪里import。弊端就是如果store的層級越來越多,會導(dǎo)致代碼難以編寫。

實(shí)踐二

官方參考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引入,方便管理。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容