From: Evan You Date: Mon, 10 Jun 2024 09:37:32 +0000 (+0800) Subject: refactor(runtime-core): extract getComponentPublicInstance helper X-Git-Tag: v3.4.28~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9daf90e29fec5f88dade153f242d5c39f6504fe6;p=thirdparty%2Fvuejs%2Fcore.git refactor(runtime-core): extract getComponentPublicInstance helper --- diff --git a/packages/runtime-core/src/apiCreateApp.ts b/packages/runtime-core/src/apiCreateApp.ts index b7eb399f72..b3373dc866 100644 --- a/packages/runtime-core/src/apiCreateApp.ts +++ b/packages/runtime-core/src/apiCreateApp.ts @@ -3,7 +3,7 @@ import { type ComponentInternalInstance, type ConcreteComponent, type Data, - getExposeProxy, + getComponentPublicInstance, validateComponentName, } from './component' import type { @@ -358,7 +358,7 @@ export function createAppAPI( devtoolsInitApp(app, version) } - return getExposeProxy(vnode.component!) || vnode.component!.proxy + return getComponentPublicInstance(vnode.component!) } else if (__DEV__) { warn( `App has already been mounted.\n` + diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index 70a3716a3e..93b3ad9430 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -566,6 +566,7 @@ export function createComponentInstance( exposed: null, exposeProxy: null, withProxy: null, + provides: parent ? parent.provides : Object.create(appContext.provides), accessCache: null!, renderCache: [], @@ -1107,7 +1108,9 @@ export function createSetupContext( } } -export function getExposeProxy(instance: ComponentInternalInstance) { +export function getComponentPublicInstance( + instance: ComponentInternalInstance, +) { if (instance.exposed) { return ( instance.exposeProxy || @@ -1124,6 +1127,8 @@ export function getExposeProxy(instance: ComponentInternalInstance) { }, })) ) + } else { + return instance.proxy } } diff --git a/packages/runtime-core/src/componentPublicInstance.ts b/packages/runtime-core/src/componentPublicInstance.ts index 52801e172a..fd227774d5 100644 --- a/packages/runtime-core/src/componentPublicInstance.ts +++ b/packages/runtime-core/src/componentPublicInstance.ts @@ -1,7 +1,7 @@ import { type ComponentInternalInstance, type Data, - getExposeProxy, + getComponentPublicInstance, isStatefulComponent, } from './component' import { nextTick, queueJob } from './scheduler' @@ -256,7 +256,7 @@ const getPublicInstance = ( i: ComponentInternalInstance | null, ): ComponentPublicInstance | ComponentInternalInstance['exposed'] | null => { if (!i) return null - if (isStatefulComponent(i)) return getExposeProxy(i) || i.proxy + if (isStatefulComponent(i)) return getComponentPublicInstance(i) return getPublicInstance(i.parent) } diff --git a/packages/runtime-core/src/directives.ts b/packages/runtime-core/src/directives.ts index feff9ad268..b2618c03a6 100644 --- a/packages/runtime-core/src/directives.ts +++ b/packages/runtime-core/src/directives.ts @@ -17,7 +17,7 @@ import { warn } from './warning' import { type ComponentInternalInstance, type Data, - getExposeProxy, + getComponentPublicInstance, } from './component' import { currentRenderingInstance } from './componentRenderContext' import { ErrorCodes, callWithAsyncErrorHandling } from './errorHandling' @@ -27,7 +27,7 @@ import { pauseTracking, resetTracking } from '@vue/reactivity' import { traverse } from './apiWatch' export interface DirectiveBinding { - instance: ComponentPublicInstance | null + instance: ComponentPublicInstance | Record | null value: V oldValue: V | null arg?: string @@ -92,9 +92,7 @@ export function withDirectives( __DEV__ && warn(`withDirectives can only be used inside render functions.`) return vnode } - const instance = - (getExposeProxy(currentRenderingInstance) as ComponentPublicInstance) || - currentRenderingInstance.proxy + const instance = getComponentPublicInstance(currentRenderingInstance) const bindings: DirectiveBinding[] = vnode.dirs || (vnode.dirs = []) for (let i = 0; i < directives.length; i++) { let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i] diff --git a/packages/runtime-core/src/rendererTemplateRef.ts b/packages/runtime-core/src/rendererTemplateRef.ts index b652edeac4..d9e7a22f42 100644 --- a/packages/runtime-core/src/rendererTemplateRef.ts +++ b/packages/runtime-core/src/rendererTemplateRef.ts @@ -10,12 +10,12 @@ import { remove, } from '@vue/shared' import { isAsyncWrapper } from './apiAsyncComponent' -import { getExposeProxy } from './component' import { warn } from './warning' import { isRef } from '@vue/reactivity' import { ErrorCodes, callWithErrorHandling } from './errorHandling' import type { SchedulerJob } from './scheduler' import { queuePostRenderEffect } from './renderer' +import { getComponentPublicInstance } from './component' /** * Function for handling a template ref @@ -48,7 +48,7 @@ export function setRef( const refValue = vnode.shapeFlag & ShapeFlags.STATEFUL_COMPONENT - ? getExposeProxy(vnode.component!) || vnode.component!.proxy + ? getComponentPublicInstance(vnode.component!) : vnode.el const value = isUnmount ? null : refValue