ayano-react
Version:
react app creator
153 lines (131 loc) • 14.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /**
doc
``` javascirpt
import { Reducer } from 'ayano-react';
var reducer = new Reducer();
reducer.use('INIT_GUOSHENCHENG', (state, payload) => {})
reducer.use('GUOSHENCHENG', (state, payload) => {});
var root = new Reducer();
root.use('guoshencehng', reducer);
```
*/
var _ayanoUtils = require('ayano-utils');
var _redux = require('redux');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function isVaildOldReducerChild(reducer) {
if (reducer.reducers && (0, _ayanoUtils.is)(_ayanoUtils.TYPES.Object)(reducer.reducers)) {
return true;
} else {
return false;
}
}
var Reducer = function () {
function Reducer() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
defaultState = _ref.defaultState,
prefix = _ref.prefix;
_classCallCheck(this, Reducer);
this.defaultState = defaultState || {};
this.prefix = prefix || "@ayano-reducer", this.reducers = {}; // Reducer 的对象,需要递归的处理
this.handlers = {}; // 可直接处理数据的函数
this.originReducer = {}; // redux reducer的处理方法
}
_createClass(Reducer, [{
key: 'useOriginReducer',
value: function useOriginReducer(key, fn) {
if ((0, _ayanoUtils.is)(_ayanoUtils.TYPES.Function)(fn)) {
this.originReducer[key] = fn;
}
}
}, {
key: 'use',
value: function use(key, fn) {
if ((0, _ayanoUtils.is)(_ayanoUtils.TYPES.Function)(fn)) {
this.handlers[key] = fn;
} else if (fn instanceof Reducer) {
this.reducers[key] = fn;
} else {
console.warn('reducer which key is ' + key + ' is not either a fuction or ayano-react/dist/reducer');
}
}
}, {
key: 'toReducerAction',
value: function toReducerAction(dispatch, prefix) {
var _this = this;
prefix = prefix || this.prefix;
var actions = Object.keys(this.handlers).reduce(function (pre, cur) {
pre[cur] = function (payload) {
return dispatch({
type: prefix + '/' + cur,
payload: payload
});
};
return pre;
}, {});
actions = Object.keys(this.reducers).reduce(function (pre, cur) {
pre[cur] = _this.reducers[cur].toReducerAction(dispatch, prefix + '/' + cur);
return pre;
}, actions);
return actions;
}
}, {
key: 'toReduxReducers',
value: function toReduxReducers(prefix) {
var _this2 = this;
prefix = prefix || this.prefix;
var handlers = Object.keys(this.handlers).reduce(function (pre, cur) {
pre[prefix + '/' + cur] = _this2.handlers[cur];
return pre;
}, {});
return function (state, action) {
var nextState = Object.assign({}, state || _this2.defaultState);
if (handlers[action.type]) {
nextState = handlers[action.type](state, action.payload);
}
Object.keys(_this2.originReducer).filter(function (key) {
return !!_this2.originReducer[key];
}).forEach(function (key) {
var reducer = _this2.originReducer[key];
nextState[key] = reducer(nextState[key], action);
});
Object.keys(_this2.reducers).filter(function (key) {
return !!_this2.reducers[key];
}).forEach(function (key) {
var reducer = _this2.reducers[key];
nextState[key] = reducer.toReduxReducers(prefix + '/' + key)(nextState[key], action);
});
return nextState;
};
}
}]);
return Reducer;
}();
exports.default = Reducer;
Reducer.fromOldReducer = function (reducers, prefix) {
if (isVaildOldReducerChild(reducers)) {
// 传入的是一个最小Reducer的子节点
var defaultState = reducers.defaultState || {};
var current = new Reducer({ prefix: prefix, defaultState: defaultState });
Object.keys(reducers.reducers).forEach(function (key) {
var reducer = reducers.reducers[key];
if ((0, _ayanoUtils.is)(_ayanoUtils.TYPES.Function)(reducer)) {
current.use(key, reducer);
} else {
current.use(key, Reducer.fromOldReducer(reducer));
}
});
return current;
} else {
// 递归寻找最小Reducer子节点
var _current = new Reducer({ prefix: prefix });
Object.keys(reducers).map(function (key) {
var reducer = reducers[key];
_current.use(key, Reducer.fromOldReducer(reducer));
});
return _current;
}
};