Match-id-29421900668faf7d435ef9e587e4d8718e0d2524

This commit is contained in:
* 2022-01-30 16:37:20 +08:00 committed by *
commit f294673004
7 changed files with 23 additions and 49 deletions

View File

@ -1,6 +1,6 @@
import type {VNode} from './Types'; import type {VNode} from './Types';
// 当前处理的classVNode用于inst.refs用法中的 // 当前处理的classVNode用于设置inst.refs
let processingClassVNode: VNode | null = null; let processingClassVNode: VNode | null = null;
export function getProcessingClassVNode(): VNode | null { export function getProcessingClassVNode(): VNode | null {
return processingClassVNode; return processingClassVNode;

View File

@ -10,7 +10,7 @@ import { runAsyncEffects } from './submit/HookEffectHandler';
import { handleRenderThrowError } from './ErrorHandler'; import { handleRenderThrowError } from './ErrorHandler';
import componentRenders from './render'; import componentRenders from './render';
import { import {
BuildCompleted, BuildErrored, BuildCompleted,
BuildFatalErrored, BuildFatalErrored,
BuildInComplete, getBuildResult, BuildInComplete, getBuildResult,
getStartVNode, getStartVNode,
@ -37,12 +37,11 @@ import {
updateShouldUpdateOfTree updateShouldUpdateOfTree
} from './vnode/VNodeShouldUpdate'; } from './vnode/VNodeShouldUpdate';
// 当前运行的vNode节点
let processing: VNode | null = null;
// 不可恢复错误 // 不可恢复错误
let unrecoverableErrorDuringBuild: any = null; let unrecoverableErrorDuringBuild: any = null;
// 当前运行的vNode节点
let processing: VNode | null = null;
export function setProcessing(vNode: VNode | null) { export function setProcessing(vNode: VNode | null) {
processing = vNode; processing = vNode;
} }
@ -65,7 +64,7 @@ function collectDirtyNodes(vNode: VNode, parent: VNode): void {
} }
} }
// ============================== 向上递归 ============================== // ============================== 向上冒泡 ==============================
// 尝试完成当前工作单元然后移动到下一个兄弟工作单元。如果没有更多的同级请返回父vNode。 // 尝试完成当前工作单元然后移动到下一个兄弟工作单元。如果没有更多的同级请返回父vNode。
function bubbleVNode(vNode: VNode): void { function bubbleVNode(vNode: VNode): void {
@ -202,18 +201,18 @@ function buildVNodeTree(treeRoot: VNode) {
changeMode(InRender, true); changeMode(InRender, true);
// 计算出开始节点 // 计算出开始节点
const startUpdateVNode = calcStartUpdateVNode(treeRoot); const startVNode = calcStartUpdateVNode(treeRoot);
// 缓存起来 // 缓存起来
setStartVNode(startUpdateVNode); setStartVNode(startVNode);
// 清空toUpdateNodes // 清空toUpdateNodes
treeRoot.toUpdateNodes.clear(); treeRoot.toUpdateNodes.clear();
if (startUpdateVNode.tag !== TreeRoot) { // 不是根节点 if (startVNode.tag !== TreeRoot) { // 不是根节点
// 设置namespace用于createElement // 设置namespace用于createElement
const parentObj = findDomParent(startUpdateVNode); const parentObj = findDomParent(startVNode);
// 当在componentWillUnmount中调用setStateparent可能是null因为startUpdateVNode会被clear // 当在componentWillUnmount中调用setStateparent可能是null因为startVNode会被clear
if (parentObj !== null) { if (parentObj !== null) {
const domParent = parentObj.parent; const domParent = parentObj.parent;
resetNamespaceCtx(domParent); resetNamespaceCtx(domParent);
@ -221,20 +220,20 @@ function buildVNodeTree(treeRoot: VNode) {
} }
// 恢复父节点的context // 恢复父节点的context
recoverParentsContextCtx(startUpdateVNode); recoverParentsContextCtx(startVNode);
} }
// 重置环境变量,为重新进行深度遍历做准备 // 重置环境变量,为重新进行深度遍历做准备
resetProcessingVariables(startUpdateVNode); resetProcessingVariables(startVNode);
do { while (processing !== null) {
try { try {
while (processing !== null) { while (processing !== null) {
// 捕获创建 vNodes // 捕获创建 vNodes
const next = captureVNode(processing); const next = captureVNode(processing);
if (next === null) { if (next === null) {
// 如果没有产生新的,那么就完成当前节点,向上遍历 // 如果没有子节点,那么就完成当前节点,开始冒泡
bubbleVNode(processing); bubbleVNode(processing);
} else { } else {
processing = next; processing = next;
@ -242,14 +241,10 @@ function buildVNodeTree(treeRoot: VNode) {
} }
setProcessingClassVNode(null); setProcessingClassVNode(null);
break;
} catch (thrownValue) { } catch (thrownValue) {
handleError(treeRoot, thrownValue); handleError(treeRoot, thrownValue);
} }
} while (true); }
processing = null;
setExecuteMode(preMode); setExecuteMode(preMode);
} }
@ -314,12 +309,6 @@ export function launchUpdateFromVNode(vNode: VNode) {
} }
} }
export function setBuildResultError() {
if (getBuildResult() !== BuildCompleted) {
setBuildResult(BuildErrored);
}
}
// ============================== HorizonDOM使用 ============================== // ============================== HorizonDOM使用 ==============================
export function runDiscreteUpdates() { export function runDiscreteUpdates() {
if (checkMode(ByAsync) || checkMode(InRender)) { if (checkMode(ByAsync) || checkMode(InRender)) {

View File

@ -14,8 +14,6 @@ import {runAsync} from '../taskExecutor/TaskExecutor';
import { import {
copyExecuteMode, InRender, setExecuteMode,changeMode copyExecuteMode, InRender, setExecuteMode,changeMode
} from '../ExecuteMode'; } from '../ExecuteMode';
import {handleSubmitError} from '../ErrorHandler';
import {clearDirtyNodes} from './Submit';
import {EffectConstant} from '../hooks/EffectConstant'; import {EffectConstant} from '../hooks/EffectConstant';
let hookEffects: Array<HookEffect | VNode> = []; let hookEffects: Array<HookEffect | VNode> = [];
@ -81,7 +79,7 @@ export function runAsyncEffects() {
try { try {
destroy(); destroy();
} catch (error) { } catch (error) {
handleSubmitError(vNode, error); // 不处理副作用阶段抛出的异常
} }
} }
}); });
@ -95,13 +93,10 @@ export function runAsyncEffects() {
effect.removeEffect = create(); effect.removeEffect = create();
} catch (error) { } catch (error) {
handleSubmitError(vNode, error); // 不处理副作用阶段抛出的异常
} }
}); });
// 清理dirtyNodes
clearDirtyNodes(root.dirtyNodes);
setExecuteMode(preMode); setExecuteMode(preMode);
callRenderQueueImmediate(); callRenderQueueImmediate();

View File

@ -70,8 +70,6 @@ export function submitToRender(treeRoot) {
// 记录root说明这个root有副作用要执行 // 记录root说明这个root有副作用要执行
setHookEffectRoot(treeRoot); setHookEffectRoot(treeRoot);
} else {
clearDirtyNodes(dirtyNodes);
} }
// 统计root同步重渲染的次数如果太多可能是无线循环 // 统计root同步重渲染的次数如果太多可能是无线循环
@ -197,13 +195,3 @@ export function checkLoopingUpdateLimit() {
); );
} }
} }
// 清理dirtyNodes
export function clearDirtyNodes(dirtyNodes) {
dirtyNodes.forEach(node => {
if (node.flags.Deletion) {
node.realNode = null;
node.next = null;
}
});
}

View File

@ -41,8 +41,9 @@ export class FlagUtils {
static hasAnyFlag(node: VNode) { // 有标志位 static hasAnyFlag(node: VNode) { // 有标志位
const flags = node.flags; const flags = node.flags;
const arrLength = FlagArr.length; const arrLength = FlagArr.length;
for(let i = 0; i < arrLength; i++) { let key;
const key = FlagArr[i]; for (let i = 0; i < arrLength; i++) {
key = FlagArr[i];
if (flags[key]) { if (flags[key]) {
return true; return true;
} }
@ -92,7 +93,6 @@ export class FlagUtils {
static markForceUpdate(node: VNode) { static markForceUpdate(node: VNode) {
node.flags.ForceUpdate = true; node.flags.ForceUpdate = true;
} }
static markClear(node: VNode) { static markClear(node: VNode) {
node.flags.Clear = true; node.flags.Clear = true;
} }

View File

@ -56,6 +56,7 @@ export function updateParentsChildShouldUpdate(vNode: VNode) {
let isShouldUpdate = vNode.shouldUpdate || vNode.childShouldUpdate; let isShouldUpdate = vNode.shouldUpdate || vNode.childShouldUpdate;
if (isShouldUpdate) { // 开始节点是shouldUpdate或childShouldUpdate if (isShouldUpdate) { // 开始节点是shouldUpdate或childShouldUpdate
// 更新从当前节点到根节点的childShouldUpdate为true
setParentsChildShouldUpdate(node); setParentsChildShouldUpdate(node);
} else { } else {
while (node !== null) { while (node !== null) {

View File

@ -81,7 +81,6 @@ export function clearVNode(vNode: VNode) {
vNode.next = null; vNode.next = null;
vNode.depContexts = []; vNode.depContexts = [];
vNode.dirtyNodes = []; vNode.dirtyNodes = [];
vNode.oldProps = null;
vNode.state = null; vNode.state = null;
vNode.hooks = []; vNode.hooks = [];
vNode.suspenseChildStatus = ''; vNode.suspenseChildStatus = '';
@ -91,7 +90,9 @@ export function clearVNode(vNode: VNode) {
vNode.changeList = null; vNode.changeList = null;
vNode.effectList = []; vNode.effectList = [];
vNode.updates = null; vNode.updates = null;
vNode.realNode = null;
vNode.oldProps = null;
vNode.oldHooks = []; vNode.oldHooks = [];
vNode.oldState = null; vNode.oldState = null;
vNode.oldRef = null; vNode.oldRef = null;