一.什么是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源码解读的更多相关文章

  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. 【SpringMVC】SpringMVC系列5之@RequestHeader 映射请求头属性值

    5.@RequestHeader 映射请求头属性值 5.1.概述 请求头包含了若干个属性,服务器可据此获知客户端的信息,通过 @RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中 ...

  2. Spring源码学习(二)AOP

    ----ProxyFactoryBean这个类,这是AOP使用的入口---- AOP有些特有的概念,如:advisor.advice和pointcut等等,使用或配置起来有点绕,让人感觉有些距离感,其 ...

  3. Solr5.3.1通过copyField设置多个field(字段)同时检索

    如果业务需要我们对多个field同时进行检索,有没有什么好的办法呢?非常幸运的是Solr为我们提供了copyField对多个field进行索引和检索.然而配置也非常简单. 修改schame.xml,添 ...

  4. HDU1695 GCD (欧拉函数+容斥原理)

    F - GCD Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  5. July 21st, Week 30th Thursday, 2016

    What youth deemed crystal, age finds out was dew. 年少时的水晶,在岁月看来不过是露珠. As time goes by, we are gradual ...

  6. (二)STM32中中断优先级理解

    很多人在配置STM32中断时对固件库中的这个函数NVIC_PriorityGroupConfig()——配置优先级分组方式,会很不理解,尤其是看中文翻译版的,因为中文翻译版里把这里翻译成“先占优先级和 ...

  7. dfs常见的配置文件中的value与description

    照抄于网络: name value description dfs.namenode.logging.level info The logging level for dfs namenode. Ot ...

  8. Entity Framework 使用

    1.EF中Include方法的使用使用Include方法,告诉EF连接查询哪个外键属性,生成Inner join连接 //必须引用using System.Data.Entity;才能用Include ...

  9. Java Hour 36 Weathre ( 9 ) struts2 – exception

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. Hour 35 Exception Handling 直接添加全局性的异常处理 ...

  10. 14、Silverlight 滤镜到 UWP 滤镜的移植(二)

    上一篇文章 大致介绍了,移植戴震军大哥的 Windows Phone7 中,对于高斯模糊滤镜的移植,主要是 int[] 数组和 byte[] 数组的互相转换.同样的思路,只要把前文的方法封装一下,就能 ...