Match-id-5694310a3f51322edad299f66fcfa5c6ac083f95
This commit is contained in:
commit
483d5f38e5
|
@ -7,9 +7,6 @@ import type {
|
||||||
Effect as HookEffect,
|
Effect as HookEffect,
|
||||||
EffectList,
|
EffectList,
|
||||||
} from '../hooks/HookType';
|
} from '../hooks/HookType';
|
||||||
import {
|
|
||||||
callRenderQueueImmediate,
|
|
||||||
} from '../taskExecutor/RenderQueue';
|
|
||||||
import {runAsync} from '../taskExecutor/TaskExecutor';
|
import {runAsync} from '../taskExecutor/TaskExecutor';
|
||||||
import {
|
import {
|
||||||
copyExecuteMode, InRender, setExecuteMode,changeMode
|
copyExecuteMode, InRender, setExecuteMode,changeMode
|
||||||
|
@ -20,7 +17,6 @@ let hookEffects: Array<HookEffect | VNode> = [];
|
||||||
let hookRemoveEffects: Array<HookEffect | VNode> = [];
|
let hookRemoveEffects: Array<HookEffect | VNode> = [];
|
||||||
// 是否正在异步调度effects
|
// 是否正在异步调度effects
|
||||||
let isScheduling: boolean = false;
|
let isScheduling: boolean = false;
|
||||||
let hookEffectRoot: VNode | null = null;
|
|
||||||
|
|
||||||
export function setSchedulingEffects(value) {
|
export function setSchedulingEffects(value) {
|
||||||
isScheduling = value;
|
isScheduling = value;
|
||||||
|
@ -29,13 +25,6 @@ export function isSchedulingEffects() {
|
||||||
return isScheduling;
|
return isScheduling;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function setHookEffectRoot(root: VNode | null) {
|
|
||||||
hookEffectRoot = root;
|
|
||||||
}
|
|
||||||
export function getHookEffectRoot() {
|
|
||||||
return hookEffectRoot;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function callUseEffects(vNode: VNode) {
|
export function callUseEffects(vNode: VNode) {
|
||||||
const effectList: EffectList = vNode.effectList;
|
const effectList: EffectList = vNode.effectList;
|
||||||
|
|
||||||
|
@ -58,20 +47,13 @@ export function callUseEffects(vNode: VNode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function runAsyncEffects() {
|
export function runAsyncEffects() {
|
||||||
if (hookEffectRoot === null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const root = hookEffectRoot;
|
|
||||||
hookEffectRoot = null;
|
|
||||||
|
|
||||||
const preMode = copyExecuteMode();
|
const preMode = copyExecuteMode();
|
||||||
changeMode(InRender, true);
|
changeMode(InRender, true);
|
||||||
|
|
||||||
// 调用effect destroy
|
// 调用effect destroy
|
||||||
const removeEffects = hookRemoveEffects;
|
const removeEffects = hookRemoveEffects;
|
||||||
hookRemoveEffects = [];
|
hookRemoveEffects = [];
|
||||||
removeEffects.forEach(({effect, vNode}) => {
|
removeEffects.forEach(({effect}) => {
|
||||||
const destroy = effect.removeEffect;
|
const destroy = effect.removeEffect;
|
||||||
effect.removeEffect = undefined;
|
effect.removeEffect = undefined;
|
||||||
|
|
||||||
|
@ -87,7 +69,7 @@ export function runAsyncEffects() {
|
||||||
// 调用effect create
|
// 调用effect create
|
||||||
const createEffects = hookEffects;
|
const createEffects = hookEffects;
|
||||||
hookEffects = [];
|
hookEffects = [];
|
||||||
createEffects.forEach(({effect, vNode}) => {
|
createEffects.forEach(({effect}) => {
|
||||||
try {
|
try {
|
||||||
const create = effect.effect;
|
const create = effect.effect;
|
||||||
|
|
||||||
|
@ -98,10 +80,6 @@ export function runAsyncEffects() {
|
||||||
});
|
});
|
||||||
|
|
||||||
setExecuteMode(preMode);
|
setExecuteMode(preMode);
|
||||||
|
|
||||||
callRenderQueueImmediate();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 在销毁vNode的时候调用remove
|
// 在销毁vNode的时候调用remove
|
||||||
|
@ -131,10 +109,10 @@ export function callUseLayoutEffectRemove(vNode: VNode) {
|
||||||
const effectList: EffectList = vNode.effectList;
|
const effectList: EffectList = vNode.effectList;
|
||||||
|
|
||||||
const layoutLabel = EffectConstant.LayoutEffect | EffectConstant.DepsChange;
|
const layoutLabel = EffectConstant.LayoutEffect | EffectConstant.DepsChange;
|
||||||
effectList.forEach(item => {
|
effectList.forEach(effect => {
|
||||||
if ((item.effectConstant & layoutLabel) === layoutLabel) {
|
if ((effect.effectConstant & layoutLabel) === layoutLabel) {
|
||||||
const remove = item.removeEffect;
|
const remove = effect.removeEffect;
|
||||||
item.removeEffect = undefined;
|
effect.removeEffect = undefined;
|
||||||
if (typeof remove === 'function') {
|
if (typeof remove === 'function') {
|
||||||
remove();
|
remove();
|
||||||
}
|
}
|
||||||
|
@ -147,10 +125,10 @@ export function callUseLayoutEffectCreate(vNode: VNode) {
|
||||||
const effectList: EffectList = vNode.effectList;
|
const effectList: EffectList = vNode.effectList;
|
||||||
|
|
||||||
const layoutLabel = EffectConstant.LayoutEffect | EffectConstant.DepsChange;
|
const layoutLabel = EffectConstant.LayoutEffect | EffectConstant.DepsChange;
|
||||||
effectList.forEach(item => {
|
effectList.forEach(effect => {
|
||||||
if ((item.effectConstant & layoutLabel) === layoutLabel) {
|
if ((effect.effectConstant & layoutLabel) === layoutLabel) {
|
||||||
const create = item.effect;
|
const create = effect.effect;
|
||||||
item.removeEffect = create();
|
effect.removeEffect = create();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ import {
|
||||||
} from '../ExecuteMode';
|
} from '../ExecuteMode';
|
||||||
import {
|
import {
|
||||||
isSchedulingEffects,
|
isSchedulingEffects,
|
||||||
setSchedulingEffects, setHookEffectRoot,
|
setSchedulingEffects,
|
||||||
} from './HookEffectHandler';
|
} from './HookEffectHandler';
|
||||||
import {getStartVNode} from '../GlobalVar';
|
import {getStartVNode} from '../GlobalVar';
|
||||||
|
|
||||||
|
@ -67,9 +67,6 @@ export function submitToRender(treeRoot) {
|
||||||
|
|
||||||
if (isSchedulingEffects()) {
|
if (isSchedulingEffects()) {
|
||||||
setSchedulingEffects(false);
|
setSchedulingEffects(false);
|
||||||
|
|
||||||
// 记录root,说明这个root有副作用要执行
|
|
||||||
setHookEffectRoot(treeRoot);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 统计root同步重渲染的次数,如果太多可能是无线循环
|
// 统计root同步重渲染的次数,如果太多可能是无线循环
|
||||||
|
|
Loading…
Reference in New Issue