From 9daf90e29fec5f88dade153f242d5c39f6504fe6 Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 10 Jun 2024 17:37:32 +0800 Subject: [PATCH] refactor(runtime-core): extract getComponentPublicInstance helper --- packages/runtime-core/src/apiCreateApp.ts | 4 ++-- packages/runtime-core/src/component.ts | 7 ++++++- packages/runtime-core/src/componentPublicInstance.ts | 4 ++-- packages/runtime-core/src/directives.ts | 8 +++----- packages/runtime-core/src/rendererTemplateRef.ts | 4 ++-- 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/packages/runtime-core/src/apiCreateApp.ts b/packages/runtime-core/src/apiCreateApp.ts index b7eb399f7..b3373dc86 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 70a3716a3..93b3ad943 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 52801e172..fd227774d 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 feff9ad26..b2618c03a 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 b652edeac..d9e7a22f4 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