@@ -51,7 +51,6 @@ export function initSlots(
51
51
}
52
52
53
53
instance . slots = shallowReactive ( { } )
54
- const renderedSlotKeys : Set < string > [ ] = [ ]
55
54
/**
56
55
* Maintain a queue for each slot name, so that we can
57
56
* render the next slot when the highest level slot was removed
@@ -70,38 +69,24 @@ export function initSlots(
70
69
const isDynamicSlot = isDynamicSlotFn ( slots )
71
70
if ( isDynamicSlot ) {
72
71
firstEffect ( instance , ( ) => {
73
- const renderedKeys = ( renderedSlotKeys [ index ] ||= new Set ( ) )
74
72
let dynamicSlot = slots ( )
75
73
// cleanup slots and re-calc to avoid diffing slots between renders
76
74
// cleanup will return a slotNames array contains the slot names that need to be restored
77
75
const restoreSlotNames = cleanupSlot ( index )
78
76
if ( isArray ( dynamicSlot ) ) {
79
77
for ( const slot of dynamicSlot ) {
80
- registerSlot ( slot . name , slot . fn , index , renderedKeys )
78
+ registerSlot ( slot . name , slot . fn , index )
81
79
}
82
80
} else if ( dynamicSlot ) {
83
- registerSlot ( dynamicSlot . name , dynamicSlot . fn , index , renderedKeys )
81
+ registerSlot ( dynamicSlot . name , dynamicSlot . fn , index )
84
82
}
85
83
// restore after re-calc slots
86
84
if ( restoreSlotNames . length ) {
87
85
for ( const key of restoreSlotNames ) {
88
- const [ restoreLevel , restoreFn ] = slotsQueue [ key ] [ 0 ]
89
- renderedSlotKeys [ restoreLevel ] &&
90
- renderedSlotKeys [ restoreLevel ] . add ( key )
86
+ const [ _ , restoreFn ] = slotsQueue [ key ] [ 0 ]
91
87
addSlot ( key , restoreFn )
92
88
}
93
89
}
94
- // delete stale slots
95
- for ( const name of renderedKeys ) {
96
- if (
97
- ! ( isArray ( dynamicSlot )
98
- ? dynamicSlot . some ( s => s . name === name )
99
- : dynamicSlot && dynamicSlot . name === name )
100
- ) {
101
- renderedKeys . delete ( name )
102
- delete instance . slots [ name ]
103
- }
104
- }
105
90
} )
106
91
} else {
107
92
for ( const name in slots ) {
@@ -119,36 +104,22 @@ export function initSlots(
119
104
slotsQueue [ slotName ] = slotsQueue [ slotName ] . filter ( ( [ l ] ) => l !== level )
120
105
if ( ! slotsQueue [ slotName ] . length ) {
121
106
delete slotsQueue [ slotName ]
107
+ delete instance . slots [ slotName ]
122
108
return
123
109
}
124
110
// restore next slot if the removed slots was the highest level slot
125
111
if ( index === 0 ) {
126
- renderedSlotKeys [ level ] && renderedSlotKeys [ level ] . delete ( slotName )
127
112
restoreSlotNames . push ( slotName )
128
113
}
129
114
}
130
115
} )
131
116
return restoreSlotNames
132
117
}
133
118
134
- function registerSlot (
135
- name : string ,
136
- slot : Slot ,
137
- level : number ,
138
- renderedKeys ?: Set < string > ,
139
- ) {
119
+ function registerSlot ( name : string , slot : Slot , level : number ) {
140
120
slotsQueue [ name ] ||= [ ]
141
121
slotsQueue [ name ] . push ( [ level , slot ] )
142
122
slotsQueue [ name ] . sort ( ( a , b ) => b [ 0 ] - a [ 0 ] )
143
- // hide old slot if the registered slot is the highest level
144
- if ( slotsQueue [ name ] [ 1 ] ) {
145
- const hidenLevel = slotsQueue [ name ] [ 1 ] [ 0 ]
146
- renderedSlotKeys [ hidenLevel ] && renderedSlotKeys [ hidenLevel ] . delete ( name )
147
- }
148
- if ( slotsQueue [ name ] [ 0 ] [ 0 ] === level ) {
149
- renderedKeys && renderedKeys . add ( name )
150
- }
151
- // render the highest level slot
152
123
addSlot ( name , slotsQueue [ name ] [ 0 ] [ 1 ] )
153
124
}
154
125
0 commit comments