Skip to content

Commit 8d07cc9

Browse files
committed
fix(runtime-vapor): fix slots level mix & simplify implements
1 parent ca314e5 commit 8d07cc9

File tree

1 file changed

+5
-34
lines changed

1 file changed

+5
-34
lines changed

packages/runtime-vapor/src/componentSlots.ts

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)