@turbox3d/reactivity
Version:
Large-scale reactive state management library
89 lines (88 loc) • 2.97 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Reaction = void 0;
exports.createReaction = createReaction;
exports.reactive = reactive;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _shared = require("@turbox3d/shared");
var _collector = require("./collector");
var _store = require("./store");
var _symbol = require("../const/symbol");
var _event = require("../utils/event");
var Reaction = exports.Reaction = /*#__PURE__*/function () {
function Reaction(name, runner, computed, lazy, deps, immediately) {
(0, _classCallCheck2["default"])(this, Reaction);
this.name = name;
this.runner = runner;
this.computed = computed;
this.lazy = lazy;
this.deps = deps;
this.immediately = immediately;
}
return (0, _createClass2["default"])(Reaction, [{
key: "dispose",
value: function dispose() {
if (this.unsubscribeHandler !== void 0) {
this.unsubscribeHandler();
}
_collector.depCollector.clear(this);
}
}]);
}();
function createReaction(func, options) {
var name = options && options.name || func.name || "".concat(_symbol.TURBOX_PREFIX, "REACTIVE_").concat((0, _shared.generateUUID)());
var lazy = options && options.lazy !== void 0 ? options.lazy : false;
var deps = options && options.deps || [];
var immediately = options && options.immediately !== void 0 ? options.immediately : true;
var firstRun = true;
var reaction = new Reaction(name, function () {
var isInner = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
try {
_collector.depCollector.start(reaction);
if (reaction.deps.length > 0) {
var values = [];
reaction.deps.forEach(function (dep) {
var value = dep();
values.push(value);
});
_collector.depCollector.end();
!firstRun && func.call.apply(func, [null].concat(values));
} else {
func.call(null);
_collector.depCollector.end();
}
if (firstRun) {
firstRun = false;
}
} catch (error) {
_collector.depCollector.end();
if (firstRun) {
firstRun = false;
}
if (!isInner) {
throw error;
}
}
}, !!(options && options.computed), lazy, deps, immediately);
var subscribe = function subscribe() {
reaction.unsubscribeHandler = _store.store.subscribe(function (isInner) {
reaction.runner(isInner);
}, reaction);
reaction.runner();
};
if (!_store.store) {
_event.emitter.on(_event.EEventName.storeOnActive, function () {
subscribe();
});
} else {
subscribe();
}
return reaction;
}
function reactive(func, options) {
return createReaction(func, options);
}