前端开发那些事儿React

react 框架下的状态管理管理

2020-11-27  本文已影响0人  good__day

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 首先是一个基于 reduxredux-saga 的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-routerfetch,所以也可以理解为一个轻量级的应用框架。所以并不是一个单纯的数据流管理相关的库。

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、参考:

https://juejin.cn/post/6844903504427892750#heading-1

https://juejin.cn/post/6844903562095362056

上一篇下一篇

猜你喜欢

热点阅读