redux-actions源码解读
一.什么是redux-actions
redux-actions是一个简化action和reducer创建的一个封装库,里面有5个js文件,
createAction.js
handleAction.js
handleActions.js
index.js
ownKeys.js
二.怎么使用?下面将从源码一一解释每个文件的的用处
1.createAction.js
从名字就可以看出,这是用来创建action的.其源码如下:
/**
* 参数不是function调用此函数
*/
function identity(t) {
return t;
} /**
* 创建action
* @param type action的类型
* @param actionCreator 需要创建的action,函数
* @param metaCreator action的属性
* @returns {Function}
*/
export default function createAction(type, actionCreator, metaCreator) {
/**
* finalActionCreator最终创建的action,
* 判断传进来的参数是不是function,true返回这个函数,false调用identity函数
*/
const finalActionCreator = typeof actionCreator === 'function'
? actionCreator
: identity;
/**
* 返回一个匿名函数
*/
return (...args) => {
/**
*创建的action,只有两个属性
*/
const action = {
type,
payload: finalActionCreator(...args)
};
/**
* 如果给匿名函数传递参数的长度为1个,或者第一个参数元素的类型为Error,那么这么action的error属性为true
*/
if (args.length === 1 && args[0] instanceof Error) {
// Handle FSA errors where the payload is an Error object. Set error.
action.error = true;
}
/**
* 传递到action里面的函数
*/
if (typeof metaCreator === 'function') {
action.meta = metaCreator(...args);
} return action;
};
}
2.handleAction.js
操作action,源码如下:
 import { isError } from 'flux-standard-action';
 /**
  * 判断是不是function
  */
 function isFunction(val) {
   return typeof val === 'function';
 }
 /**
  * 处理action
  * @param type action类型
  * @param 所有的reducers
  * @returns {Function}
  */
 export default function handleAction(type, reducers) {
   return (state, action) => {
     // If action type does not match, return previous state
     if (action.type !== type) return state;
     const handlerKey = isError(action) ? 'throw' : 'next';
     // If function is passed instead of map, use as reducer
     if (isFunction(reducers)) {
       reducers.next = reducers.throw = reducers;
     }
     // Otherwise, assume an action map was passed
     const reducer = reducers[handlerKey];
     return isFunction(reducer)
       ? reducer(state, action)
       : state;
   };
 }
reduce-reducers源码:
 export default function reduceReducers(...reducers) {
   return (previous, current) =>
     reducers.reduce(
       (p, r) => r(p, current),
       previous
     );
 }
3.handleActions.js
将所有的action集中在一起处理
import handleAction from './handleAction';
import ownKeys from './ownKeys';
import reduceReducers from 'reduce-reducers'; /**
*
* @param handlers 所有的action
* @param defaultState 初始的state
* @returns {Function} 返回reducer
*/
export default function handleActions(handlers, defaultState) {
const reducers = ownKeys(handlers).map(type => {
return handleAction(type, handlers[type]);
});
/**
* 处理过后的reduce
*/
const reducer = reduceReducers(...reducers) return typeof defaultState !== 'undefined'
? (state = defaultState, action) => reducer(state, action)
: reducer;
}
4.ownKeys.js
用于判断对象属性的工具
 export default function ownKeys(object) {
   /**
    * Reflect.ownKeys类似于Object.keys(),返回对象中可枚举的属性
    */
   if (typeof Reflect !== 'undefined' && typeof Reflect.ownKeys === 'function') {
     return Reflect.ownKeys(object);
   }
   /**
    * 返回对象自己(非原型继承的属性)的属性名称,包括函数。
    * Object.keys只适用于可枚举的属性,而Object.getOwnPropertyNames返回对象自己的全部属性名称。
    */
   let keys = Object.getOwnPropertyNames(object);
   /**
    * getOwnPropertySymbols
    * 返回Symbol类型的属性
    */
   if (typeof Object.getOwnPropertySymbols === 'function') {
     keys = keys.concat(Object.getOwnPropertySymbols(object));
   }
   return keys;
 }
5.index.js
输出所有的函数
import createAction from './createAction';
import handleAction from './handleAction';
import handleActions from './handleActions'; export {
createAction,
handleAction,
handleActions
};
redux-actions源码解读的更多相关文章
- redux:applyMiddleware源码解读
		前言: 笔者之前也有一篇关于applyMiddleware的总结.是applyMiddleware的浅析. 现在阅读了一下redux的源码.下面说说我的理解. 概要源码: step 1: apply ... 
- 通过ES6写法去对Redux部分源码解读
		在Redux源码中主要有四个文件createStore,applyMiddleware,bindActionCreators,combineRedures createStore.js export ... 
- redux源码解读(一)
		redux 的源码虽然代码量并不多(除去注释大概300行吧).但是,因为函数式编程的思想在里面体现得淋漓尽致,理解起来并不太容易,所以准备使用三篇文章来分析. 第一篇,主要研究 redux 的核心思想 ... 
- Redux 源码解读 —— 从源码开始学 Redux
		已经快一年没有碰过 React 全家桶了,最近换了个项目组要用到 React 技术栈,所以最近又复习了一下:捡起旧知识的同时又有了一些新的收获,在这里作文以记之. 在阅读文章之前,最好已经知道如何使用 ... 
- redux源码解读
		react在做大型项目的时候,前端的数据一般会越来越复杂,状态的变化难以跟踪.无法预测,而redux可以很好的结合react使用,保证数据的单向流动,可以很好的管理整个项目的状态,但是具体来说,下面是 ... 
- redux源码解读(二)
		之前,已经写过一篇redux源码解读(一),主要分析了 redux 的核心思想,并用100多行代码实现一个简单的 redux .但是,那个实现还不具备合并 reducer 和添加 middleware ... 
- 【原】Spark中Job的提交源码解读
		版权声明:本文为原创文章,未经允许不得转载. Spark程序程序job的运行是通过actions算子触发的,每一个action算子其实是一个runJob方法的运行,详见文章 SparkContex源码 ... 
- redux的源码解析
		一. redux出现的动机 1. Javascript 需要管理比任何时候都要多的state2. state 在什么时候,由于什么原因,如何变化已然不受控制.3. 来自前端开发领域的新需求4. 我们总 ... 
- SDWebImage源码解读之SDWebImageDownloaderOperation
		第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ... 
- SDWebImage源码解读 之 NSData+ImageContentType
		第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ... 
随机推荐
- ToDo系列
			leetcode http://www.cnblogs.com/TenosDoIt/tag/leetcode/ http://tech-wonderland.net/category/algorith ... 
- Java for LeetCode 144 Binary Tree Preorder Traversal
			Given a binary tree, return the preorder traversal of its nodes' values. For example: Given binary t ... 
- linux(Ubuntu)安装QQ2013
			首先简述自己的系统配置:win7+ ubuntu12.04 linuxQQ 有各种版本,这里介绍两种:linuxQQ 和 wineQQ 1 ------linuxqq是QQ简化版,功能很少,界面很差, ... 
- JavaScript封装成类
			JavaScript在WEB编程中能起到很大的作用,将一些常用的功能写成JavaScript类库. 将下面代码保存为Common.js 类库功能: 1.Trim(str)--去除字符串两边的空格 2. ... 
- 告别div,可以代替div的几个标签
			几个最常用的用来代替DIV的HTML5元素 虽说html5中大多数功能性的元素如<video><canvas><audio>等还得不到当前主流浏览器的支持(主要就是 ... 
- ios 7.1.2 拍照声音
			打开进入文件系统(越狱)目录:/System/Library/Frameworks/MediaToolbox.framework , 重命名文件 RegionalSystemSoundsThatSha ... 
- 【Python爬虫】入门知识
			爬虫基本知识 这阵子需要用爬虫做点事情,于是系统的学习了一下python爬虫,觉得还挺有意思的,比我想象中的能干更多的事情,这里记录下学习的经历. 网上有关爬虫的资料特别多,写的都挺复杂的,我这里不打 ... 
- hdu 1005:Number Sequence(水题)
			Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ... 
- hdu 4091 线性规划
			分析转自:http://blog.csdn.net/dongdongzhang_/article/details/7955136 题意 : 背包能装体积为N, 有两种宝石, 数量无限, 不能切割. ... 
- 开源的DevOps开发工具箱
			DevOps是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和质量保障(QA)部门之间的沟通.协作与整合.在DevOps的整个流程中,使用一些开源工具可以促进开发与运维之间的 ... 
