async-reducer-context
Version:
通过react-context,useReducer替代redux,可扩展支持与redux周边middleware中间件,通过useModel(['key'])可获取state和dispatch,其中useModel已做到获取的属性值变化,组件才会重新渲染,摆脱useContext因context中无关数据导致的重复渲染问题。
56 lines (55 loc) • 1.99 kB
JavaScript
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
to[j] = from[i];
return to;
};
export default function applyMiddleware() {
var middlewares = [];
for (var _i = 0; _i < arguments.length; _i++) {
middlewares[_i] = arguments[_i];
}
return function (store) {
// eslint-disable-next-line no-unused-vars
var dispatch = function (action) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
throw new Error('Dispatching while constructing your middleware is not allowed. '
+ 'Other middleware would not be applied to this dispatch.');
};
var middlewareAPI = {
getState: store.getState,
dispatch: function (action) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
return dispatch.apply(void 0, __spreadArray([action], args));
},
};
var chain = middlewares.map(function (middleware) { return middleware(middlewareAPI); });
dispatch = compose.apply(void 0, chain)(store.dispatch);
return dispatch;
};
}
function compose() {
var funcs = [];
for (var _i = 0; _i < arguments.length; _i++) {
funcs[_i] = arguments[_i];
}
if (funcs.length === 0) {
// infer the argument type so it is usable in inference down the line
return function (arg) { return arg; };
}
if (funcs.length === 1) {
return funcs[0];
}
return funcs.reduce(function (a, b) { return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return a(b.apply(void 0, args));
}; });
}