UNPKG

@turbox3d/reactivity

Version:

Large-scale reactive state management library

93 lines 2.71 kB
import { quacksLikeADecorator } from '@turbox3d/shared'; import { createReaction } from '../core/reactive'; import { depCollector, triggerCollector } from '../core/collector'; import { ECollectType, ESpecialReservedKey } from '../const/enums'; export 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 = createReaction(function () { dirty = true; if (needReComputed) { value = computeRunner(); } if (needTrigger) { triggerCollector.trigger(_computedRef, ESpecialReservedKey.COMPUTED, { type: 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; } depCollector.collect(_computedRef, 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 (quacksLikeADecorator(args)) { // @computed // eslint-disable-next-line prefer-spread return decorator.apply(null, args); } // @computed(args) options = args[0]; return decorator; }