mirror of https://github.com/vuejs/core.git
perf: use class for SetupContext
This commit is contained in:
parent
d6415d8442
commit
5828f2441f
|
@ -34,20 +34,39 @@ export type FunctionalComponent = SetupFn &
|
|||
displayName?: string
|
||||
}
|
||||
|
||||
export type SetupContext<E = EmitsOptions> = E extends any
|
||||
? {
|
||||
export class SetupContext<E = EmitsOptions> {
|
||||
attrs: Data
|
||||
emit: EmitFn<E>
|
||||
expose: (exposed?: Record<string, any>) => void
|
||||
slots: Readonly<StaticSlots>
|
||||
expose: (exposed?: Record<string, any>) => void
|
||||
|
||||
constructor(instance: ComponentInternalInstance) {
|
||||
this.attrs = instance.attrs
|
||||
this.emit = instance.emit as EmitFn<E>
|
||||
this.slots = instance.slots
|
||||
this.expose = (exposed = {}) => {
|
||||
instance.exposed = exposed
|
||||
}
|
||||
}
|
||||
}
|
||||
: never
|
||||
|
||||
export function createSetupContext(
|
||||
instance: ComponentInternalInstance,
|
||||
): SetupContext {
|
||||
const expose: SetupContext['expose'] = exposed => {
|
||||
if (__DEV__) {
|
||||
// We use getters in dev in case libs like test-utils overwrite instance
|
||||
// properties (overwrites should not be done in prod)
|
||||
return Object.freeze({
|
||||
get attrs() {
|
||||
return getAttrsProxy(instance)
|
||||
},
|
||||
get slots() {
|
||||
return getSlotsProxy(instance)
|
||||
},
|
||||
get emit() {
|
||||
return (event: string, ...args: any[]) => instance.emit(event, ...args)
|
||||
},
|
||||
expose: (exposed?: Record<string, any>) => {
|
||||
if (instance.exposed) {
|
||||
warn(`expose() should be called only once per setup().`)
|
||||
}
|
||||
|
@ -66,32 +85,11 @@ export function createSetupContext(
|
|||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
instance.exposed = exposed || {}
|
||||
}
|
||||
|
||||
if (__DEV__) {
|
||||
// We use getters in dev in case libs like test-utils overwrite instance
|
||||
// properties (overwrites should not be done in prod)
|
||||
return Object.freeze({
|
||||
get attrs() {
|
||||
return getAttrsProxy(instance)
|
||||
},
|
||||
get slots() {
|
||||
return getSlotsProxy(instance)
|
||||
},
|
||||
get emit() {
|
||||
return (event: string, ...args: any[]) => instance.emit(event, ...args)
|
||||
},
|
||||
expose,
|
||||
})
|
||||
}) as SetupContext
|
||||
} else {
|
||||
return {
|
||||
attrs: instance.attrs,
|
||||
emit: instance.emit,
|
||||
slots: instance.slots,
|
||||
expose,
|
||||
}
|
||||
return new SetupContext(instance)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue