如何在 MobX 中组织 商店 #93

简介: 如何在 MobX 中组织 商店 #93

商店(存储)


Store可以在任何 系架构中找到,可以与 MVC 模式中的控制器进行比较。 的主要职责是将逻辑和状态从组件中移至一个独立的,可测试的单元,这个单元在 前端和后端中都可以使用。FluxStoreJavaScript


单一 商店


根存储

import { observable, action, configure } from 'mobx';
// configure({ enforceActions: 'always' });
class RootStore {
    @observable
    name = '123';
    @action('name')
    updateCount() {
        this.name = '456';
    }
}
export default new RootStore();

商店注入

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'mobx-react';
import RootStore from './mobx/rootStore';
ReactDOM.render(
    <Provider rootStore={RootStore}>
        ...
    </Provider>,
    document.getElementById('root')
);

页面引入

import React, { Component } from 'react';
import { observer, inject } from 'mobx-react';
@inject('rootStore')
@observer
class Index extends Component {
    constructor(props) {
        super(props);
    }
    render() {
        return (
            <>
            </>
        );
    }
}
export default Index;

优点:

  • 好理解,容易入手,经典的 MVC 模式。

缺点:

  • 如果 Store 越来越大,那么非常不好维护。

单一 Stores 进阶版


根存储

import { observable, action } from 'mobx';
import { configure } from 'mobx';
configure({ enforceActions: 'always' });
class RootStore {
    @observable
    test = '123';
    @action('test')
    updateCount() {
        this.test = '456';
    }
}
export default new RootStore();

页面 Store

import { observable, action } from 'mobx';
class DashBoardStore extends BasicStore {
    @observable
    name = 'Faker';
    @action
    updateName() {
        this.name = 'Jiang';
    }
}
export default DashBoardStore;

注入 RootStore

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'mobx-react';
import RootStore from './mobx/rootStore';
ReactDOM.render(
    <Provider rootStore={RootStore}>
        ...
    </Provider>,
    document.getElementById('root')
);

页面引入

import React, { Component } from 'react';
import { observer, inject } from 'mobx-react';
import DashboardStore from '../../mobx/Dashboard/store';
@inject('rootStore')
@observer
class Index extends Component {
    constructor(props) {
        super(props);
        this.dashboardStore = new DashboardStore();
    }
    componentDidMount() {
        this.dashboardStore.updateName();
    }
    render() {
        return (
            <>
            </>
        );
    }
}
export default Index;

优点:

  • 每个页面对应一个 , 不会非常庞大StoreStore
  • 各个 相对独立Store
  • 不同页面需要共享的数据存入 RootStore
  • 在进入页面,会对 初始化Store

缺点:

  • 组件侵入性,需要改变 组件原本的结构,例如所有需要响应数据变动的组件都需要使用 装饰,组件本地状态也需要 装饰,以及数据操作方式等等,对 耦合较深,日后切换框架或重构的成本很高ReactobserverobservableMobx
  • 状态可以被随意修改,通过杜绝在 以外对 的修改configure({ enforceActions: 'always' });ActionStore


多 Store 组合


RootStore

import UserStore from './User/store';
import StatisticalCenterStore from './StatisticalCenter/store';
import AccountSettingStore from './AccountSetting/store';
import CallRecordStore from './CallRecord/store';
class RootStore {
    constructor() {
        this.userStore = new UserStore();
        this.statisticalCenterStore = new StatisticalCenterStore();
        this.accountSettingStore = new AccountSettingStore();
        this.callRecordStore = new CallRecordStore();
    }
}
export default new RootStore();

Stores 注入

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'mobx-react';
import RootStore from './mobx/rootStore';
ReactDOM.render(
    <Provider {...RootStore}>
        ...
    </Provider>,
    document.getElementById('root')
);

页面引入

import React from 'react';
import { inject, observer } from 'mobx-react';
@inject('userStore')
@inject('statisticalCenterStore')
@observer
class Index extends React.PureComponent {
    constructor(props) {
        super(props);
        this.state = { };
    }
    render() {
        return (
            <>
            </>
        );
    }
}
export default Index;

优点:

  • 每个页面对应一个 , 不会非常庞大StoreStore
  • 各个 相对独立Store
  • 那个页面需要那个 ,引入即可Store
  • 不刷新游览器,页面状态一直保持着

缺点:

  • 组件侵入性,需要改变 组件原本的结构,例如所有需要响应数据变动的组件都需要使用 装饰,组件本地状态也需要 装饰,以及数据操作方式等等,对 耦合较深, 日后切换框架或重构的成本很高ReactobserverobservableMobx
  • 无数据快照,如果要重置 ,那么得写,一个个变量还原,当然也可以通过 实现Storereset actionmobx-state-tree

中性:

状态可以被随意修改:

  • 直接在视图层给状态赋值,比如我有 A,B 两个页面,都要修改 C 页面,那么,我在 A 和 B 页面修改 C 的 Store,很方便,但是,如果不制定一套规范,如果数据改变,要追踪来源,很困难,而且很容易产生意想不到的情况。
  • 通过杜绝在 以外对 的修改configure({ enforceActions: 'always' });ActionStore
目录
相关文章
|
小程序 JavaScript
搞定 Mobx 小程序状态管理
搞定 Mobx 小程序状态管理
233 0
|
4月前
|
存储 前端开发 JavaScript
|
7月前
|
JavaScript 前端开发 测试技术
构建一个使用React和Redux的简单在线书店应用。
构建一个使用React和Redux的简单在线书店应用。
55 0
|
存储 缓存 JavaScript
科技与狠活儿丨Vue项目中Pinia状态管理工具的使用
科技与狠活儿丨Vue项目中Pinia状态管理工具的使用
348 0
科技与狠活儿丨Vue项目中Pinia状态管理工具的使用
|
存储 安全 关系型数据库
Django+Vue开发生鲜电商平台之3.数据模型设计和资源导入(上)
文章目录 一、项目初始化 二、数据模型设计 1.用户数据模型设计 2.商品数据模型设计 3.交易数据模型设计 4.用户操作数据模型设计 三、xadmin后台管理系统的配置 四、数据迁移和数据导入 1.migration原理和表的生成 2.导入商品类别和商品数据
Django+Vue开发生鲜电商平台之3.数据模型设计和资源导入(上)
|
关系型数据库 MySQL 数据库
Django+Vue开发生鲜电商平台之3.数据模型设计和资源导入(中)
文章目录 一、项目初始化 二、数据模型设计 1.用户数据模型设计 2.商品数据模型设计 3.交易数据模型设计 4.用户操作数据模型设计 三、xadmin后台管理系统的配置 四、数据迁移和数据导入 1.migration原理和表的生成 2.导入商品类别和商品数据
Django+Vue开发生鲜电商平台之3.数据模型设计和资源导入(中)
Django+Vue开发生鲜电商平台之3.数据模型设计和资源导入(下)
文章目录 一、项目初始化 二、数据模型设计 1.用户数据模型设计 2.商品数据模型设计 3.交易数据模型设计 4.用户操作数据模型设计 三、xadmin后台管理系统的配置 四、数据迁移和数据导入 1.migration原理和表的生成 2.导入商品类别和商品数据
Django+Vue开发生鲜电商平台之3.数据模型设计和资源导入(下)
|
JavaScript 前端开发
基于SprnigBoot+ElementUI 整合Vue案例【公司案件管理系统】(三)
基于SprnigBoot+ElementUI 整合Vue案例【公司案件管理系统】
84 0
基于SprnigBoot+ElementUI 整合Vue案例【公司案件管理系统】(三)
|
JavaScript 前端开发 数据安全/隐私保护
基于SprnigBoot+ElementUI 整合Vue案例【公司案件管理系统】(二)
基于SprnigBoot+ElementUI 整合Vue案例【公司案件管理系统】
127 0
基于SprnigBoot+ElementUI 整合Vue案例【公司案件管理系统】(二)
|
JavaScript
基于SprnigBoot+ElementUI 整合Vue案例【公司案件管理系统】(四)
基于SprnigBoot+ElementUI 整合Vue案例【公司案件管理系统】
119 0
基于SprnigBoot+ElementUI 整合Vue案例【公司案件管理系统】(四)
下一篇
DataWorks