邮箱:13683265113@163.com
更改历史
* 2019-08-22 高天阳 初始化文档
redux存在的问题
项目中redux的样板文件太分散,书写和维护都比较麻烦
npm install @rematch/core
init 用来配置你的 reducers, devtools & store。
index.js
import { init } from '@rematch/core'
import * as models from './models'
const store = init({
models,
})
对于更高级的设置,查看插件和Redux配置选项。
该model促使state, reducers, async actions 和 action creators 放在同一个地方。
models.js
查看reducer文档以了解更多信息,包括如何从其他 modal 触发 actions。
理解模型与回答几个问题一样简单:
我如何处理异步 action? effects with async/await
dispatch 是我们如何在你的model中触发 reducers 和 effects。 Dispatch 标准化了你的action,而无需编写action types 或者 action creators。
Dispatch 能被直接调用,或者用 dispatch[model][action](payload)简写。
对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配置。
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报错)
修改reducers的入口文件
如果老项目中没有使用redux,可以使用yarn remove thunk删除thunk的依赖和reducers这个文件夹, 并且在init初始化的时候可以不用传redux这个配置。如果接入rematch,需要锁定版本, rematch中引入的redux版本为4.0.0,所以老项目中的
Redux DevTools 要升级到最新版,2.16.0有bug
基于redux数据流的管理方案:Dva、mirror和rematch
Dva是蚂蚁金服开源的一个数据流管理方案,基于redux和redux-saga,简化了开发体验。 Dva是一揽子的解决方案,可以使用侵入性很强的dva-cli来快速搭建项目,提供了路由层面的适配; 也可以使用dva-core来引入核心的代码,减少侵入性。
如果使用Dva的一整套框架,现有的项目会有较大的改动
Dva使用redux-saga来处理异步,学习成本比较高
mirror类似于Dva的一个redux数据流方案,最新一次更新在两个月之前,一直没有发布1.0的版本
rematch的灵感来自于Dva和mirror,将两者的有点结合了起来。
使用了类似Dva的model文件结构,统一管理同步和异步操作
通过中间键实现了async/await的方式来处理异步,舍弃了Dva中的redux-saga
将model中reducers和effects的方法挂载在dispatch函数上,造成dispatch既是一个函数,又是一个对象
14.9k(gzipped: 5.1k)
redux + thunk: 6k(2k)
dva-core: 72.6k(gzipped: 22.5k)