很久之前想写一篇对Redux的研究,但是网上写的很多,而MobX相比较Redux更小众,网上很多资料例如介绍api的都是官网的复刻节选,而我用MobX感觉真的很爽,所以写篇文章帮助初入MobX坑的玩家们,如果写的不对,也希望各位指正,更好发展。

适合用MobX的项目

我认为能用redux的项目就可以用mobx,除非需要redux-saga完成一些极其复杂的异步状态改变,都可以完美替代,一些如微博之类偏社交的整体异步状态并发改变可能很多,不太适合;像能分成各个小模块的,各模块互相联系不是很紧密的复杂项目用mobx体验很好。简言之,因地制宜,不要无脑使用redux,每个都有适合的环境。

基本知识储备

基本的api详细介绍

不使用严格模式的话,不会有Actions而是直接改observable的state,下面是占出现率99%的api

  • @observer:用在react的view层的组件上方,变成可观察的
  • @observable:把一个变量变成可观察的
  • @computed:类似于vue,收集observable的变化而变化
  • autorun:包裹的函数先自动执行一次,里面检测到有依赖变动,自动执行
  • toJS(value, options?):把observable的对象变回原生js对象的函数(实际用的地方很少,但需要知道,如果是用4版本一下的还是要特别注意)

网上比较多,也可以移步MobX中文官网,安装MobX和mobx-react还有装饰器和对应的babel 官网资料也很清晰。

想更好的理解MobX可以找找网上的手写MobX教程,也有助于理解本篇文章(PS:很多api手写起来比想象的简单,简单说来就是把一个普通的深层对象通过递归层层绑定,变成observable的对象,实现最小细粒度的依赖收集)

另外,值得一提的就是MobX5使用的proxy,MobX4以下用的Object.defineProperty,还是有点区别的,不多说了

结合MVP思想使用

官网的图⬇

相比较redux状态管理库,这种单向流真的清晰容易理解,同时我们团队做了进一步简化,不用Actions触发,直接修改状态state,但对其做了一些约定,使得代码量进一步降低

我们团队使用mvp思想,这里的mvp其实类似安卓的mvp思想,是mvc的兄弟,在MVC里,View是可以直接访问Model的,但MVP中的View并不能直接使用Model,而是通过为Presenter提供接口,让Presenter去更新Model,再通过观察者模式更新View。 与MVC相比,MVP模式通过解耦View和Model,完全分离视图和模型使职责划分更加清晰;由于View不依赖Model,可以将View抽离出来做成组件,它只需要提供一系列接口提供给上层操作。mvp优点是数据和视图分得很开,缺点是如果逻辑多的话,presenter可能会很重,但是采用MobX的话会好很多,大量受观察的数据可以少写些逻辑。MobX写起来很简单(代码比redux少太多),逻辑也比较清晰,可以在presenter里面很快找到数据变动的逻辑

上图就是一个mvp思想下的模块,整个模块: Home这个tsx组件负责View,在constructor函数里面new实例化Presenter.ts这个控制器(最好是这样做,状态组件可以复用),presenter负责整个的数据处理逻辑,同时引入Home的子组件要把实例化后的presenter传入,大体就是这些

下面用代码简单示意⤵️

View层GoodsPriceTrackHome.tsx代码如下:

@observer
export default class GoodsPriceTrackHome extends React.Component<any, any> {private presenter: GoodsPriceTrackPresenter;constructor(props: any, context: any) {super(props, context);this.presenter = new GoodsPriceTrackPresenter();}//简单示意render() {const {abc,changeAbc} = this.presenter;return <div onClick={changeAbc}>abc</div>}//如果有子组件且需要传presenter的话render() {return <Childrenpresenter={this.presenter}/>}
复制代码

控制器这一层GoodsPriceTrackPresenter.ts代码如下:

export default class GoodsPriceTrackPresenter {@observablepublic abc: number = 123;public changeAbc(){this.abc++;}
}
复制代码

是否及何时使用严格模式

结论:基本不用严格模式(像示例中直接改了this.abc),如果是两三个人协作开发的小项目,开发过程中基本没有太多交集,自然不需要约定修改,大型项目的话,只有登录等账户全局的一些异步操作需要严格模式@action来约束,其他模块的话,最多一两个人来负责开发维护,所以如果基本上是自己负责一个模块或者一个小项目,就直接用普通模式

注意事项

所有的与服务器通信数据变动操作都放在p(presenter)上,除了监控ui的变化(如一些自适应之类)才放在v(view)上

React Native下mobx相对更好

React Native编译后与h5或者web端这种浏览器是不同的,它对性能更敏感,每次刷新并不是操作dom而是原生组件,所以 在大型列表等情况下,MobX 可以更新特定单元格而无需重新呈现整个列表。通常这也可以通过 Redux 实现,但是需要重写 componentShouldUpdate() 方法并编写更多样板文件以避免不必要的重新渲染。在将其余变量复制到新状态时,redux的reducer 仍会执行一些不必要的工作

MobX体验的一些不足

1.开发插件

mobx由于是分布式的状态管理,所以几个开发插件体验不好,基本没怎么用,调试是打断点或者console,感觉这样更方便一些

2.内存泄漏

开发者水平不齐或者无意识的进行不规范的使用,可能会造成内存泄漏,用户长时间使用产品造成内存泄漏,影响用户体验(组件卸载之后,但是其他引用较乱,导致某些手观察对象或者闭包无法释放)

3.侵入性

面向对象的话,设计较为复杂,无关大量数据绑定太多,也会影响到性能

总结

1.基本不用严格模式约束,直接在Presenter组件里改状态(但怎么改一定要事先理清思路哈)

2.相比redux,MobX管理状态更简单有效率,写的代码更少,做项目效率更高(但要分项目适不适合)

3.如果不注意使用规范,大项目可能会有性能问题(一般是遇不到的)

这篇文章我还会经常去完善更新,因为状态库涉及太多,讲得比较草率,很多都点到即止了

欢迎评论区评论和拍砖,两开花啊两开花

简洁的MobX与MVP思想—大型项目实践相关推荐

  1. angular大型项目实践总结的几个要点

    angular大型项目实践总结的要点 整理电脑文档,顺便搬用到博客,文字是2018年写的 国际化要提前做,贯穿整个开发过程 图标,图片,规范化,使用统一的方式使用,无论是雪碧图还是字体化(有很多把图片 ...

  2. [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)...

    本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...

  3. Asp.Net大型项目实践系列导航 [以后要仔细看的,支持作者 转]

    关键字 NHibernate,ExtJs,Asp.Net MVC,Unity,业务领域驱动DDD,SOA,WCF,WF,分层开发,权限管理,异常管理,事务管理,日志管理... 宣传语 这里没有无聊的口 ...

  4. [转载](asp.net大型项目实践)

    首先感谢:传说中的弦哥http://www.cnblogs.com/legendxian/ 关键词::NHibinate,Json,SOA,大型三甲医院信息管理系统.------ 医院信息系统(Hos ...

  5. Asp.Net大型项目实践(7)-用Unity实现AOP之事务处理+为啥要用AOP(附源码)

    在目录中我计划对权限管理,异常管理,事务管理,日志管理,异常管理等项目中AOP典型应用场景进行详细的描述,本篇我们用Unity的Interception来实现项目中的事务处理. 为啥要用AOP 由于这 ...

  6. 【阅读笔记】精益开发实践用看板管理大型项目

    [阅读笔记]精益开发实践用看板管理大型项目 参考 精益开发实践用看板管理大型项目 文章目录 [阅读笔记]精益开发实践用看板管理大型项目 一.我们如何工作(案例研究) 1.项目背景 2.组织团队 3.每 ...

  7. 初中高级的 git 和 gerrit 技巧【大型项目实战总结 CR 经验】

    序 前半部分属于基础,后半部分属于进阶.从初级到中级再到我都 hold 不住的高级.全文共 12000 余字,超干超干的那种. 然而,写完一半的时候,我突然虎躯一震,我是不是在造轮子?随后我悄悄的搜了 ...

  8. python语言依赖平台吗_在大型项目上,Python 是个烂语言吗?

    笔者用过 Java 和 Python, 现在主力语言是 Python / JavaScript 先回答题主的疑问:10 W 行应该算不上大项目. 通常情况下,动态类型的语言在单位代码行数的表达能力比静 ...

  9. 如何估算大型项目的工作量

    我是一个九人开发团队的领头人.一般来说,我们所从事的是(项目)支持和强化的工作,但是有的时候,我们被要求完成一项大型工作,而这项工作大到肯定可以被作为一个项目来看待.我们所面临的问题是:我们很难估算需 ...

最新文章

  1. Linux文件压缩与解压缩
  2. php file函数在内容与底层逻辑分离的应用
  3. c# Dictionary的遍历和排序
  4. Linux系统篇-文件系统虚拟文件系统
  5. php获取显示图书数据,php基于dom实现读取图书xml格式数据的方法
  6. Oracle Recyclebin
  7. 应用新的JDK 11字符串方法
  8. Java:选择正确的集合
  9. Linux下的lua和boost c++的搭建和安装
  10. Hibernate之表间关系
  11. 数学江湖中的“独孤九剑”
  12. 轻量级的jQuery表单校验插件: Happy.js
  13. c向python注册函数_python如何调用C, 如何注册成C的回调函数(python后台程序常用方法)...
  14. 记-ItextPDF+freemaker 生成PDF文件---导致服务宕机
  15. sql server运算符_SQL Server执行计划中SELECT运算符的主要概念
  16. 如何在Go中找到一个对象的类型?
  17. Python 命令的参数
  18. 拓端tecdat|R语言实现MCMC中的Metropolis–Hastings算法与吉布斯采样
  19. Photosho cs6安装字体教程
  20. CentOS7修改Locale为zh_CN.UTF-8

热门文章

  1. html中刷新按钮的代码,常见的按钮类型 点击button刷新的几种常用代码
  2. linux 采集cpu 内存,Linux环境获取(cpu、内存、网卡流量等)系统性能数据
  3. 国外基于android的系统,基于Android的位置服务系统设计与实现
  4. 吸尘车-真空吸尘车:真空吸尘车
  5. JDK环境变量设置(linux)
  6. 兼容IE和FF的JS HTMLEncode和HTMLDecode的完整实例[转]
  7. Sql自动更新不同IP的数据库数据。(link Server)
  8. IIS支持Shtml后辍文件方法
  9. C# Thread开启线程几种方式
  10. 寄存器、存储器、内存的区别