combine-action-reducer
Version:
create action creator and reducer with one action-reduer
64 lines (63 loc) • 2.4 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
var ActionReducer_1 = require("./ActionReducer");
/**
* 合并多个reducer;
* @param reducers 用于被连接的一批reducers;
*/
function CombineReducer(reducers) {
var combineReducers = reducers;
return function (s, ac) {
if (s === void 0) { s = {}; }
// 使用'/' 作为action.type的域的默认分割符号.
var newAction = __assign({}, ac);
var path = newAction.type.split("/");
// 尝试选择路径
var currentSelected = path.shift();
var selectedReducer = currentSelected && combineReducers[currentSelected];
if (selectedReducer && currentSelected) {
// 选择到了一个 selectedReducer, 使用这个 reducer 继续处理归约.
newAction.type = path.join("/"); // 使用剩下的路径作为 type;
s[currentSelected] = selectedReducer(s[currentSelected], newAction);
}
else {
// 没有路径选中就遍历所有的子reducer; 初始化, 没有路径的dispatch;
var keys = Object.getOwnPropertyNames(combineReducers);
keys.forEach(function (one) {
s[one] = combineReducers[one](s[one], ac);
});
}
return s;
};
}
/**
* 合并多个ActionReducer;
* @param combineObj 描述ActionReducer 如何合并
*/
function CombineActionReducer(combineObj) {
// 分别提取出Actions 和 Reducers;
var keys = Object.getOwnPropertyNames(combineObj);
var reducers = {};
var actions = {};
keys.forEach(function (one) {
reducers[one] = combineObj[one].reducer;
actions[one] = combineObj[one].action;
});
return {
reducer: CombineReducer(reducers),
// 由于ActionCreator的结构和mapObj 的结构一致, 可以直接使用buildActionCreateor
action: ActionReducer_1.buildActionCreator(actions),
};
}
exports.CombineActionReducer = CombineActionReducer;