Match-id-07aa005631c43e03458d2e692810427c7c1cfb59

This commit is contained in:
* 2022-03-29 15:49:54 +08:00 committed by *
parent 867cb48365
commit 0b56fb4104
4 changed files with 25 additions and 18 deletions

View File

@ -1,18 +1,19 @@
import type {VNode} from '../Types'; import type { VNode } from '../Types';
import {mergeDefaultProps} from './LazyComponent'; import { mergeDefaultProps } from './LazyComponent';
import {resetDepContexts} from '../components/context/Context'; import { resetDepContexts } from '../components/context/Context';
import {exeFunctionHook} from '../hooks/HookMain'; import { exeFunctionHook } from '../hooks/HookMain';
import {ForwardRef} from '../vnode/VNodeTags'; import { ForwardRef } from '../vnode/VNodeTags';
import {FlagUtils, Update} from '../vnode/VNodeFlags'; import { FlagUtils, Update } from '../vnode/VNodeFlags';
import {getContextChangeCtx} from '../ContextSaver'; import { getContextChangeCtx } from '../ContextSaver';
import {onlyUpdateChildVNodes} from '../vnode/VNodeCreator'; import { onlyUpdateChildVNodes } from '../vnode/VNodeCreator';
import { createChildrenByDiff } from '../diff/nodeDiffComparator'; import { createChildrenByDiff } from '../diff/nodeDiffComparator';
// 在useState, useReducer的时候会触发state变化 // 在useState, useReducer的时候会触发state变化
let stateChange = false; let stateChange = false;
export function bubbleRender() {} export function bubbleRender() {
}
// 判断children是否可以复用 // 判断children是否可以复用
function checkIfCanReuseChildren(processing: VNode, shouldUpdate?: boolean) { function checkIfCanReuseChildren(processing: VNode, shouldUpdate?: boolean) {
@ -51,8 +52,14 @@ export function captureFunctionComponent(
processing: VNode, processing: VNode,
funcComp: any, funcComp: any,
nextProps: any, nextProps: any,
shouldUpdate?: boolean shouldUpdate?: boolean,
) { ) {
if (processing.isSuspended) {
processing.isCreated = true;
processing.isSuspended = false;
FlagUtils.markAddition(processing);
}
resetDepContexts(processing); resetDepContexts(processing);
const isCanReuse = checkIfCanReuseChildren(processing, shouldUpdate); const isCanReuse = checkIfCanReuseChildren(processing, shouldUpdate);
@ -89,7 +96,7 @@ export function captureRender(processing: VNode, shouldUpdate?: boolean): VNode
processing, processing,
Component, Component,
resolvedProps, resolvedProps,
shouldUpdate shouldUpdate,
); );
} }

View File

@ -4,6 +4,7 @@ import {FlagUtils, Interrupted} from '../vnode/VNodeFlags';
import {onlyUpdateChildVNodes, updateVNode, createFragmentVNode} from '../vnode/VNodeCreator'; import {onlyUpdateChildVNodes, updateVNode, createFragmentVNode} from '../vnode/VNodeCreator';
import { import {
ClassComponent, ClassComponent,
FunctionComponent,
IncompleteClassComponent, IncompleteClassComponent,
SuspenseComponent, SuspenseComponent,
} from '../vnode/VNodeTags'; } from '../vnode/VNodeTags';
@ -21,7 +22,7 @@ export enum SuspenseChildStatus {
// 创建fallback子节点 // 创建fallback子节点
function createFallback(processing: VNode, fallbackChildren) { function createFallback(processing: VNode, fallbackChildren) {
const childFragment: VNode = processing.child; const childFragment: VNode = processing.child!;
let fallbackFragment; let fallbackFragment;
childFragment.childShouldUpdate = false; childFragment.childShouldUpdate = false;
@ -92,11 +93,9 @@ export function captureSuspenseComponent(processing: VNode) {
if (showFallback) { if (showFallback) {
processing.suspenseDidCapture = false; processing.suspenseDidCapture = false;
const nextFallbackChildren = nextProps.fallback; const nextFallbackChildren = nextProps.fallback;
debugger
return createFallback(processing, nextFallbackChildren); return createFallback(processing, nextFallbackChildren);
} else { } else {
const newChildren = nextProps.children; const newChildren = nextProps.children;
debugger
return createSuspenseChildren(processing, newChildren); return createSuspenseChildren(processing, newChildren);
} }
} }
@ -187,6 +186,9 @@ export function handleSuspenseChildThrowError(parent: VNode, processing: VNode,
} }
} }
if(processing.tag === FunctionComponent) {
processing.isSuspended = true;
}
// 应该抛出promise未完成更新标志待更新 // 应该抛出promise未完成更新标志待更新
processing.shouldUpdate = true; processing.shouldUpdate = true;
@ -225,7 +227,6 @@ export function listenToPromise(suspenseVNode: VNode) {
// 记录已经监听的 promise // 记录已经监听的 promise
let promiseCache = suspenseVNode.realNode; let promiseCache = suspenseVNode.realNode;
if (promiseCache === null) { if (promiseCache === null) {
// @ts-ignore
promiseCache = new PossiblyWeakSet(); promiseCache = new PossiblyWeakSet();
suspenseVNode.realNode = new PossiblyWeakSet(); suspenseVNode.realNode = new PossiblyWeakSet();
} }

View File

@ -30,7 +30,7 @@ export class VNode {
updates: any[] | null; // TreeRoot和ClassComponent使用的更新数组 updates: any[] | null; // TreeRoot和ClassComponent使用的更新数组
stateCallbacks: any[] | null; // 存放存在setState的第二个参数和HorizonDOM.render的第三个参数所在的node数组 stateCallbacks: any[] | null; // 存放存在setState的第二个参数和HorizonDOM.render的第三个参数所在的node数组
isForceUpdate: boolean; // 是否使用强制更新 isForceUpdate: boolean; // 是否使用强制更新
isSuspended = false; // 是否被suspense打断更新
state: any; // ClassComponent和TreeRoot的状态 state: any; // ClassComponent和TreeRoot的状态
hooks: Array<Hook<any, any>> | null; // 保存hook hooks: Array<Hook<any, any>> | null; // 保存hook
suspenseChildStatus = ''; // Suspense的Children是否显示 suspenseChildStatus = ''; // Suspense的Children是否显示

View File

@ -2,7 +2,7 @@
* vNode结构的变化标志 * vNode结构的变化标志
*/ */
import type { VNode } from '../Types'; import type { VNode } from './VNode';
export const InitFlag = /** */ 0; export const InitFlag = /** */ 0;
@ -41,7 +41,6 @@ export class FlagUtils {
node.flags |= Addition; node.flags |= Addition;
} }
static setAddition(node: VNode) { static setAddition(node: VNode) {
console.log('set addition', node.flags);
node.flags = Addition; node.flags = Addition;
} }