一.什么是redux-actions

   redux-actions是一个简化action和reducer创建的一个封装库,里面有5个js文件,

   createAction.js

   handleAction.js

   handleActions.js

   index.js

   ownKeys.js

二.怎么使用?下面将从源码一一解释每个文件的的用处

  1.createAction.js

    从名字就可以看出,这是用来创建action的.其源码如下:

      

  1. /**
  2. * 参数不是function调用此函数
  3. */
  4. function identity(t) {
  5. return t;
  6. }
  7.  
  8. /**
  9. * 创建action
  10. * @param type action的类型
  11. * @param actionCreator 需要创建的action,函数
  12. * @param metaCreator action的属性
  13. * @returns {Function}
  14. */
  15. export default function createAction(type, actionCreator, metaCreator) {
  16. /**
  17. * finalActionCreator最终创建的action,
  18. * 判断传进来的参数是不是function,true返回这个函数,false调用identity函数
  19. */
  20. const finalActionCreator = typeof actionCreator === 'function'
  21. ? actionCreator
  22. : identity;
  23. /**
  24. * 返回一个匿名函数
  25. */
  26. return (...args) => {
  27. /**
  28. *创建的action,只有两个属性
  29. */
  30. const action = {
  31. type,
  32. payload: finalActionCreator(...args)
  33. };
  34. /**
  35. * 如果给匿名函数传递参数的长度为1个,或者第一个参数元素的类型为Error,那么这么action的error属性为true
  36. */
  37. if (args.length === 1 && args[0] instanceof Error) {
  38. // Handle FSA errors where the payload is an Error object. Set error.
  39. action.error = true;
  40. }
  41. /**
  42. * 传递到action里面的函数
  43. */
  44. if (typeof metaCreator === 'function') {
  45. action.meta = metaCreator(...args);
  46. }
  47.  
  48. return action;
  49. };
  50. }

  2.handleAction.js

    操作action,源码如下:

    

  1. import { isError } from 'flux-standard-action';
  2. /**
  3. * 判断是不是function
  4. */
  5. function isFunction(val) {
  6. return typeof val === 'function';
  7. }
  8. /**
  9. * 处理action
  10. * @param type action类型
  11. * @param 所有的reducers
  12. * @returns {Function}
  13. */
  14. export default function handleAction(type, reducers) {
  15. return (state, action) => {
  16. // If action type does not match, return previous state
  17. if (action.type !== type) return state;
  18.  
  19. const handlerKey = isError(action) ? 'throw' : 'next';
  20.  
  21. // If function is passed instead of map, use as reducer
  22. if (isFunction(reducers)) {
  23. reducers.next = reducers.throw = reducers;
  24. }
  25.  
  26. // Otherwise, assume an action map was passed
  27. const reducer = reducers[handlerKey];
  28.  
  29. return isFunction(reducer)
  30. ? reducer(state, action)
  31. : state;
  32. };
  33. }

    reduce-reducers源码:

  1. export default function reduceReducers(...reducers) {
  2. return (previous, current) =>
  3. reducers.reduce(
  4. (p, r) => r(p, current),
  5. previous
  6. );
  7. }

  3.handleActions.js 

    将所有的action集中在一起处理

    

  1. import handleAction from './handleAction';
  2. import ownKeys from './ownKeys';
  3. import reduceReducers from 'reduce-reducers';
  4.  
  5. /**
  6. *
  7. * @param handlers 所有的action
  8. * @param defaultState 初始的state
  9. * @returns {Function} 返回reducer
  10. */
  11. export default function handleActions(handlers, defaultState) {
  12. const reducers = ownKeys(handlers).map(type => {
  13. return handleAction(type, handlers[type]);
  14. });
  15. /**
  16. * 处理过后的reduce
  17. */
  18. const reducer = reduceReducers(...reducers)
  19.  
  20. return typeof defaultState !== 'undefined'
  21. ? (state = defaultState, action) => reducer(state, action)
  22. : reducer;
  23. }

  4.ownKeys.js

    用于判断对象属性的工具

   

  1. export default function ownKeys(object) {
  2. /**
  3. * Reflect.ownKeys类似于Object.keys(),返回对象中可枚举的属性
  4. */
  5. if (typeof Reflect !== 'undefined' && typeof Reflect.ownKeys === 'function') {
  6. return Reflect.ownKeys(object);
  7. }
  8. /**
  9. * 返回对象自己(非原型继承的属性)的属性名称,包括函数。
  10. * Object.keys只适用于可枚举的属性,而Object.getOwnPropertyNames返回对象自己的全部属性名称。
  11. */
  12. let keys = Object.getOwnPropertyNames(object);
  13. /**
  14. * getOwnPropertySymbols
  15. * 返回Symbol类型的属性
  16. */
  17. if (typeof Object.getOwnPropertySymbols === 'function') {
  18. keys = keys.concat(Object.getOwnPropertySymbols(object));
  19. }
  20.  
  21. return keys;
  22. }

  5.index.js

    输出所有的函数

  

  1. import createAction from './createAction';
  2. import handleAction from './handleAction';
  3. import handleActions from './handleActions';
  4.  
  5. export {
  6. createAction,
  7. handleAction,
  8. handleActions
  9. };

    

redux-actions源码解读的更多相关文章

  1. redux:applyMiddleware源码解读

    前言: 笔者之前也有一篇关于applyMiddleware的总结.是applyMiddleware的浅析. 现在阅读了一下redux的源码.下面说说我的理解. 概要源码: step 1:  apply ...

  2. 通过ES6写法去对Redux部分源码解读

    在Redux源码中主要有四个文件createStore,applyMiddleware,bindActionCreators,combineRedures createStore.js export ...

  3. redux源码解读(一)

    redux 的源码虽然代码量并不多(除去注释大概300行吧).但是,因为函数式编程的思想在里面体现得淋漓尽致,理解起来并不太容易,所以准备使用三篇文章来分析. 第一篇,主要研究 redux 的核心思想 ...

  4. Redux 源码解读 —— 从源码开始学 Redux

    已经快一年没有碰过 React 全家桶了,最近换了个项目组要用到 React 技术栈,所以最近又复习了一下:捡起旧知识的同时又有了一些新的收获,在这里作文以记之. 在阅读文章之前,最好已经知道如何使用 ...

  5. redux源码解读

    react在做大型项目的时候,前端的数据一般会越来越复杂,状态的变化难以跟踪.无法预测,而redux可以很好的结合react使用,保证数据的单向流动,可以很好的管理整个项目的状态,但是具体来说,下面是 ...

  6. redux源码解读(二)

    之前,已经写过一篇redux源码解读(一),主要分析了 redux 的核心思想,并用100多行代码实现一个简单的 redux .但是,那个实现还不具备合并 reducer 和添加 middleware ...

  7. 【原】Spark中Job的提交源码解读

    版权声明:本文为原创文章,未经允许不得转载. Spark程序程序job的运行是通过actions算子触发的,每一个action算子其实是一个runJob方法的运行,详见文章 SparkContex源码 ...

  8. redux的源码解析

    一. redux出现的动机 1. Javascript 需要管理比任何时候都要多的state2. state 在什么时候,由于什么原因,如何变化已然不受控制.3. 来自前端开发领域的新需求4. 我们总 ...

  9. SDWebImage源码解读之SDWebImageDownloaderOperation

    第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...

  10. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

随机推荐

  1. linux下用mii-tool和ethtool 查看网线是否正确连接到网卡

    输入mii-tool可以查看网线是否连接到网卡#mii-tool eth0: negotiated 100baseTx-FD, link ok 有时驱动可能不支持会出错下列错误#mii-tool SI ...

  2. C++公有继承

    is-a.has-a和like-a.组合.聚合和继承 两组概念的区别 - cbk861110的专栏 - 博客频道 -CSDN.NET http://blog.csdn.net/cbk861110/ar ...

  3. js 去掉input标签中的百分号【%】

    parseInt("100%") --100 parseFloat("17%")     --17

  4. 43. 动态规划求解n个骰子的点数和出现概率(或次数)[Print sum S probability of N dices]

    [题目] 把N个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入N,打印出S的所有可能的值出现的概率. [分析] 典型的动态规划题目. 设n个骰子的和为s出现的次数记为f(n,s),其中n=[1-N ...

  5. 跨域请求获取Solr json检索结果并高亮显示

    Solr提供了json格式的检索结果,然而在跨域的情况下如何调用呢?我们可以利用jquery提供的jsonp的方式获取Solr检索结果. <script type="text/java ...

  6. win平台检查内存泄露

    int main() { _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); _CrtSetBre ...

  7. ts tp 高清播放软件 Elecard MPEG Player 6.0.130827

    Elecard MPEG Player 6.0.130827 计算机配置不高的情况下,流畅播放高清视频. 缺点是搜索时停顿严重. 包里有注册机. 下载地址 http://pan.baidu.com/s ...

  8. 多个list合并

    需要多个list合并,如图 @SuppressWarnings("unchecked")    @Override    public List<CwInfo> get ...

  9. myeclipse6.5中使用Alt+/不自动提示的修改

    转载自:http://www.cnblogs.com/zhangnanblog/archive/2011/11/10/2244960.html 最近把MyEclipse8.5降到了MyEclipse6 ...

  10. mysql用命令行导入sql文件

    前面说到了用navicat工具导入导出数据库,今天给同事导入数据库的时候,发现到不进去,好多错误,情急之下,用命令行导入的 1.打开mysql的服务.cmd-->net start mysql ...