直接使用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))
}
}

最新文章

  1. SSM整合(三):Spring4与Mybatis3与SpringMVC整合
  2. 【Win10 UWP】QQ SDK(一):SDK基本使用方法
  3. php对mysql数据库简单连接操作
  4. hdu 2594 Simpsons’ Hidden Talents KMP
  5. 蓝桥杯 2015年省赛最后一题 生命之树(树形dp)
  6. iOS 复杂动画之抽丝剥茧
  7. Linux系统编程(11)——进程间通信之有名管道
  8. 《JavaScript 闯关记》之函数
  9. URAL 1056(树形DP)
  10. linux 下rabbitmq 安装
  11. MD5加密工具
  12. JavaScript引用类型之Array类型API详解
  13. css 清楚浮动的几种方式
  14. PID25 / 合并果子 ☆
  15. hive on spark配置
  16. Python递归函数介绍
  17. Linux下编辑、编译、调试命令总结——gcc和gdb描述
  18. strlen函数细节
  19. Vue系列之 => 钩子函数生命周期
  20. 【转】类找不到总结java.lang.ClassNotFoundException

热门文章

  1. lesson 16 Mary had a little lamb
  2. 逆波兰表达式[栈 C 语言 实现]
  3. 【20180807模拟测试】t1 function
  4. Appium ——Android KEYCODE键值:
  5. Turtlebot
  6. LeetCode 95——不同的二叉搜索树 II
  7. struts2之form标签theme属性详解
  8. Centos6配置开启FTP Server
  9. POJ 1113 Wall(计算几何の凸包)
  10. Nodejs第一天-{Nodejs基础 深刻理解浏览器 环境变量 基础语法}