这年头,Redux 状态管理框架满天飞,前几天在网上闲逛偶然又发现 Rematch、Mirror、Smox、Xredux,都用了一下,发现都是套瓷娃娃,大同小异,拿几个比较历害的来说:
无非就是类似这样的:
model({
state: ...,
reducers: {
aaa(playload)
bbb(playload)
},
effects: {
ccc(playload)
ddd(playload)
}
})
复制代码
审美疲劳了?H 起来,给大家推荐一款小鲜肉
React-coat
:
项目地址: github.com/wooline/rea…
class ModuleHandlers extends BaseModuleHandlers {
@reducer
public aaa(playload): State {...}
@reducer
private bbb(playload): State {...}
@effect("ajaxLoading")
public async ccc(playload) {...}
@effect("loginLoading")
private async ddd(playload) {...}
}
复制代码
spring 风格?ng 风格?
可能你会说,用 Class 呀,不喜欢,我喜欢 FP 风格。我想说,这是状态管理框架非 React UI 框架,不要为了流行 FP 就皆 FP,就象当年 JS 流行面向对象编程,把面向过程说成洪水猛兽。
武装到牙齿的 TS 类型反射
React-coat 全面拥抱 Typescript,直接上图:
action 调用时的类型反射:
动态加载模块时的类型反射:
Store State 结构的类型反射:
连路由参数也有类型反射:
支持单页 SPA 和服务器渲染 SSR 同构
- 而且 SSR 在开发时也可以享受:“热更新”
- 还支持 SPA(单页) + SSR(服务器渲染)一键切换。
打开项目根下的./package.json,在"devServer"项中,将 ssr 设为 true 将启用服务器渲染,设为 false 仅使用浏览器渲染
关于服务器渲染SSR请移步另一篇文章: juejin.im/post/5c7f6e…
强大而便捷的 Dispatch Action
对比一下各大框架 Dispatch Action 的语法:
// Dva中
yield put({type: 'moduleA/increment', payload: 2});
// Rematch中
dispatch.moduleA.increment(2);
// Mirror中
actions.moduleA.increment(2);
// React-coat中
import moduleA from "modules/moduleA/facade";
...
await this.dispatch(moduleA.actions.increment(2));
复制代码
-
语法简洁性上,Dva 用的 saga 中的 yield put,还要写 type 和 payload,最繁琐。其它三款都直接用方法调用,更简洁。
-
Rematch 和 Mirror 等于把所有 action 都放到一个全局变量中去了,而 React-coat 去中心化 ,按需引入 moduleA,
更利于系统保持松散结构
。 -
从语义上来说 React-coat 依然显示的保留 dispatch 关键字,
moduleA.actions.increment(2)
返回的是依然是 Action,dispatch(action)
作为 Redux 的基本理念得到完整的保持,Rematch 和 Mirror 已经变成传统的 MVC 了。 -
从功能上,只有 Dva 和 React 支持
同步 effect
。其它两款都不支持,或者是我没发现?什么是同步 effect?例如:- query 会触发一个 effect,updateState 会触发一个 reducer
- updateState 需要等待 query 执行完后再 dispatch
// Dva中使用 saga 的 put.resolve 来支持同步 effect