forked from enviPath/enviPy
82 lines
2.3 KiB
JavaScript
82 lines
2.3 KiB
JavaScript
import { FORCE_RENDER } from './constants';
|
|
import { extend } from './util';
|
|
import { renderComponent } from './vdom/component';
|
|
import { enqueueRender } from './render-queue';
|
|
|
|
/** Base Component class.
|
|
* Provides `setState()` and `forceUpdate()`, which trigger rendering.
|
|
* @public
|
|
*
|
|
* @example
|
|
* class MyFoo extends Component {
|
|
* render(props, state) {
|
|
* return <div />;
|
|
* }
|
|
* }
|
|
*/
|
|
export function Component(props, context) {
|
|
this._dirty = true;
|
|
|
|
/** @public
|
|
* @type {object}
|
|
*/
|
|
this.context = context;
|
|
|
|
/** @public
|
|
* @type {object}
|
|
*/
|
|
this.props = props;
|
|
|
|
/** @public
|
|
* @type {object}
|
|
*/
|
|
this.state = this.state || {};
|
|
}
|
|
|
|
|
|
extend(Component.prototype, {
|
|
|
|
/** Returns a `boolean` indicating if the component should re-render when receiving the given `props` and `state`.
|
|
* @param {object} nextProps
|
|
* @param {object} nextState
|
|
* @param {object} nextContext
|
|
* @returns {Boolean} should the component re-render
|
|
* @name shouldComponentUpdate
|
|
* @function
|
|
*/
|
|
|
|
|
|
/** Update component state by copying properties from `state` to `this.state`.
|
|
* @param {object} state A hash of state properties to update with new values
|
|
* @param {function} callback A function to be called once component state is updated
|
|
*/
|
|
setState(state, callback) {
|
|
let s = this.state;
|
|
if (!this.prevState) this.prevState = extend({}, s);
|
|
extend(s, typeof state==='function' ? state(s, this.props) : state);
|
|
if (callback) (this._renderCallbacks = (this._renderCallbacks || [])).push(callback);
|
|
enqueueRender(this);
|
|
},
|
|
|
|
|
|
/** Immediately perform a synchronous re-render of the component.
|
|
* @param {function} callback A function to be called after component is re-rendered.
|
|
* @private
|
|
*/
|
|
forceUpdate(callback) {
|
|
if (callback) (this._renderCallbacks = (this._renderCallbacks || [])).push(callback);
|
|
renderComponent(this, FORCE_RENDER);
|
|
},
|
|
|
|
|
|
/** Accepts `props` and `state`, and returns a new Virtual DOM tree to build.
|
|
* Virtual DOM is generally constructed via [JSX](http://jasonformat.com/wtf-is-jsx).
|
|
* @param {object} props Props (eg: JSX attributes) received from parent element/component
|
|
* @param {object} state The component's current state
|
|
* @param {object} context Context object (if a parent component has provided context)
|
|
* @returns VNode
|
|
*/
|
|
render() {}
|
|
|
|
});
|