@@ -51,7 +51,6 @@ export function initSlots(
5151 }
5252
5353 instance . slots = shallowReactive ( { } )
54- const renderedSlotKeys : Set < string > [ ] = [ ]
5554 /**
5655 * Maintain a queue for each slot name, so that we can
5756 * render the next slot when the highest level slot was removed
@@ -70,38 +69,24 @@ export function initSlots(
7069 const isDynamicSlot = isDynamicSlotFn ( slots )
7170 if ( isDynamicSlot ) {
7271 firstEffect ( instance , ( ) => {
73- const renderedKeys = ( renderedSlotKeys [ index ] ||= new Set ( ) )
7472 let dynamicSlot = slots ( )
7573 // cleanup slots and re-calc to avoid diffing slots between renders
7674 // cleanup will return a slotNames array contains the slot names that need to be restored
7775 const restoreSlotNames = cleanupSlot ( index )
7876 if ( isArray ( dynamicSlot ) ) {
7977 for ( const slot of dynamicSlot ) {
80- registerSlot ( slot . name , slot . fn , index , renderedKeys )
78+ registerSlot ( slot . name , slot . fn , index )
8179 }
8280 } else if ( dynamicSlot ) {
83- registerSlot ( dynamicSlot . name , dynamicSlot . fn , index , renderedKeys )
81+ registerSlot ( dynamicSlot . name , dynamicSlot . fn , index )
8482 }
8583 // restore after re-calc slots
8684 if ( restoreSlotNames . length ) {
8785 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 ]
9187 addSlot ( key , restoreFn )
9288 }
9389 }
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- }
10590 } )
10691 } else {
10792 for ( const name in slots ) {
@@ -119,36 +104,22 @@ export function initSlots(
119104 slotsQueue [ slotName ] = slotsQueue [ slotName ] . filter ( ( [ l ] ) => l !== level )
120105 if ( ! slotsQueue [ slotName ] . length ) {
121106 delete slotsQueue [ slotName ]
107+ delete instance . slots [ slotName ]
122108 return
123109 }
124110 // restore next slot if the removed slots was the highest level slot
125111 if ( index === 0 ) {
126- renderedSlotKeys [ level ] && renderedSlotKeys [ level ] . delete ( slotName )
127112 restoreSlotNames . push ( slotName )
128113 }
129114 }
130115 } )
131116 return restoreSlotNames
132117 }
133118
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 ) {
140120 slotsQueue [ name ] ||= [ ]
141121 slotsQueue [ name ] . push ( [ level , slot ] )
142122 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
152123 addSlot ( name , slotsQueue [ name ] [ 0 ] [ 1 ] )
153124 }
154125
0 commit comments