View on GitHub

Cycle263 Blog

Stay hungry, stay foolish.

dva

基于 redux,react-router,redux-saga 进行了上层封装,简化 redux 的写法,提升开发效率。

dva流程

解决多组件 state 共享问题,出现了 context,但过于底层没有调度管理,也不便维护,又出现了 redux、mobx 等。

redux 的痛点,对异步 action 有心无力,接着出现了 redux-thunk、redux-promise、redux-actions、redux-saga 等,中间件都能解决了异步问题。

但是 redux-saga 写法也很麻烦,watch 后还需要 fork,添加一个 async action 需要改动很多文件,而 dva 就是要解决这个麻烦。

// 最原始的redux写法
├── actions/
    ├── login.js
    ├── user.js                                         └── components/
└── api/                                                    |── login
    ├── login.js                                            |── user
    ├── user.js                                         └── consts/
└── components/                                             |── login
    ├── login.js            == 改进的docks写法 ==>            |── user
    ├── user.js                                         └── containers/
└── reducers/                                               |── login
    ├── login.js                                            |── user
    ├── user.js                                         |── ducks.js
└── consts/
    ├── login.js
    ├── user.js

每次改动都需修改四五个文件,后来社区为了避免这样的问题制定文件规范,推出了 ducks-modular-redux 规范,将每个子 module 的文件都放置到 docks.js 里,这样大大简化了日常开发中一些冗余工作。


saga

async action 是 function,灵活但是形式各异,难以维护

effects 使用 Generator

async action 流程无法取消

数据业务逻辑掺杂在 action 里

// 未用dva的redux-saga
├── actions/
    ├── login.js
    ├── user.js
└── reducers/                                             |── reducers/
    ├── login.js                  == dva ==>                  ├── login.js
    ├── user.js                                               ├── user.js
└── sagas/
    ├── login.js
    ├── user.js

参考文档

数据流各库的对比