UNPKG

@turbox3d/reactivity

Version:

Large-scale reactive state management library

89 lines (88 loc) 2.97 kB
"use strict"; 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); }