Match-id-008af88bfa5eb7487150476ddae80d57f9c57b0a

This commit is contained in:
* 2022-02-17 11:08:43 +08:00 committed by *
parent 3f08ed229f
commit 9a1b0add4b
6 changed files with 26 additions and 8 deletions

View File

@ -71,7 +71,7 @@ export function handleRenderThrowError(
// vNode抛出了异常标记Interrupted中断 // vNode抛出了异常标记Interrupted中断
FlagUtils.markInterrupted(sourceVNode); FlagUtils.markInterrupted(sourceVNode);
// dirtyNodes 不再有效 // dirtyNodes 不再有效
sourceVNode.dirtyNodes = []; sourceVNode.dirtyNodes = null;
// error是个promise // error是个promise
if (error !== null && typeof error === 'object' && typeof error.then === 'function') { if (error !== null && typeof error === 'object' && typeof error.then === 'function') {

View File

@ -57,10 +57,20 @@ function resetProcessingVariables(startUpdateVNode: VNode) {
// 收集有变化的节点在submit阶段继续处理 // 收集有变化的节点在submit阶段继续处理
function collectDirtyNodes(vNode: VNode, parent: VNode): void { function collectDirtyNodes(vNode: VNode, parent: VNode): void {
// 将子树和此vNode的所有效果附加到父树的效果列表中子项的完成顺序会影响副作用顺序。 // 将子树和此vNode的所有效果附加到父树的效果列表中子项的完成顺序会影响副作用顺序。
parent.dirtyNodes.push(...vNode.dirtyNodes); if (vNode.dirtyNodes !== null && vNode.dirtyNodes.length) {
if (parent.dirtyNodes === null) {
parent.dirtyNodes = [...vNode.dirtyNodes];
} else {
parent.dirtyNodes.push(...vNode.dirtyNodes);
}
}
if (FlagUtils.hasAnyFlag(vNode)) { if (FlagUtils.hasAnyFlag(vNode)) {
parent.dirtyNodes.push(vNode); if (parent.dirtyNodes === null) {
parent.dirtyNodes = [vNode];
} else {
parent.dirtyNodes.push(vNode);
}
} }
} }

View File

@ -27,6 +27,10 @@ function isNoKeyFragment(child: any) {
// 清除单个节点 // 清除单个节点
function deleteVNode(parentNode: VNode, delVNode: VNode): void { function deleteVNode(parentNode: VNode, delVNode: VNode): void {
FlagUtils.setDeletion(delVNode); FlagUtils.setDeletion(delVNode);
if (parentNode.dirtyNodes === null) {
parentNode.dirtyNodes = [delVNode];
return;
}
parentNode.dirtyNodes.push(delVNode); parentNode.dirtyNodes.push(delVNode);
} }

View File

@ -40,11 +40,15 @@ export function submitToRender(treeRoot) {
if (FlagUtils.hasAnyFlag(startVNode)) { if (FlagUtils.hasAnyFlag(startVNode)) {
// 把自己加上 // 把自己加上
startVNode.dirtyNodes.push(startVNode); if (startVNode.dirtyNodes === null) {
startVNode.dirtyNodes = [startVNode];
} else {
startVNode.dirtyNodes.push(startVNode);
}
} }
const dirtyNodes = startVNode.dirtyNodes; const dirtyNodes = startVNode.dirtyNodes;
if (dirtyNodes.length) { if (dirtyNodes !== null && dirtyNodes.length) {
const preMode = copyExecuteMode(); const preMode = copyExecuteMode();
changeMode(InRender, true); changeMode(InRender, true);
@ -60,7 +64,7 @@ export function submitToRender(treeRoot) {
// after submit阶段 // after submit阶段
afterSubmit(dirtyNodes); afterSubmit(dirtyNodes);
setExecuteMode(preMode) setExecuteMode(preMode);
} }
if (isSchedulingEffects()) { if (isSchedulingEffects()) {

View File

@ -35,7 +35,7 @@ export class VNode {
suspenseChildStatus: string = ''; // Suspense的Children是否显示 suspenseChildStatus: string = ''; // Suspense的Children是否显示
depContexts: Array<ContextType<any>> | null = []; // FunctionComponent和ClassComponent对context的依赖列表 depContexts: Array<ContextType<any>> | null = []; // FunctionComponent和ClassComponent对context的依赖列表
isDepContextChange: boolean = false; // context是否变更 isDepContextChange: boolean = false; // context是否变更
dirtyNodes: Array<VNode> | null = []; // 需要改动的节点数组 dirtyNodes: Array<VNode> | null = null; // 需要改动的节点数组
shouldUpdate: boolean = false; shouldUpdate: boolean = false;
childShouldUpdate: boolean = false; childShouldUpdate: boolean = false;
outerDom: any; outerDom: any;

View File

@ -78,7 +78,7 @@ export function updateVNode(vNode: VNode, vNodeProps?: any): VNode {
vNode.oldRef = vNode.ref; vNode.oldRef = vNode.ref;
FlagUtils.setNoFlags(vNode); FlagUtils.setNoFlags(vNode);
vNode.dirtyNodes = []; vNode.dirtyNodes = null;
vNode.isCreated = false; vNode.isCreated = false;
return vNode; return vNode;