直接使用redux,要写很多样板代码,大量的actiontype,actionCreator。
一个异步的方法要写三个actiontype,三个actionCreator,十分繁琐。
下面是本人使用的一种简化写法,使用数组动态生成一些action和actionCreator,具有参考价值。

action-type.js

export const asynctypes = [
'getCateList',
'getArticleList',
'searchArticles',
'getArticleDetail',
] export const synctypes = [
'@@router/LOCATION_CHANGE'
] export const types = {}; asynctypes.forEach(item => {
types[item + '.start'] = item + '.start';
types[item + '.ok'] = item + '.ok';
types[item + '.error'] = item + '.error';
}); synctypes.forEach(item => {
types[item] = item;
});

synctypes生成同步的actiontype,asynctypes生成异步的actiontype,字符串只在数组中声明一次,减少书写量

action.js

import {asynctypes} from './action-type';
import {createAction} from 'redux-actions'; function fCreateActionsAsync(aType,fCreateAction){
const oResult = {};
aType.forEach(item => {
oResult[item + 'Start'] = fCreateAction(item + '.start');
oResult[item + 'Ok'] = fCreateAction(item + '.ok');
oResult[item + 'Error'] = fCreateAction(item + '.error');
});
return oResult;
} export default fCreateActionsAsync(asynctypes,createAction);

导出的是通过asynctypes生成的三个actionCreator的集合,此集合可以直接在bindActionCreators函数中直接使用,
在组件中可以直接调用生成的action方法:

组件article.jsx

import acts from 'index/redux/actions';

export default connect(
(state,props) => { return {data: state.article.data,currentCate:fCurrentCate(state,props)} },
dispatch => { return {actions: bindActionCreators(acts,dispatch)} }
)(Article);

在组件中使用actions.getCateListStart就可以开始一个异步调用了。

start是个开始,项目中使用了redux-saga来自动唤起下面的异步调用,异步完成后自动调用ok或error的action。

//根saga中监控所有的异步调用
export default function* rootSaga(){
yield [
fork(wacthArticleDetail),
fork(watchCateList),
fork(watchActicleList),
fork(watchSearchAtricles)
]
}
//监控到异步start调用,自动唤起异步调用
function* wacthArticleDetail(){
yield takeEvery(actions.getArticleDetailStart,fGetArticleDetailAsync);
} //异步调用结束自动唤起Ok或者error的action
function* fGetArticleDetailAsync(action) {
try{
const articleId = action.payload.articleId;
const article = yield call(getArticleDetail,articleId);
yield put(actions.getArticleDetailOk(article));
}
catch(err){
yield put(actions.getArticleDetailError(err))
}
}

redux样板代码简化写法的更多相关文章

  1. react第十八单元(redux中间件redux-thunk,redux工程目录的样板代码,规范目录结构)

    第十八单元(redux中间件redux-thunk,redux工程目录的样板代码,规范目录结构) #课程目标 中间件:中间件增强redux的可扩展性,实现功能复用的目的. redux-thunk异步逻 ...

  2. 学习Redux之分析Redux核心代码分析

    1. React,Flux简单介绍 学习React我们知道,React自带View和Controller库,因此,实现过程中不需要其他任何库,也可以独立开发应用.但是,随着应用程序规模的增大,其需要控 ...

  3. python多行代码简化

    python中,可以把多行代码简化为一行,把for循环和if条件判断都集中到一行里来写,示例如下: >>> from nltk.corpus import stopwords > ...

  4. HTML代码简写法:Emmet和Haml

    http://www.ruanyifeng.com/blog/2013/06/emmet_and_haml.html?bsh_bid=657901854 HTML代码简写法:Emmet和Haml   ...

  5. Hibernate事务代码规范写法

    ----------------siwuxie095 事务相关概念 1.什么是事务 逻辑上的一组操作,构成这组操作的各个单元,要么一起成功, 要么一起失败 2.事务的四个特性 1)原子性 2)一致性 ...

  6. 列表查询组件代码, 简化拼接条件SQL语句的麻烦

    列表查询组件代码, 简化拼接条件SQL语句的麻烦 多条件查询

  7. Py基础—变量名,条件循环,空执行,编码,运算符,字符比较,简化写法

    变量名 只能是字母,数字,下划线.数字不能开头,不要和python内置的东西重复.赋予变量名内容:name1 = "shit" 输出变量名内容 print(name1) 条件语句 ...

  8. mybatis 04: mybatis对象分析 + 测试代码简化 + 配置优化

    MyBatis对象分析 测试代码示例 package com.example.test; import com.example.pojo.Student; import org.apache.ibat ...

  9. 提高Objective-C代码质量心机一:简化写法

    提高OC代码质量的小心机 一.OC特性 OC 为 C 语言添加了面向对象特性,是其超集; OC 使用动态绑定的消息结构,也就是,在运行时才会检查对象类型; 接收一条消息后,究竟应执行何种代码,由运行期 ...

随机推荐

  1. 「日常训练」 Genghis Khan the Conqueror(HDU-4126)

    题意 给定\(n\)个点和\(m\)条无向边(\(n\le 3000\)),需要将这\(n\)个点连通.但是有\(Q\)次(\(Q\le 10^4\))等概率的破坏,每次破坏会把\(m\)条边中的某条 ...

  2. JS获取HTML DOM元素的8种方法

    什么是HTML DOM 文档对象模型(Document Object Model),是W3C组织推荐的处理可扩展置标语言的标准编程接口.简单理解就是HTML DOM 是关于如何获取.修改.添加或删除 ...

  3. Lua学习笔记(1): HelloWorld和数据类型

    Lua是一个轻量级的脚本语言,由c语言编写,容易嵌入到应用中,深受游戏开发者的青睐 环境安装 选用SciTE作为lua的IDE 可以在github找到这个开源的软件 SciTE下载链接 安装好之后打开 ...

  4. 「雅礼集训 2017 Day1」市场 (线段树除法,区间最小,区间查询)

    老师说,你们暴力求除法也整不了多少次就归一了,暴力就好了(应该只有log(n)次) 于是暴力啊暴力,结果我归天了. 好吧,在各种题解的摧残下,我终于出了一篇巨好看(chou lou)代码(很多结构体党 ...

  5. kosaraju求强连通分量

    在了解kosaraju算法之前我们先了解一下什么是强连通分量,在有向图中如果两个定点vi,ui存在一条路劲从vi到达ui且也存在一条路劲从ui到达vi那么由ui和vi这两个点构成的图成为强连通图,简洁 ...

  6. RL_Learning

    Key Concepts in RL 标签(空格分隔): RL_learning OpenAI Spinning Up原址 states and observations (状态和观测) action ...

  7. 头文件#ifndef #define #endif使用

    想必很多人都看过“头文件中的 #ifndef #define #endif 防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件 ...

  8. appcan打包后产生的问题总结

    以appcan为基础的项目,最终需要打包后进行调试.在调试过程中,主要的样式问题在苹果手机上,下面将这些问题总结起来,以防下次再犯. 1:ios 7 以上的手机中,状态栏与内容重叠: 问题描述:在io ...

  9. Python为什么会打印两个\

    在Python里面,如果\后面不是一个合法的转移字符,那么,Python会打印两个\,换句话说,Python将\也当成普通字符看待,而不是转义符的标志: >>>S = 'C:\py\ ...

  10. Thunder团队第六周 - Scrum会7

    Scrum会议7 小组名称:Thunder 项目名称:i阅app Scrum Master:杨梓瑞 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传 ...