redux 基础模式
基础 redux 的完整模式为:
dispatch action -> redux middlewares -> reducers -> global state -> components
该模式存在如下问题:
多文件:一个
dispatch
动作从发起到被reducer
接收,期间通过某个具体的action type
进行指令的传递。在传统的redux
架构中,action type
、action creator
和reducer
可能会散落在多个文件中,对于大型项目,这种 redux 架构会给开发者带来额外的开发和维护成本;在 Ducks 架构中,action type
、action creator
和reducer
虽然被分配在同一个文件中,但是三者仍然是割裂的,需要通过开发者定义的action type
来串联,这些action type
对于react
来说又是无感知的,建议移除action type
的概念,同时将action creator
和reducer
结合起来使用。dispatch
绑定:在使用connect
的过程中,往往需要开发者通过mapDispatchToProps
手动绑定dispatch
函数和从别处引入的action creator
,这种操作十分繁琐,更好地方式是在mapDispatchToProps
中允许开发者按需加载已经绑定dispatch
函数的action creator
。
|
|
reducer
描述形式:redux
官方规定reducer
必须是一个纯函数,reducer
可根据接收到的不同action type
来计算新的state
。比起在纯函数中使用复杂的switch-case
和if-else
语句, 用对象的形式描述reducer
,从代码层面看显然更加语义化,编写也更加简单。
|
|
payload
字段规范:reducer
接收的action
参数中包含有开发者期望传入的参数,redux
官方建议遵守FSA
规范,但在实际使用时,redux
并未强制使用该规范,但对一个项目而言,统一字段有利于项目的维护,而action type
比较鸡肋,可以不予考虑,error
和meta
字段可以统一称为payload
,因此上述例子中reducer
接收的参数最好强制为是payload
。
|
|
- 异步处理:
dispatch action
可以划分为两类,同步action
和异步action
,异步action
本质也是在不同时机发出同步action
|
|
- 领域建模:
redux
本身是一套状态管理机制,并不支持与后端进行交互,因此需要用户自己去定义请求方式将请求与redux
结合起来使用。由于前端缺少类似后端的service
层和领域层,对于某个请求,常规的做法是定义一个请求函数,然后在redux
或者react
中去引用并调用该函数,这么做很多情况下比较繁琐,语义化差且不利于对后端的业务逻辑进行建模,这里提供一种redux
结合领域的方式:通过一份配置meta
文件去描述后端的领域模型DM
,然后将DM
注入到effects
。
|
|
- immutable侵入:前端项目普遍使用了
immutable
库,immutable
对项目侵入程度比较大,使用方式又与原生的 js 类型操作有很大异同,加上繁琐的 fromJS 和 toJS 操作,会在一定程度上提升开发成本,可以考虑用immer
替换并集成到redux
的底层使用。