react 框架下的状态管理管理
1、主要方案
1.1、hooks
优:函数式、代码简单易追踪、可复用。
缺:缺乏全局共享状态的处理方案。可以用 useReducer+ useContext 模拟,但并不是最简单的操作,而且复杂的异步交互场景还是需要业务自己想办法解决。
1.2、redux 相关的生态
redux 是数据流管理库,可脱离 react 使用,react 架构项目需要结合 react-redux 使用。库的使用人员在开发中遇到了各种问题,开放的生态出现了各种中间件或封装。如:
1.2.1中间件类型:
1.2.1.1修改 action 或 payload 类型来完成异步处理的中间件:
a. redux-thunk 支持 dispatch 传入函数。从而达到函数中进行异步数据流处理。最简单易上手。
b. redux-promise-middleware dispatch payload 支持 promise 。异步数据流往往对应了多种响应状态,这需要我们在开发中定义多种 action 类型,fullfilled failed pending 等,该中间件可提供这个部分代码的简化能力。
c. redux-actions 仅简化、优化一些 redux 写法冗余重复的问题。
redux-thunk 和 redux-promise-middleware 用法实际上比较类似,都是触发一个 function/promise 让中间件自己决定 dispatch 真正异步数据的时机,这对于大部分场景来说已经足够了。但是对于异步情况更复杂的场景,我们往往要写很多业务代码,如防抖、节流、取消、竞态等问题。总结:理解简单,上手成本低,无法处理复业务场景。
1.2.1.1响应式的中间件:
c. redux-saga 基于 gennerator,更细粒度,更方便的处理异步任务,对 redux 的处理提供了封装后的 api。 对一些并发时序等异步场景提供了丰富的 api。last、cancel 等都是常用的场景 。相对来说上手难度大于前面的。
d.redux-observable 基于 RxJS 实现. 处理复杂异步场景更优雅,代码更简洁。需要先学习 rxjs 。上手难度更大。
1.2.2 封装类型:
1.2.2.1dva:
dva 首先是一个基于 redux 和 redux-saga 的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-router 和 fetch,所以也可以理解为一个轻量级的应用框架。所以并不是一个单纯的数据流管理相关的库。
ddva = React-Router + Redux + Redux-saga
1.2.2.2 rematch:
rematch在redux的基础上构建并减少了样板代码和执行了一些最佳实践。主要是写法上的简化,复杂异步场景支持不了。
对比:https://rematch.netlify.app/#/inspiration
1.3 mobx
类似 vuex 原理,项目代码参考https://github.com/rwieruch/favesound-mobx
也是没有复杂异步流的api
2.其他业界选型参考:
老项目对 redux 加 hooks 混合使用没有问题。但老项目更换 redux 中间件的成本过大,不建议更换。
新项目建议 hooks 写,redux 数据流相关的库很多,各有利弊,按场景选择即可。
hooks 和 redux 相关的库并不是一个冲突的选项。
大部分业务并不一定要 redux 。比如驼峰类的后台管理系统,其实就不需要 redux。
序号方案公司问题优点
1hooks + context小米全局用 useContext 和 useReducer 符合函数式,但并不比 redux 方便
不提供处理复杂异步流的 api。
简单
2hooks + context + rxjs 封装 useObeserver头条rxjs 封装 useObeserver 支持复杂数据流处理,但是封装是成本,可以调研有没有开源的。适用场景多。
3dva + hooks腾讯用被多层封装的框架,意味着过度依赖于框架的维护。
并不适用于 mrn 项目,因为路由层就已经不支持。有为 rn 另起一个项目。但是使用量很低。https://github.com/nihgwu/react-native-dva-starter
简单。
适用场景多(不适用于 mrn)。
4hooks + redux + promise-middleware(老项目)目前比较流行的 redux 相关库使用还是 saga 偏多,基础中间件不能处理复杂异步情况。
代码冗余。
非函数式。
不提供处理复杂异步流的 api。
不建议选择。
5rematch + hooks 不提供处理复杂异步流的 api。简单
6redux-saga + hooks写法略复杂。
学习成本高。
适用场景多。
7mobx + hooks
3、参考: