refactor(componentProxy): simplify proxy handling (#214)

This commit is contained in:
Dmitry Sharshakov 2019-10-13 02:44:30 +03:00 committed by Evan You
parent 5d98c51b74
commit 78d1821e24

View File

@ -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) {}`