From 78d1821e240348c9ffee9c3a6e8c7129e9e6236d Mon Sep 17 00:00:00 2001 From: Dmitry Sharshakov Date: Sun, 13 Oct 2019 02:44:30 +0300 Subject: [PATCH] refactor(componentProxy): simplify proxy handling (#214) --- packages/runtime-core/src/componentProxy.ts | 61 +++++++++------------ 1 file changed, 26 insertions(+), 35 deletions(-) diff --git a/packages/runtime-core/src/componentProxy.ts b/packages/runtime-core/src/componentProxy.ts index 01324d2c0e..332b645d60 100644 --- a/packages/runtime-core/src/componentProxy.ts +++ b/packages/runtime-core/src/componentProxy.ts @@ -36,6 +36,18 @@ export type ComponentPublicInstance< ExtractComputedReturns & M +const publicPropertiesMap = { + $data: 'data', + $props: 'propsProxy', + $attrs: 'attrs', + $slots: 'slots', + $refs: 'refs', + $parent: 'parent', + $root: 'root', + $emit: 'emit', + $options: 'type' +} + export const PublicInstanceProxyHandlers = { get(target: ComponentInternalInstance, key: string) { const { renderContext, data, props, propsProxy } = target @@ -46,44 +58,23 @@ export const PublicInstanceProxyHandlers = { } else if (hasOwn(props, key)) { // return the value from propsProxy for ref unwrapping and readonly return propsProxy![key] - } else { - // TODO simplify this? + } else if (key === '$el') { + return target.vnode.el + } else if (hasOwn(publicPropertiesMap, key)) { + return target[publicPropertiesMap[key]] + } + // methods are only exposed when options are supported + if (__FEATURE_OPTIONS__) { switch (key) { - case '$data': - return data - case '$props': - return propsProxy - case '$attrs': - return target.attrs - case '$slots': - return target.slots - case '$refs': - return target.refs - case '$parent': - return target.parent - case '$root': - return target.root - case '$emit': - return target.emit - case '$el': - return target.vnode.el - case '$options': - return target.type - default: - // methods are only exposed when options are supported - if (__FEATURE_OPTIONS__) { - switch (key) { - case '$forceUpdate': - return target.update - case '$nextTick': - return nextTick - case '$watch': - return instanceWatch.bind(target) - } - } - return target.user[key] + case '$forceUpdate': + return target.update + case '$nextTick': + return nextTick + case '$watch': + return instanceWatch.bind(target) } } + return target.user[key] }, // this trap is only called in browser-compiled render functions that use // `with (this) {}` -- 2.47.3