react-data-binding
Version:
do react data binding easily
102 lines (87 loc) • 3.31 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var Store = (function () {
function Store(initialData) {
_classCallCheck(this, Store);
this.state = initialData;
this.batching = false;
this.listeners = [];
this.fireChange = this.fireChange.bind(this);
this.batch = this.batch.bind(this);
this.getState = this.getState.bind(this);
this.setState = this.setState.bind(this);
}
_createClass(Store, [{
key: 'setState',
value: function setState(state) {
this.state = _extends({}, this.state, state);
if (!this.batching) {
this.batchFireChange();
}
}
}, {
key: 'batch',
value: function batch(callback) {
var _this = this;
return function () {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
if (_this.batching) {
callback.apply(null, args);
return;
}
_this.batching = true;
var originalState = _this.state;
callback.apply(null, args);
_this.batching = false;
if (originalState !== _this.state) {
_this.batchFireChange();
}
};
}
}, {
key: 'batchFireChange',
value: function batchFireChange() {
// TODO debounce ?
_reactDom2['default'].unstable_batchedUpdates(this.fireChange);
}
}, {
key: 'fireChange',
value: function fireChange() {
this.listeners.slice().forEach(function (listener) {
return listener();
});
}
}, {
key: 'subscribe',
value: function subscribe(listener) {
var listeners = this.listeners;
listeners.push(listener);
var isSubscribed = true;
return function unsubscribe() {
if (!isSubscribed) {
return;
}
isSubscribed = false;
var index = listeners.indexOf(listener);
listeners.splice(index, 1);
};
}
}, {
key: 'getState',
value: function getState() {
return this.state;
}
}]);
return Store;
})();
exports.Store = Store;