UNPKG

@turbox3d/reactivity

Version:

Large-scale reactive state management library

99 lines (98 loc) 2.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.computed = computed; var _shared = require("@turbox3d/shared"); var _reactive = require("../core/reactive"); var _collector = require("../core/collector"); var _enums = require("../const/enums"); function computed() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (typeof args[0] === 'function') { var value; var dirty = true; var needReComputed = false; var needTrigger = false; var _computedRef; var computeRunner = args[0]; var _options = args[1]; var lazy = _options && _options.lazy !== void 0 ? _options.lazy : false; var reaction = (0, _reactive.createReaction)(function () { dirty = true; if (needReComputed) { value = computeRunner(); } if (needTrigger) { _collector.triggerCollector.trigger(_computedRef, _enums.ESpecialReservedKey.COMPUTED, { type: _enums.ECollectType.SET, beforeUpdate: void 0, didUpdate: void 0 }); } }, { name: 'computed', computed: true, lazy: lazy }); _computedRef = { get: function get() { if (dirty) { needReComputed = true; needTrigger = false; reaction.runner(); dirty = false; needReComputed = false; needTrigger = true; } _collector.depCollector.collect(_computedRef, _enums.ESpecialReservedKey.COMPUTED); return value; }, dispose: function dispose() { reaction.dispose(); } }; return _computedRef; } var computedRef; var options; var decorator = function decorator(target, property, descriptor) { computedRef = { enumerable: true, configurable: true, get: function get() { var current = this; return current.computedPropertyGet(property, options); }, set: function set(original) { var current = this; current.computedPropertySet(property, original); } }; // typescript only: @computed prop = () => {} if (descriptor === void 0) { return Object.defineProperty(target, property, computedRef); } // @computed get prop() {} computedRef = { enumerable: true, configurable: true, get: function get() { var current = this; return current.computedPropertyGet(property, options, descriptor); }, set: descriptor.set }; return computedRef; }; if ((0, _shared.quacksLikeADecorator)(args)) { // @computed // eslint-disable-next-line prefer-spread return decorator.apply(null, args); } // @computed(args) options = args[0]; return decorator; }