专栏名称: wooline
目录
相关文章推荐
51好读  ›  专栏  ›  wooline

React状态管理大乱斗,横向对比Dva,Rematch,Mirror

wooline  · 掘金  ·  · 2019-03-28 04:14

正文

阅读 22

React状态管理大乱斗,横向对比Dva,Rematch,Mirror

这年头,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






请到「今天看啥」查看全文