不吹不黑,redux蛮好用。只是有时略显繁琐,叫我定义每一个action、action type、使用时还要在组件上绑定一遍,臣妾做不到呀!下面分享一种个人比较倾向的极简写法,仍有待完善,望讨论。

github: github.com/liumin1128/…

基于redux、async/await、无侵入、兼容性良好的异步状态管理器。

install

npm i -S redux-effect// or
yarn add redux-effect
复制代码

use

import { createStore, applyMiddleware, combineReducers } from 'redux';
import { reduxReduers, reduxEffects } from 'redux-effect';const models = [ test1, test2, ...];const reducers = combineReducers(reduxReduers(models));
const middlewares = [ reduxEffects(models) ];const store = createStore(reducers,initialState,middlewares);
复制代码

从代码可以看出,从reduxReduers, reduxEffects中得到的就是标准的reducer和middleware,完美兼容其他redux插件,也可以轻松整合进老项目中。

完整例子:example

model

在redux-effect中,没有action的概念,也不需要定义action type。

所有关于某个state的一切声明在一个model中,本质就是一个对象。

export default {namespace: 'test',state: { text: 'hi!' },reducers: {save: (state, { payload }) => ({ ...state, ...payload }),clear: () => ({})},effects: {fetch: async ({ getState,dispatch }, { payload }) => {await sleep(3000);await dispatch({ type: 'test/clear' });await sleep(3000);await dispatch({ type: 'test/save', payload: { text: 'hello world' } });}}
};复制代码

namespace:

model的命名空间,对应state的名字,必填,只接受一个字符串。

state:

state的初始值,非必填,默认为空对象

reducers:

必填,相当于同步执行的action方法,接受两个参数state和action,合并后返回新的state状态值。

effects:

非必填,相当于异步执行的action方法,接受两个参数store和action,store里包括redux自带的getState和dispatch方法,action为用户dispatch时带的参数。

dispatch

这里的dispatch就是redux中的dispatch,但有几个约定。

  1. 不传定义好的action,而是直接传一个普通对象。
  2. type的组织形式:namespace + '/' + reducer或effect方法名
  3. 参数的传递:需要合并的参数用payload包裹

定义每一个action,并将其绑定到视图层过于繁琐,去action化则让事件的触发变的灵活。

普通事件

发送事件时,不区分同步还是异步,只管dispatch,一切都已在model中定义好。

// 同步
dispatch({ type: 'test/save', payload: { text: "hello world" } })
// 异步
dispatch({ type: 'test/fetch' })
复制代码

等待

等待一个事件完成再执行逻辑,dispatch方法是可以被await的,十分轻松。

async function test() {await dispatch({ type: 'test/fetch' })await console.log('hello world')
}
复制代码

回调

等待某个事件,再执行外部定义的某个回调函数,只需要在action字段里加上callback方法,在effect中调用即可。

相比较await,回调可以拿到某些返回值,也可以在effect流程的中间部分执行。


dispatch({ type: 'test/fetch', callback1, callback2 }){effects: {fetch: async ({ getState,dispatch }, { payload, callback, callback2 }) => {const state = await getState()await sleep(3000);await callback1(state)await sleep(3000);await callback2(state)}}
}
复制代码

自定义reducer

reducer其实就是redux中的reducer,用法完全一样。比如定义一个push方法,将后续数据,压入到原有数据后面,可以这样写。

export default {namespace: 'test',state: { data: [] },reducers: {save: (state, { payload }) => ({ ...state, ...payload }),clear: () => ({}),push: (state, { payload = {} }) => {const { key = 'data', data } = payload;return { ...state, [key]: state[key].concat(data) };}},
};
复制代码

自定义effect

effect其实就是一个普通async函数,接受store和action两个参数,可以使用async/await,可以执行任意异步方法,可以随时拿到state的值,可以dispatch触发另一个effect或者reducer。

loading

也许你会想监听某个effect,拿到loading状态,以便在ui给用户一个反馈。一般情况下监听一个异步方法,只需要在effect的开头和结束,各自设定状态即可,与常规写法无异。

但这里也提供一种model级别的loading状态,新增一个名为loading的model,再使用reduxEffectsWithLoading包裹需要监听的model即可。

关于model-creator

以上所做的事情,是将redux核心规范为model,得到了统一且可以复用的数据模型,这为自动生成model创造了可能性,如果能通过工厂模式,自动化创建具有类似功能,且可以随意装配的model,一切将变得更加美好。

Coming Soon

优雅的redux异步中间件 redux-effect相关推荐

  1. Redux异步中间件

    曾经前端的革新是以Ajax的出现为分水岭,现代应用中绝大部分页面渲染会以异步流的方式进行.在Redux中,如果要发起异步请求,最合适的位置是在action creator中实现.但我们之前了解到的ac ...

  2. redux异步action_React躬行记(12)——Redux中间件

    Redux的中间件(Middleware)遵循了即插即用的设计思想,出现在Action到达Reducer之前(如图10所示)的位置.中间件是一个固定模式的独立函数,当把多个中间件像管道那样串联在一起时 ...

  3. Redux 异步数据流-- thunk中间件源码解析

    Thunk 引入背景 这是一个关于Redux异步数据流的故事.引入thunk中间件的完整故事在Redux官方中文文档异步数据流.一句话总结就是:原生Redux只支持同步数据流,所以需要引入中间件(mi ...

  4. 精益 React 学习指南 (Lean React)- 3.4 掌控 redux 异步

    书籍完整目录 3.4 redux 异步 在大多数的前端业务场景中,需要和后端产生异步交互,在本节中,将详细讲解 redux 中的异步方案以及一些异步第三方组件,内容有: redux 异步流 redux ...

  5. redux异步之redux-thunk

    简介 redux-thunk是redux官方退出的一个异步中间件,thunk表示延迟计算的意思 使用中间件之后,我们可以再action构造器中返回一个函数,而不是一个对象 使用 下载 npm inst ...

  6. Redux异步解决方案之Redux-Thunk原理及源码解析

    前段时间,我们写了一篇Redux源码分析的文章,也分析了跟React连接的库React-Redux的源码实现.但是在Redux的生态中还有一个很重要的部分没有涉及到,那就是Redux的异步解决方案.本 ...

  7. redux异步action_Redux数据状态管理

    Redux 中文文档(https://www.redux.org.cn/) Redux入门教程(快速上手)(https://segmentfault.com/a/1190000011474522?fr ...

  8. 学习 redux 源码整体架构,深入理解 redux 及其中间件原理

    如果觉得内容不错,可以设为星标置顶我的公众号 1. 前言 你好,我是若川.这是学习源码整体架构系列第八篇.整体架构这词语好像有点大,姑且就算是源码整体结构吧,主要就是学习是代码整体结构,不深究其他不是 ...

  9. React学习笔记——redux里中间件Middleware的运行机理

    1.前言 上篇文章中,我们详细介绍了redux的相关知识和如何使用,最后使用中间件Middleware来帮助我们完成异步操作,如下图 上面是很典型的一次 redux 的数据流的过程,在增加了 midd ...

最新文章

  1. Playboy封面女郎、互联网第一夫人,程序员们的“钢铁审美”
  2. 深入研究 System.out.println()
  3. 一个很好的 emacs 配置文件范例
  4. 清华唐杰:GPT-3表示能力已经接近人类了,但它有一个阿喀琉斯之踵 | MEET 2021...
  5. 八十八、从斐波那契数列和零一背包问题探究动态规划
  6. 23种设计模式----------代理模式(一)
  7. 在centos7上设置swap交换空间
  8. asp怎么循环增加字段和字段对应的值_索引该怎么创建?
  9. js中常用方法以及document.readyState 判断页面是否加载完成 complete和interactive
  10. python输出欢迎某某某_Python基础中所出现的异常报错总结,python基础总结
  11. ace admin日期控件 中文显示
  12. 代码不规范,亲人两行泪——DTO
  13. 云孚开源情报系统YFINT
  14. DISCUZ论坛管理员密码破解
  15. js把数字金额转换成中文大写数字
  16. 【图示】AppleID绑定支付宝的方法
  17. 创灵原始与鸿蒙,上古启示录
  18. mac ios 远程桌面连接到服务器配置,手把手教你苹果mac如何远程桌面连接
  19. [前端积累]--响应式布局(三)
  20. 暴雪和黑客的战争二:暴雪的第一击

热门文章

  1. qt获取QString中第一个汉字
  2. qt中根据数据解析的结果动态的创建控件并布局
  3. BugkuCTF-MISC题做个游戏
  4. BugkuCTF-MISC题有黑白棋的棋盘
  5. CTF-Bugku逆向题Android方法归纳
  6. 浅析Linux开发工具之Makefile
  7. 征途2无法显示服务器列表,解决win10系统玩征途2提示“DriverCommlnit驱动加载失败”的方法...
  8. input css年月日,input标签的type为date,显示的日期格式样式更改
  9. php5.0相等,关于php:3个相等
  10. php session页面传值,PHP session在页面间传递的问题