Rematch

作者:高天阳

邮箱:13683265113@163.com

更改历史

* 2019-08-22        高天阳    初始化文档

背景

redux存在的问题

  • 项目中redux的样板文件太分散,书写和维护都比较麻烦

  • 使用thunk来处理异步操作,不是那么直观

快速开始

npm install @rematch/core

Init

init 用来配置你的 reducers, devtools & store。

index.js

import { init } from '@rematch/core'
import * as models from './models'

const store = init({
  models,
})

对于更高级的设置,查看插件Redux配置选项

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

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流程走向

最佳实践

业务逻辑实现

如下图所示,当选择公司性质为 “默认” 或者 “个人” 时候 ‘公司全称’字段是隐藏。当我们选择公司性质为“公司”时 ‘公司全称’字段展示。

默认状态:

公司性质为“公司”

这个功能该如何实现呢?

思路:

  1. 在‘公司性质’这个 select框上面绑定一个 onchange事件,每次变化 获取到当前select框 对应的值。

  2. 将获取到当前select框的值写一个接口去调用它(如果使用react, 则在 reducer里面定义),并将每次返回的值在传递给前端页面;

  3. 根据接口返回的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数据流的管理方案:Dvamirrorrematch

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?