@turbox3d/reactivity
Version:
Large-scale reactive state management library
93 lines • 2.71 kB
JavaScript
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;
}