diff --git a/packages/runtime-core/src/componentSlots.ts b/packages/runtime-core/src/componentSlots.ts index 66a09e5fa1a..aeba4d5c6b0 100644 --- a/packages/runtime-core/src/componentSlots.ts +++ b/packages/runtime-core/src/componentSlots.ts @@ -21,9 +21,7 @@ import { isKeepAlive } from './components/KeepAlive' import { type ContextualRenderFn, withCtx } from './componentRenderContext' import { isHmrUpdating } from './hmr' import { DeprecationTypes, isCompatEnabled } from './compat/compatConfig' -import { toRaw } from '@vue/reactivity' -import { trigger } from '@vue/reactivity' -import { TriggerOpTypes } from '@vue/reactivity' +import { TriggerOpTypes, trigger } from '@vue/reactivity' import { createInternalObject } from './internalObject' export type Slot = ( @@ -167,26 +165,18 @@ export const initSlots = ( instance: ComponentInternalInstance, children: VNodeNormalizedChildren, ) => { + const slots = (instance.slots = createInternalObject()) if (instance.vnode.shapeFlag & ShapeFlags.SLOTS_CHILDREN) { const type = (children as RawSlots)._ if (type) { - // users can get the shallow readonly version of the slots object through `this.$slots`, - // we should avoid the proxy object polluting the slots of the internal instance - instance.slots = toRaw(children as InternalSlots) + extend(slots, children as InternalSlots) // make compiler marker non-enumerable - def(instance.slots, '_', type) + def(slots, '_', type) } else { - normalizeObjectSlots( - children as RawSlots, - (instance.slots = createInternalObject()), - instance, - ) - } - } else { - instance.slots = createInternalObject() - if (children) { - normalizeVNodeSlots(instance, children) + normalizeObjectSlots(children as RawSlots, slots, instance) } + } else if (children) { + normalizeVNodeSlots(instance, children) } }