UNPKG

combine-action-reducer

Version:

create action creator and reducer with one action-reduer

64 lines (63 loc) 2.4 kB
"use strict"; 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;