kor-react
Version:
Utilities for consuming kor observables in React components
58 lines (47 loc) • 1.55 kB
text/typescript
import kor = require('kor');
import React = require('react');
function ignore() {}
export class Komponent<P> extends React.Component<P, {}> {
private _koCachedInternals: {
rendered?: React.ReactElement<any>;
listener?: Kor.Computed<void>;
subscription?: Kor.Subscription;
renderSoon?: Kor.Observable<void>;
};
private _koInternals() {
if (!this._koCachedInternals) {
this._koCachedInternals = {};
}
return this._koCachedInternals;
}
componentWillReceiveProps(nextProps: P) {
var internals = this._koInternals();
if (internals.renderSoon) {
internals.renderSoon.notifySubscribers();
}
}
componentDidMount() {
var internals = this._koInternals();
if (!internals.listener) {
internals.renderSoon = kor.observable<void>();
internals.listener = kor.pureComputed(() => {
internals.renderSoon();
internals.rendered = this.renderKor();
this.forceUpdate();
}).extend({ throttle: 1 });
}
internals.subscription = internals.listener.subscribe(ignore);
}
componentWillUnmount() {
var internals = this._koInternals();
internals.subscription.dispose();
internals.subscription = null;
}
render() {
return this._koInternals().rendered || null;
}
// Override this instead of render()
renderKor() {
return <React.ReactElement<any>>null;
}
}