|
|
@@ -36,6 +36,18 @@ export type ComponentPublicInstance<
|
|
|
ExtractComputedReturns<C> &
|
|
|
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) {}`
|