@@ -11,8 +11,7 @@ import {
11
11
openBlock ,
12
12
createBlock ,
13
13
Fragment ,
14
- VNode ,
15
- setBlockTracking
14
+ VNode
16
15
} from '../vnode'
17
16
import { PatchFlags , SlotFlags } from '@vue/shared'
18
17
import { warn } from '../warning'
@@ -39,7 +38,14 @@ export function renderSlot(
39
38
currentRenderingInstance ! . parent . isCE )
40
39
) {
41
40
if ( name !== 'default' ) props . name = name
42
- return createVNode ( 'slot' , props , fallback && getFallbackVNode ( fallback ) )
41
+ let renderFallback = false
42
+ const node = createVNode (
43
+ 'slot' ,
44
+ props ,
45
+ fallback && ( ( renderFallback = true ) , fallback ( ) )
46
+ )
47
+ if ( renderFallback ) node . patchFlag = PatchFlags . BAIL
48
+ return node
43
49
}
44
50
45
51
let slot = slots [ name ]
@@ -60,6 +66,7 @@ export function renderSlot(
60
66
if ( slot && ( slot as ContextualRenderFn ) . _c ) {
61
67
; ( slot as ContextualRenderFn ) . _d = false
62
68
}
69
+ let renderFallback = false
63
70
openBlock ( )
64
71
const validSlotContent = slot && ensureValidVNode ( slot ( props ) )
65
72
const rendered = createBlock (
@@ -72,7 +79,7 @@ export function renderSlot(
72
79
( validSlotContent && ( validSlotContent as any ) . key ) ||
73
80
`_${ name } `
74
81
} ,
75
- validSlotContent || ( fallback ? getFallbackVNode ( fallback ) : [ ] ) ,
82
+ validSlotContent || ( fallback ? ( ( renderFallback = true ) , fallback ( ) ) : [ ] ) ,
76
83
validSlotContent && ( slots as RawSlots ) . _ === SlotFlags . STABLE
77
84
? PatchFlags . STABLE_FRAGMENT
78
85
: PatchFlags . BAIL
@@ -83,16 +90,10 @@ export function renderSlot(
83
90
if ( slot && ( slot as ContextualRenderFn ) . _c ) {
84
91
; ( slot as ContextualRenderFn ) . _d = true
85
92
}
93
+ if ( renderFallback ) rendered . patchFlag = PatchFlags . BAIL
86
94
return rendered
87
95
}
88
96
89
- function getFallbackVNode ( fallback : ( ) => VNodeArrayChildren ) {
90
- setBlockTracking ( - 1 )
91
- const vnode = fallback ( )
92
- setBlockTracking ( 1 )
93
- return vnode
94
- }
95
-
96
97
function ensureValidVNode ( vnodes : VNodeArrayChildren ) {
97
98
return vnodes . some ( child => {
98
99
if ( ! isVNode ( child ) ) return true
0 commit comments