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版本的代码. 说说 ...
随机推荐
- 《ASP.NET MVC4 WEB编程》学习笔记------Web API
本文截取自情缘 1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集 ...
- .NET Reflector 7.6.1.824 Edition .NET程序反编译神器(附插件安装教程2012-10-13更新) 完全破解+使用教程
原文来自VAllen cnblogs 一.使用教程1.解压后,双击Reflector.exe,如果有选择默认版本的.Net Framework,根据需要选择即可.你选择的版本不同则出现的默认程序集也不 ...
- poj 1833
http://poj.org/problem?id=1833 next_permutation这个函数是用来全排列的,按字典的序进行排列,当排列无后继的最大值时,会执行字典升序排列,相当于排序: 当排 ...
- 41.把数组排成最小的数[Sort array to smallest value]
[题目] 输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个.例如输入数组{3,32, 321},则输出这两个能排成的最小数字321323.请给出解决问题的算法,并证明该 ...
- 用cocos2dx实现模态对话框
ui部分使用了cocoStudio,注意这里没有实现怎么屏蔽其他的输入事件,其他的文档已经太多了,我这里使用的cocoStudio的控件自己的特性. 这里强烈推荐一下cocoStudio,虽然现在还有 ...
- 新建myeclipse工作空间需要的工作
接触了许多个项目,都挺大的,每次都需要配置,简单总结总结. 第一.右击项目,选择Text file encoding 第二.点击window-->preferences-->myeclip ...
- Unsupported major.minor version 51.0 在配置/运行Maven工程时,JDK与Maven所引用的jdk版本不一致
在配置Maven工程,部署到tomcat服务器运行的过程中,遇到如下错误: "Unsupported major.minor version 51.0 " 错误原因是由于maven ...
- sublime text 3 使用过程总结记录
自定义的设置: "save_on_focus_lost": true //在文件失去焦点的时候自动保存
- Fence Repair(poj 3253)
题意: 有一个农夫要把一个木板钜成几块给定长度的小木板,每次锯都要收取一定费用,这个费用就是当前锯的这个木版的长度 给定各个要求的小木板的长度,及小木板的个数n,求最小费用 提示: 以 3 5 8 5 ...
- GCM 发送接收消息 Message Client Server 服务器端,客户端
GCM 传递参数 最近用了很多时间做GCM,由于碰到很多问题,因此详细做一下记录,以方便各位网友,不用再走我的重复的路.不过我试了一下GCM在国内很不好用.假如开发国外的程序的话,用GCM倒是很不错的 ...