diff --git a/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts b/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts index 8c28d88102d..ef4f3ef8355 100644 --- a/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts +++ b/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts @@ -734,4 +734,54 @@ describe('renderer: optimized mode', () => { await nextTick() expect(inner(root)).toBe('
1
') }) + + // #3779 + test('treat slots manually written by the user as dynamic', async () => { + const Middle = { + setup(props: any, { slots }: any) { + return slots.default! + } + } + + const Comp = { + setup(props: any, { slots }: any) { + return () => { + return ( + openBlock(), + createBlock('div', null, [ + createVNode(Middle, null, { + default: withCtx( + () => [ + createVNode('div', null, [renderSlot(slots, 'default')]) + ], + undefined + ), + _: 3 /* FORWARDED */ + }) + ]) + ) + } + } + } + + const loading = ref(false) + const app = createApp({ + setup() { + return () => { + // important: write the slot content here + const content = h('span', loading.value ? 'loading' : 'loaded') + return h(Comp, null, { + default: () => content + }) + } + } + }) + + app.mount(root) + expect(inner(root)).toBe('