diff --git a/packages/runtime-core/src/apiAsyncComponent.ts b/packages/runtime-core/src/apiAsyncComponent.ts index 62b50a1e..20c3a48f 100644 --- a/packages/runtime-core/src/apiAsyncComponent.ts +++ b/packages/runtime-core/src/apiAsyncComponent.ts @@ -1,7 +1,6 @@ import { PublicAPIComponent, Component, - currentSuspense, currentInstance, ComponentInternalInstance, isInSSRComponentSetup @@ -118,7 +117,7 @@ export function defineAsyncComponent< // suspense-controlled or SSR. if ( - (__FEATURE_SUSPENSE__ && suspensible && currentSuspense) || + (__FEATURE_SUSPENSE__ && suspensible && instance.suspense) || (__NODE_JS__ && isInSSRComponentSetup) ) { return load() diff --git a/packages/runtime-core/src/apiWatch.ts b/packages/runtime-core/src/apiWatch.ts index 9d477ac8..967c77f8 100644 --- a/packages/runtime-core/src/apiWatch.ts +++ b/packages/runtime-core/src/apiWatch.ts @@ -20,7 +20,6 @@ import { import { currentInstance, ComponentInternalInstance, - currentSuspense, Data, isInSSRComponentSetup, recordInstanceBoundEffect @@ -139,7 +138,6 @@ function doWatch( } const instance = currentInstance - const suspense = currentSuspense let getter: () => any if (isArray(source)) { @@ -238,9 +236,7 @@ function doWatch( } } } else { - scheduler = job => { - queuePostRenderEffect(job, suspense) - } + scheduler = job => queuePostRenderEffect(job, instance && instance.suspense) } const runner = effect(getter, { diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index a346eb0c..bf5aaeeb 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -145,6 +145,7 @@ export interface ComponentInternalInstance { emit: Emit // suspense related + suspense: SuspenseBoundary | null asyncDep: Promise | null asyncResolved: boolean @@ -177,7 +178,8 @@ const emptyAppContext = createAppContext() export function createComponentInstance( vnode: VNode, - parent: ComponentInternalInstance | null + parent: ComponentInternalInstance | null, + suspense: SuspenseBoundary | null ) { // inherit parent app context - or - if root, adopt from root vnode const appContext = @@ -213,7 +215,8 @@ export function createComponentInstance( components: Object.create(appContext.components), directives: Object.create(appContext.directives), - // async dependency management + // suspense related + suspense, asyncDep: null, asyncResolved: false, @@ -266,7 +269,6 @@ export function createComponentInstance( } export let currentInstance: ComponentInternalInstance | null = null -export let currentSuspense: SuspenseBoundary | null = null export const getCurrentInstance: () => ComponentInternalInstance | null = () => currentInstance || currentRenderingInstance @@ -351,7 +353,6 @@ function setupStatefulComponent( setup.length > 1 ? createSetupContext(instance) : null) currentInstance = instance - currentSuspense = parentSuspense pauseTracking() const setupResult = callWithErrorHandling( setup, @@ -361,7 +362,6 @@ function setupStatefulComponent( ) resetTracking() currentInstance = null - currentSuspense = null if (isPromise(setupResult)) { if (isSSR) { @@ -478,10 +478,8 @@ function finishComponentSetup( // support for 2.x options if (__FEATURE_OPTIONS__) { currentInstance = instance - currentSuspense = parentSuspense applyOptions(instance, Component) currentInstance = null - currentSuspense = null } } diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index 976022fc..5952abc7 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -1028,7 +1028,8 @@ function baseCreateRenderer( ) => { const instance: ComponentInternalInstance = (initialVNode.component = createComponentInstance( initialVNode, - parentComponent + parentComponent, + parentSuspense )) if (__HMR__ && instance.type.__hmrId) { diff --git a/packages/server-renderer/src/renderToString.ts b/packages/server-renderer/src/renderToString.ts index 5c84ae7a..8cb4b392 100644 --- a/packages/server-renderer/src/renderToString.ts +++ b/packages/server-renderer/src/renderToString.ts @@ -144,7 +144,7 @@ function renderComponentVNode( vnode: VNode, parentComponent: ComponentInternalInstance | null = null ): ResolvedSSRBuffer | Promise { - const instance = createComponentInstance(vnode, parentComponent) + const instance = createComponentInstance(vnode, parentComponent, null) const res = setupComponent( instance, null /* parentSuspense (no need to track for SSR) */,