Rematch
作者:高天阳
邮箱:13683265113@163.com
更改历史
* 2019-08-22 高天阳 初始化文档背景
redux存在的问题
项目中redux的样板文件太分散,书写和维护都比较麻烦
使用thunk来处理异步操作,不是那么直观
快速开始
npm install @rematch/coreInit
init 用来配置你的 reducers, devtools & store。
index.js
import { init } from '@rematch/core'
import * as models from './models'
const store = init({
models,
})Models
该model促使state, reducers, async actions 和 action creators 放在同一个地方。
models.js
查看reducer文档以了解更多信息,包括如何从其他 modal 触发 actions。
理解模型与回答几个问题一样简单:
我的初始 state 是什么? state
我如何改变 state? reducers
我如何处理异步 action? effects with async/await
Dispatch
dispatch 是我们如何在你的model中触发 reducers 和 effects。 Dispatch 标准化了你的action,而无需编写action types 或者 action creators。
Dispatch 能被直接调用,或者用 dispatch[model][action](payload)简写。
View
Todos: React
API
init
对rematch进行初始化,返回一个store对象,包含了使用redux初始化store对象的所有字段。
models: { [string]: model }
一个对象,属性的键作为rootState上的的键
model.state: any
用来初始化model
model.reducers: { [string]: (state, payload) => any }
一个对象,属性是用来改变model state的方法,第一个参数是这个model的上一个state, 第二个参数是payload,函数返回model下一个state。这些方法应该是纯函数。
model.effects: { [string]: (payload, rootState) }
一个对象,异步或者非纯函数的方法放在这个对象中,可以与async/await一起使用
redux
通过这个属性,可以兼容老项目中的redux配置。
plugins
rematch是一个插件系统,通过这个字段可以配置第三方的插件。
redux流程:

rematch流程:

示例
简单示例
index.js
App.js
复杂数据结构
一般来讲state中的数据结构是以对象的形式存储的,因为不只存储一个数据,那么例子需要作出适当调整
index.js
app.js
仿v-if、v-show效果展示
component.js
rematch功能划分

rematch流程走向

最佳实践
业务逻辑实现
如下图所示,当选择公司性质为 “默认” 或者 “个人” 时候 ‘公司全称’字段是隐藏。当我们选择公司性质为“公司”时 ‘公司全称’字段展示。
默认状态:

公司性质为“公司”

这个功能该如何实现呢?
思路:
在‘公司性质’这个 select框上面绑定一个 onchange事件,每次变化 获取到当前select框 对应的值。
将获取到当前select框的值写一个接口去调用它(如果使用react, 则在 reducer里面定义),并将每次返回的值在传递给前端页面;
根据接口返回的select的值来对应显示“公司性质”的显示或者隐藏。
代码如下:
newEdit.js — view层 — 父组件
basicForm.js — view层—子组件
edit.js — Model层
老项目接入
主要针对已经使用thunk中间键的老项目。
安装依赖,并删除依赖中的redux
yarn add @rematch/core
yarn remove redux (删除redux可能会造成eslint报错)
修改redux入口文件
修改reducers的入口文件
增加model的入口文件
如果老项目中没有使用redux,可以使用yarn remove thunk删除thunk的依赖和reducers这个文件夹, 并且在init初始化的时候可以不用传redux这个配置。如果接入rematch,需要锁定版本, rematch中引入的redux版本为4.0.0,所以老项目中的
新项目配置
bug
Redux DevTools 要升级到最新版,2.16.0有bug
同类技术比较
基于redux数据流的管理方案:Dva、mirror和rematch
Dva
Dva是蚂蚁金服开源的一个数据流管理方案,基于redux和redux-saga,简化了开发体验。 Dva是一揽子的解决方案,可以使用侵入性很强的dva-cli来快速搭建项目,提供了路由层面的适配; 也可以使用dva-core来引入核心的代码,减少侵入性。
缺点
如果使用Dva的一整套框架,现有的项目会有较大的改动
Dva使用redux-saga来处理异步,学习成本比较高
mirror
mirror类似于Dva的一个redux数据流方案,最新一次更新在两个月之前,一直没有发布1.0的版本
rematch
rematch的灵感来自于Dva和mirror,将两者的有点结合了起来。
优点
使用了类似Dva的model文件结构,统一管理同步和异步操作
通过中间键实现了async/await的方式来处理异步,舍弃了Dva中的redux-saga
提供了redux的配置项,可以兼容项目中的老代码
支持多个store
缺点
将model中reducers和effects的方法挂载在dispatch函数上,造成dispatch既是一个函数,又是一个对象
Rematch
Mirror
Dva
适用框架
所有框架 / 不使用框架
React
React
适用路由
所有路由 / 不使用路由
RR4
RR3, RR4 / 不使用路由
移动端
√
x
√
开发者工具
Redux, Reactotron
Redux
Redux
插件化
√
√
√
reducers
√
√
√
effects
async/await
async/await
redux saga
effect params
(payload, internals)
(action, state)
(action, state)
监听方式
subscriptions
hooks
subscriptions
懒加载模型
√
√
√
链式 dispatch
√
√
√
直接 dispatch
√
dispatch promises
√
√
加载插件
√
√
√
persist plugin
√
package size
14.9k(gzipped: 5.1k) redux + thunk: 6k(2k)
130.4k(gzipped: 33.8k)
dva-core: 72.6k(gzipped: 22.5k)
参考资料
Last updated
Was this helpful?