mobx的优点

1,使用@observer的组件真正实现按需更新,只有监听的数据发生变化,它才会re-render,尽管父组件发生更新,但是子组件只要有@observer,则不会触发更新,类似于实现了shouldComponentUpdate的效果,而同样的场景,如果是redux,子组件通过connect绑定了store里部分数据,但是如果父组件发生更新,子组件绑定的数据源并未发生变化,因此子组件不应该更新,然而却强制更新。

mobx耦合性更低。

mobx的缺点

1,store过多导致无法统一数据源,在多人开发的情况下会比较混乱,如果需要公用某个store,唯有在特定组件注入该store,那如果有多个store里有多个数据源需要公用呢,那就要同时注入多个store,项目复杂了,store的管理又是一个问题。

2,mobx对于数组的处理,会将它转换成observableArray,它不是一个数组类型,需要进行数组转换(如slice)。

3,mobx在forceupdate时,并没有像setState那样处理多个更新合并的操作,这就带来个问题就是,在同一个event loop中,如果多次通过action去引起同一个观察者的更新,那么它就会连续更新多次,但是如果是setState,它会进行一次合并,不会有这种负担。(这里的解决方案就是人为的去控制,避免这种多次同时更新,可以将多个action手动合并为1个action);

4,对于某个公共组件,可能多个页面需要用到,但是组件内状态较多,并且不同页面,状态差异较多,此时如果用mobx的store来管理,会存在一个问题,组件虽然unmount了,但是store并未消失,导致需要手动reset store里所有的状态,否则会混乱

mobx的思想

将响应式编程和部分函数式编程相结合,取缔传统React的命令式编程,分而治之,将组件都变成可响应的,React提供了渲染的最优方式,通过对比虚拟DOM的diff算法来减少不必要的渲染耗费,而mobx则给React提供了响应式的状态管理。

关于mobx细粒度拆分

是否所有的state我都交给mobx来管理,其实类似于redux,只有当某个状态需要多个组件(这里默认为2个及以上)公用,则将该状态放到store里去监听,然后需要引用该状态的组件通过mobx-react的inject来进行监听。

关于mobx的优化

这里我参考redux的优化,将容器组件通过mobx-react来连接需要监听的store,然后展示组件就还是通过PureComponent来进行优化,避免重复re-render。这里其实有一点考虑是,我们可以利用@observer来对展示组件需要更新的状态进行一个监听,免去shouldComponentUpdate的步骤,但是如果多挂一层监听,性能未必更优,相当于要多处理一个监听器,所以还是减少监听的个数会好些。

为什么选择mobx而不是redux

这个标题不是为了贬低redux,而是解释为什么在某些项目环境中,我不使用redux,而是使用mobx,能否使用redux?可以,只不过mobx会更让开发者舒服一些。

项目场景分析:

(待续)

===============

2019.3.7更新

这篇随笔不会再更新了,有一篇更详细的讲解mobx以及和redux还有rxjs的对比,请移步至这里

使用mobx项目开发总结(不再更新)的更多相关文章

  1. angular+ionic+cordova(实战项目开发中,持续更新自己学到的和遇到的)

    最近公司开始准备做app了,大佬选择了angular+ionic+corvoda的开发结构,但是对于刚刚才开始对angular才有一点点感觉的我,就像是被一击闷棍敲了,半天没反应过来,emmm,怎么办 ...

  2. ubuntu开发项目不能执行热更新

    当项目开发到一定成熟度,项目基本上比较大(vue,angular,react,java,php等),在Ubuntu系统环境下,我们写了代码,但是不能想Windows一样执行热更新,这是因为Ubuntu ...

  3. 从零开始学C#——不再更新,直接进入高阶教程

    从零开始学习C#不再更新,直接进入高阶教程. 入门教程,请自行谷歌.百度吧,有很多这样的教程. 编程是一件实践性很强的事情,那么接下来的文章将开始进行开发项目. 还在编程中迷茫的人们,先暂时放下一切的 ...

  4. Android 实践项目开发 总结

      Android 实践项目开发 总结 课程:移动平台应用开发实践  班级:201592  姓名:杨凤  学号:20159213 成绩:___________       指导老师:娄嘉鹏       ...

  5. Web项目开发中用到的缓存技术

    在WEB开发中用来应付高流量最有效的办法就是用缓存技术,能有效的提高服务器负载性能,用空间换取时间.缓存一般用来 存储频繁访问的数据 临时存储耗时的计算结果 内存缓存减少磁盘IO 使用缓存的2个主要原 ...

  6. 仿LOL项目开发第一天

    ---恢复内容开始--- 仿LOL项目开发第一天 by---草帽 项目源码研究群:539117825 最近看了一个类似LOL的源码,颇有心得,所以今天呢,我们就来自己开发一个类似于LOL的游戏demo ...

  7. 项目实战:BBS+Blog项目开发

    01-博客系统之功能需求 02-博客系统之表结构设计1 03-博客系统之表结构设计2 04-博客系统之表结构设计3 05-博客系统之表结构设计4 06-博客系统之表机构设计5 07-博客系统之创建系统 ...

  8. Anytime项目开发记录0

    Anytime,中文名:我很忙. 开发者:孤独的猫咪神. 这个项目会持续更新,直到我决定不再维护这个APP. 2014年3月10日:近日有事,暂时断更.希望可以会尽快完事. 2014年3月27日:很抱 ...

  9. 微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记4)支持React.js语法的Taro框架

    Taro本身实现的情况类似于mpvue,mpvue的未来展望中也包含了支付宝小程序,现在的版本中,也可以使用不同的构建命令来构建出百度小程序的支持,如第10章所示,但是现在Taro先于mpvue实现了 ...

随机推荐

  1. ubuntu下挂载物理分区到openmediavault4

    准备弄个NAS,但还没想好直接买现成,还是自己组装一台,先在虚拟机上体验下OpenMediaVault4和黑群晖.主系统是ubuntu,但刚买的时候这笔记本是装windows的,除了ubuntu的系统 ...

  2. python中网络编程之线程

    网络编程之线程 什么是线程? 程序的执行线路.每个进程默认有一条线程.线程包含了程序的具体步骤. 多线程就是一个进程中有除主线程(默认线程)外还有多个线程. 线程与进程的关系(进程包含线程,而线程依赖 ...

  3. 转载:C# socket端口复用-多主机头绑定

    什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分.这种多重绑定便称之为端口复用 ...

  4. 吴裕雄 python 机器学习——线性回归模型

    import numpy as np from sklearn import datasets,linear_model from sklearn.model_selection import tra ...

  5. python day06笔记总结

    2019.4.3 S21 day06笔记总结 一.昨日内容补充 1.列表独有功能: 1.revers 反转 例:v1 = [1,2,4,88,2] v1.revers() print(v1) 2.so ...

  6. 并发编程 process 模块的方法及运用 僵尸与孤儿

    进程创建的两种方法 Process() 继承Process 重写run方法,传参数的时候要写init,但是注意要在init方法中运行父类的init方法 Windows下写代码开启子进程时,必须写上if ...

  7. 常用vi命令

    i  在当前光标处插入字符,并进入编辑模式 o 在当前光标插入下一行 x 从当前光标处向后删除一个字符. dd 删除当前光标处所在行 :q! 强制退出不保存 :q 退出(文本有改动则警告) :w 保存 ...

  8. springboot+dubbo修改扫描路径引起端口占用的问题

    因为在多模块项目中引入了spring security,消费方(控制层)的工程有两个包,一个controller,一个config.引入之前消费方工程的application.properties中s ...

  9. java第七章集合框架

    如果想存储多个人物信息可以使用数组实现但是采用数组存以下明显缺陷: 数组长度不变不能适应元素变化情况,若存储大于20个英雄信息则长度不够,若只存储10个则造成内存空间浪费.可用.length获取数组中 ...

  10. Linux samba服务搭建

    实验准备: 准备两台机器,server0(172.25.0.11)和deskop0(172.25.0.12),要求在server0上实现samba共享,在desktop0上访问共享. 1.允许mark ...