refactor(componentProxy): simplify proxy handling (#214)
This commit is contained in:
parent
5d98c51b74
commit
78d1821e24
@ -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) {}`
|
||||
|
Loading…
Reference in New Issue
Block a user