Match-id-34cb287f0510c3c16a0ee5a4a7c59da3301ad491
This commit is contained in:
commit
ef3ffc5bce
|
@ -77,3 +77,5 @@ export type Source = {
|
||||||
fileName: string;
|
fileName: string;
|
||||||
lineNumber: number;
|
lineNumber: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type Callback = () => void;
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
* See the Mulan PSL v2 for more details.
|
* See the Mulan PSL v2 for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import type { VNode } from './Types';
|
import type { VNode, Callback } from './Types';
|
||||||
import { FlagUtils, ShouldCapture } from './vnode/VNodeFlags';
|
import { FlagUtils, ShouldCapture } from './vnode/VNodeFlags';
|
||||||
|
|
||||||
export type Update = {
|
export type Update = {
|
||||||
|
@ -22,8 +22,6 @@ export type Update = {
|
||||||
callback: Callback | null;
|
callback: Callback | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type Callback = () => any;
|
|
||||||
|
|
||||||
export type Updates = Array<Update> | null;
|
export type Updates = Array<Update> | null;
|
||||||
|
|
||||||
export enum UpdateState {
|
export enum UpdateState {
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
* See the Mulan PSL v2 for more details.
|
* See the Mulan PSL v2 for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import {Callback} from '../Types';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Component的api setState和forceUpdate在实例生成阶段实现
|
* Component的api setState和forceUpdate在实例生成阶段实现
|
||||||
*/
|
*/
|
||||||
|
@ -29,7 +31,7 @@ class Component<P, S, C> {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
setState(state: S) {
|
setState(state: S, callback?: Callback) {
|
||||||
if (isDev) {
|
if (isDev) {
|
||||||
console.error('Cant not call `this.setState` in the constructor of class component, it will do nothing');
|
console.error('Cant not call `this.setState` in the constructor of class component, it will do nothing');
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,9 @@
|
||||||
|
|
||||||
let isMessageLoopRunning = false;
|
let isMessageLoopRunning = false;
|
||||||
let browserCallback = null;
|
let browserCallback = null;
|
||||||
const { port1, port2 } = new MessageChannel();
|
let port1 = null;
|
||||||
|
let port2 = null;
|
||||||
|
let isTestRuntime = false;
|
||||||
|
|
||||||
export function isOverTime() {
|
export function isOverTime() {
|
||||||
return false;
|
return false;
|
||||||
|
@ -41,21 +43,38 @@ const callRenderTasks = () => {
|
||||||
browserCallback = null;
|
browserCallback = null;
|
||||||
} else {
|
} else {
|
||||||
// 还有task,继续调用
|
// 还有task,继续调用
|
||||||
port2.postMessage(null);
|
asyncCall();
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
port2.postMessage(null);
|
asyncCall();
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
port1.onmessage = callRenderTasks;
|
if (typeof MessageChannel === 'function') {
|
||||||
|
const mc = new MessageChannel();
|
||||||
|
port1 = mc.port1;
|
||||||
|
port1.onmessage = callRenderTasks;
|
||||||
|
port2 = mc.port2;
|
||||||
|
} else {
|
||||||
|
// 测试环境没有 MessageChannel
|
||||||
|
isTestRuntime = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function asyncCall() {
|
||||||
|
if (isTestRuntime) {
|
||||||
|
setTimeout(callRenderTasks, 0);
|
||||||
|
} else {
|
||||||
|
port2.postMessage(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function requestBrowserCallback(callback) {
|
export function requestBrowserCallback(callback) {
|
||||||
browserCallback = callback;
|
browserCallback = callback;
|
||||||
|
|
||||||
if (!isMessageLoopRunning) {
|
if (!isMessageLoopRunning) {
|
||||||
isMessageLoopRunning = true;
|
isMessageLoopRunning = true;
|
||||||
port2.postMessage(null);
|
asyncCall();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue