@antv/f2
Version:
Charts for mobile visualization.
75 lines • 2.26 kB
JavaScript
function createUpdater(canvas) {
var setStateQueue = [];
var renderQueue = [];
var callbackQueue = [];
function process() {
var item;
// let component;
while (item = setStateQueue.shift()) {
var _item = item,
state = _item.state,
component = _item.component,
callback = _item.callback;
if (component.destroyed) {
continue;
}
// 如果没有prevState,则将当前的state作为初始的prevState
if (!component.prevState) {
component.prevState = Object.assign({}, component.state);
}
// 如果stateChange是一个方法,也就是setState的第二种形式
if (typeof state === 'function') {
Object.assign(component.state, state(component.prevState, component.props));
} else {
// 如果stateChange是一个对象,则直接合并到setState中
Object.assign(component.state, state);
}
component.prevState = component.state;
if (typeof callback === 'function') {
callbackQueue.push({
callback: callback,
component: component
});
}
}
var renderComponents = [].concat(renderQueue);
canvas.renderComponents(renderComponents);
// callback queue
commitRenderQueue();
// 清空
renderQueue.length = 0;
callbackQueue.length = 0;
}
function enqueueSetState(component, state, callback) {
if (setStateQueue.length === 0) {
setTimeout(process, 0);
}
setStateQueue.push({
component: component,
state: state,
callback: callback
});
if (renderQueue.indexOf(component) < 0) {
renderQueue.push(component);
}
}
function commitRenderQueue() {
for (var i = 0; i < callbackQueue.length; i++) {
var _callbackQueue$i = callbackQueue[i],
callback = _callbackQueue$i.callback,
component = _callbackQueue$i.component;
callback.call(component);
}
}
var updater = {
// isMounted: function(publicInstance) {
// return false;
// },
enqueueForceUpdate: enqueueSetState,
// enqueueReplaceState: function(publicInstance, completeState) {
// },
enqueueSetState: enqueueSetState
};
return updater;
}
export { createUpdater };