1.为什么要使用redux或者mobx?
2.为什么不使用react自身提供的context?
1.写法繁琐
2.组件之间的依赖关系变得复杂,但是React为我们提供的这个api还是可以看到它自身还是想弥补其状态管理的短板的
第三方状态管理库就是为了解决以上痛点
3.redux和mobx区别?
1.Redux的编程范式是函数式的而Mox是面向对象的;
2.因此数据上来说Redux理想的是immutable( immutable对象是不可直接赋值的对象,它可以有效的避免错误赋值的问题),每次都返回一个新的数据,而Mobx从始至终都是一份引用。因此Redux是支持数据回溯的;
3.然而和Redux相比,使用mobx的组件可以做到精准更新,这一点得益于Mobx的observable;对应的Redux是用dispath进行广播,通过Provider和connect来比对前后差别控制更新粒度;Mobx更加精细,MobX背后的哲学很简单:任何源自应用状态的东西都应该自动地获得。
redux的数据流向
触发action,匹配到对应的reducer, 修改store中的数据,store中的数据发生改变,触发render方法,重新渲染页面UI
mobx的数据流向
触发action,在action中修改state,通过computed拿到state的计算值,自动触发对应的reactions,这里包含autorun,渲染视图等。有一点需要注意:相对于react来说,mobx没有一个全局的状态树,状态分散在各个独立的store中。mobx的工作原理非常简单,使用Object.defineProperty来拦截对数据的访问,一旦值发生变化,将会调用react的render方法来实现重新渲染视图的功能或者触发autorun等。Mobx的核心原理是通过action触发state的变化,进而触发state的衍生对象(computed value & Reactions)
redux全局存在一个store进行状态管理(集中式管理)
mobx存在多个store进行状态管理(每个组件都可以定义成单独的store)
mobx相对于redux来说,代码会简洁很多,因为不用写工程化模版,
相较于redux中使用middleware来处理异步,mobx中不需要那么复杂,只需要使用async/await来优雅的处理异步的逻辑
mobx中推荐使用单例模式来管理各种数据流,就像上面的Apple类 ,封装了可观察值的属性以及对应的操作逻辑,然后new一个实例并导出
在react中使用mobx,可以不需要操作state或props,直接赋值给类的属性即可
结论
- Redux要解决的问题是统一数据流,数据流完全可控并可追踪。要实现该目标,便需要进行相关的约束
- Redux由此引出dispatch action reducer等概念,对state的概念进行强约束,然而对于一些项目来说,太过强,便失去了灵活性。Mobx便是填补此空缺的
- redux将数据保存在单一的store中,mobx将数据保存在分散的多个store中
- redux使用plain object保存数据,需要手动处理变化后的操作;mobx使用observable保存数据,数据变化后自动处理响应的操作
- redux使用不可变状态,这意味着状态是只读的,不能直接去修改它,而是应该返回一个新的状态,同时使用纯函数;mobx中的状态是可变的,可以直接对其进行修改
- mobx相对来说比较简单,在其中有很多的抽象,mobx更多的使用面向对象的编程思维;redux会比较复杂,因为其中的函数式编程思想掌握起来不是那么容易,同时需要借助一系列的中间件来处理异步和副作用
- mobx中有更多的抽象和封装,调试会比较困难,同时结果也难以预测;而redux提供能够进行时间回溯的开发工具,同时其纯函数以及更少的抽象,让调试变得更加的容易
- 使用mobx的react 感觉很像vue