mobx-vue
Version:
Vue bindings for MobX
71 lines • 2.93 kB
JavaScript
import * as tslib_1 from "tslib";
/**
* @author Kuitos
* @homepage https://github.com/kuitos/
* @since 2018-05-22 16:39
*/
import { Reaction } from 'mobx';
import Vue from 'vue';
import collectData from './collectData';
// @formatter:off
// tslint:disable-next-line
var noop = function () { };
function observer(Component) {
var name = Component.name || Component._componentTag || (Component.constructor && Component.constructor.name) || '<component>';
var originalOptions = typeof Component === 'object' ? Component : Component.options;
// while parameter was component options, we could use it directly
// otherwise we only use its data definition
// we couldn't merge the options when Component was a VueClass, that will merge the lifecycle twice after we called Component.extend
var dataDefinition = originalOptions.data;
var options = tslib_1.__assign({}, typeof Component === 'object' ? Component : {}, { name: name, data: function (vm) { return collectData(vm, dataDefinition); } });
// remove the parent data definition to avoid reduplicate invocation
originalOptions.data = {};
var Super = (typeof Component === 'function' && Component.prototype instanceof Vue) ? Component : Vue;
var ExtendedComponent = Super.extend(options);
var dispose = noop;
var _a = ExtendedComponent.prototype, $mount = _a.$mount, $destroy = _a.$destroy;
ExtendedComponent.prototype.$mount = function () {
var _this = this;
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var mounted = false;
var originalRender;
var reactiveRender = function () {
reaction.track(function () {
if (!mounted) {
$mount.apply(_this, args);
mounted = true;
// rewrite the render method to avoid losing track when component updated by vue watcher
originalRender = _this._watcher.getter;
_this._watcher.getter = reactiveRender;
}
else {
originalRender.call(_this, _this);
}
});
return _this;
};
var reaction = new Reaction(name + ".render()", reactiveRender);
dispose = reaction.getDisposer();
return reactiveRender();
};
ExtendedComponent.prototype.$destroy = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
dispose();
$destroy.apply(this, args);
};
Object.defineProperty(ExtendedComponent, 'name', {
writable: false,
value: name,
enumerable: false,
configurable: false,
});
return ExtendedComponent;
}
export { observer, observer as Observer, };
//# sourceMappingURL=observer.js.map