前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于如何在 Mobx 中组织 Stores

关于如何在 Mobx 中组织 Stores

原创
作者头像
发声的沉默者
修改于 2021-06-16 02:04:52
修改于 2021-06-16 02:04:52
9560
举报
文章被收录于专栏:江歌闲谈江歌闲谈

Stores(存储)

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

单一 Stores

RootStore

代码语言:txt
AI代码解释
复制
import { observable, action, configure } from 'mobx';



// configure({ enforceActions: 'always' });



class RootStore {



    @observable

    name = '123';



    @action('name')

    updateCount() {

        this.name = '456';

    }

}

export default new RootStore();

Stores 注入

代码语言:txt
AI代码解释
复制
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')

);

页面引入

代码语言:txt
AI代码解释
复制
import React, { Component } from 'react';

import { observer, inject } from 'mobx-react';



@inject('rootStore')

@observe

class Index extends Component {

    constructor(props) {

        super(props);

    }



    render() {

        return (

            <>

            </>

        );

    }

}



export default Index;

优点:

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

缺点:

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

单一 Stores 进阶版

RootStore

代码语言:txt
AI代码解释
复制
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

代码语言:txt
AI代码解释
复制
import { observable, action } from 'mobx';



class DashBoardStore extends BasicStore {

    @observable

    name = 'Faker';



    @action

    updateName() {

        this.name = 'Jiang';

    }

}



export default DashBoardStore;

注入 RootStore

代码语言:txt
AI代码解释
复制
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')

);

页面引入

代码语言:txt
AI代码解释
复制
import React, { Component } from 'react';

import { observer, inject } from 'mobx-react';

import DashboardStore from '../../mobx/Dashboard/store';



@inject('rootStore')

@observe

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 初始化

缺点:

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

多 Store 组合

RootStore

代码语言:txt
AI代码解释
复制
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 注入

代码语言:txt
AI代码解释
复制
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')

);

页面引入

代码语言:txt
AI代码解释
复制
import React from 'react';

import { inject, observer } from 'mobx-react';



@inject('userStore')

@inject('statisticalCenterStore')

@observe

class Index extends React.PureComponent {

    constructor(props) {

        super(props);

        this.state = { };

    }



    render() {

        return (

            <>

            </>

        );

    }

}



export default Index;

优点:

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

缺点:

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

中性:

状态可以被随意修改:

  • 直接在视图层给状态赋值,比如我有 A,B 两个页面,都要修改 C 页面,那么,我在 A 和 B 页面修改 C 的 Store,很方便,但是,如果不制定一套规范,如果数据改变,要追踪来源,很困难,而且很容易产生意想不到的情况。
  • 通过configure({ enforceActions: 'always' });杜绝在 Action 以外对 Store 的修改

博客

欢迎关注我的博客

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
问:你是如何进行react状态管理方案选择的?
前言:最近接触到一种新的(对我个人而言)状态管理方式,它没有采用现有的开源库,如redux、mobx等,也没有使用传统的useContext,而是用useState + useEffect写了一个发布订阅者模式进行状态管理,这一点对我来说感觉比较新奇,以前从没接触过这种写法,于是决定研究一下目前比较常用的状态管理方式。
beifeng1996
2022/10/10
3.6K0
React MobX 开始
MobX[1] 用于状态管理,简单高效。本文将于 React 上介绍如何开始,包括了:
GoCoding
2021/12/30
1.1K0
React MobX 开始
Mobx的使用
@语法糖报错 解决办法安装下面两个命令 yarn add @babel/plugin-proposal-decorators yarn add @babel/plugin-proposal-class-properties
世间万物皆对象
2024/03/20
1810
React 进阶 - React Mobx
Mobx 采用了一种'观察者模式'—— Observer,整个设计架构都是围绕 Observer 展开:
Cellinlab
2023/05/17
9160
React 进阶 - React Mobx
38. 精读《dob - 框架使用》
本系列分三部曲:《框架实现》 《框架使用》 与 《跳出框架看哲学》,这三篇是我对数据流阶段性的总结,正好补充之前过时的文章。
黄子毅
2022/03/14
4860
react-create-app 中配置使用 Mobx
安装配置 yarn add mobx mobx-react yarn add babel-plugin-transform-decorators-legacy // webpack.config.dev.js webpack.congif.prod.js { test: /\.(js|jsx|mjs)$/, include: paths.appSrc, loader: require.resolve('babel-loader'), options: { plu
FinGet
2019/06/28
9780
【转】Mobx React  最佳实践
在这一篇文章里,将展示一些使用了mobx的React的最佳实践方式,并按照一条一条的规则来展示。在你遇到问题的时候,可以依照着这些规则来解决。 这篇文章要求你对于mobx的stores有基本的理解,如果没有的话请先阅读官方文档。
Tiffany_c4df
2019/12/07
1.4K0
【MobX】391- MobX 入门教程(下)
在上一部分内容中,我们了解到,对可观察的数据做出反应的时候,需要我们手动修改可观察数据的值。这种修改是通过直接向变量赋值来实现的,虽然简单易懂,但是这样会带来一个较为严重的副作用,就是每次的修改都会触发 autorun 或者 reaction 运行一次。多数情况下,这种高频的触发是完全没有必要的。
pingan8787
2019/10/30
9160
【MobX】391- MobX 入门教程(下)
【MobX】MobX 简单入门教程
<img src="http://images.pingan8787.com/blog/mobx.png" width="120px"/>
pingan8787
2019/10/24
1.5K0
react 的数据管理方案:redux 还是 mobx?
IMWeb前端团队
2018/01/08
2K0
react 的数据管理方案:redux 还是 mobx?
Mobx6 的新写法
目前 MobX 已经更新到 6.X 了,相比于之前有了极大的简化,去掉了之前版本的装饰器风格写法,主要原因是装饰器在现在的 ES 规范中并不成熟,而且引入装饰器语法也会增加打包后的代码体积。
用户9914333
2022/07/22
7820
这也许也是你成长的模样 -- Mobx
你知道什么才是大佬吗?浩某正思考着这一花里胡哨的问题,突然被刘某打断:“哎,你过来帮我看个问题”。
饼干_
2022/09/19
4280
Vite + React + Typescript 构建实战
点击上方蓝字,发现更多精彩 导语 最近前端大火的 Vite 2.0 版本终于出来了,在这里分享一下使用 vite 构建一个前端单页应用以及踩过的坑,希望能带给大家一些收获。 文章首发于个人博客:heavenru.com 该文章主要面向对 Vite 感兴趣,或者做前端项目架构的同学 源码地址:fe-project-base https://github.com/lichenbuliren/fe-project-base 通过这篇文章,你能了解到以下几点: vscode 编辑器配置 git pre-commi
腾讯VTeam技术团队
2021/04/22
1.7K0
从零搭建 Vite + React 开发环境
大概在 2019 年,自己搭建 React 开发环境的想法萌芽,到目前为止,公司的很多项目上,也在使用中,比较稳定。为什么要自己造轮子?起初是因为自己并不满意市面上的脚手架。另外,造轮子对于自己也有一些技术上的帮助,学别人二次封装的东西,不如直接使用底层的库,这样也有助于自己系统的学习一遍知识,最近 Vite 很火,所以用 Vite 搭建一波,废话不多说,直接进入正文,如何搭建自己的开发环境。
发声的沉默者
2021/06/14
4.5K0
从零搭建 Vite + React 开发环境
MobX学习之旅
但是,如果仅仅想要在被观察的变量有变化的时候触发,而不是立即执行autorun,那么我们可以用到reaction了;
全栈程序员站长
2022/06/29
1.4K0
redux、mobx、concent特性大比拼, 看后生如何对局前辈
redux、mobx本身是一个独立的状态管理框架,各自有自己的抽象api,以其他UI框架无关(react, vue...),本文主要说的和react搭配使用的对比效果,所以下文里提到的redux、mobx暗含了react-redux、mobx-react这些让它们能够在react中发挥功能的绑定库,而concent本身是为了react贴身打造的开发框架,数据流管理只是作为其中一项功能,附带的其他增强react开发体验的特性可以按需使用,后期会刨去concent里所有与react相关联的部分发布concent-core,它的定位才是与redux、mobx 相似的。
腾讯新闻前端团队
2020/04/06
4.7K0
redux、mobx、concent特性大比拼, 看后生如何对局前辈
Mobx实践
由于redux需要写很多繁琐的action和reducer,很多项目也没有复杂到需要用到redux的程度却强上了redux,导致不少人对redux深恶痛绝。mobx是另一种流行的状态管理方案,这里分享一下我最近使用mobx的经验。
尹光耀
2021/10/19
9090
搞清楚怎样基于 Webpack5 从 0 搭建 React开发环境-超详细
出处 @刘江 ,原文地址 https://juejin.cn/post/6929496472232656909
zz_jesse
2021/04/21
2.6K0
搞清楚怎样基于 Webpack5 从 0 搭建 React开发环境-超详细
实现简版 react 状态管理器 mobx
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
测不准
2022/08/07
1.5K0
实现简版 react 状态管理器 mobx
MobX状态管理:简洁而强大的状态机
MobX 是一个用于构建可响应的数据模型的库,它提供了一种声明式的方式来管理状态,使得数据的变化能够自动更新相关的视图。
天涯学馆
2024/08/16
2570
相关推荐
问:你是如何进行react状态管理方案选择的?
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档