chore: tweaks
ci / test (push) Waiting to run Details
ci / continuous-release (push) Waiting to run Details

This commit is contained in:
daiwei 2025-07-25 10:16:29 +08:00
parent a65da3aee9
commit b8ceb89a46
3 changed files with 39 additions and 34 deletions

View File

@ -152,7 +152,6 @@ export const createFor = (
// render fallback nodes // render fallback nodes
if (frag.fallback) { if (frag.fallback) {
insert((frag.nodes[0] = frag.fallback()), parent!, parentAnchor) insert((frag.nodes[0] = frag.fallback()), parent!, parentAnchor)
oldBlocks = []
isFallback = true isFallback = true
} }
} else if (!getKey) { } else if (!getKey) {
@ -341,9 +340,9 @@ export const createFor = (
if (!isFallback) { if (!isFallback) {
frag.nodes = [(oldBlocks = newBlocks)] frag.nodes = [(oldBlocks = newBlocks)]
if (parentAnchor) { if (parentAnchor) frag.nodes.push(parentAnchor)
frag.nodes.push(parentAnchor) } else {
} oldBlocks = []
} }
setActiveSub(prevSub) setActiveSub(prevSub)
} }

View File

@ -73,38 +73,53 @@ export class DynamicFragment extends VaporFragment {
} }
if (this.fallback) { if (this.fallback) {
parent && remove(this.nodes, parent) // set fallback for nested fragments
const scope = this.scope || (this.scope = new EffectScope()) const isFrag = isFragment(this.nodes)
scope.run(() => { if (isFrag) {
// handle nested fragment setFragmentFallback(this.nodes as VaporFragment, this.fallback)
if (isFragment(this.nodes)) { }
ensureFallback(this.nodes, this.fallback!)
} else if (!isValidBlock(this.nodes)) {
this.nodes = this.fallback!() || []
}
})
parent && insert(this.nodes, parent, this.anchor) if (!isValidBlock(this.nodes)) {
parent && remove(this.nodes, parent)
const scope = this.scope || (this.scope = new EffectScope())
scope.run(() => {
if (isFrag) {
// render fragment's fallback
renderFragmentFallback(this.nodes as VaporFragment)
} else {
this.nodes = this.fallback!() || []
}
})
parent && insert(this.nodes, parent, this.anchor)
}
} }
setActiveSub(prevSub) setActiveSub(prevSub)
} }
} }
function ensureFallback(fragment: VaporFragment, fallback: BlockFn): void { function setFragmentFallback(
if (!fragment.fallback) fragment.fallback = fallback fragment: VaporFragment,
fallback: BlockFn | undefined,
): void {
if (!fragment.fallback) {
fragment.fallback = fallback
}
if (isFragment(fragment.nodes)) {
setFragmentFallback(fragment.nodes, fallback)
}
}
if (fragment instanceof DynamicFragment) { function renderFragmentFallback(fragment: VaporFragment): void {
if (fragment instanceof ForFragment) {
fragment.nodes[0] = [fragment.fallback!() || []] as Block[]
} else if (fragment instanceof DynamicFragment) {
const nodes = fragment.nodes const nodes = fragment.nodes
if (isFragment(nodes)) { if (isFragment(nodes)) {
ensureFallback(nodes, fallback) renderFragmentFallback(nodes)
} else if (!isValidBlock(nodes)) { } else {
fragment.update(fragment.fallback) fragment.update(fragment.fallback)
} }
} else if (fragment instanceof ForFragment) {
if (!isValidBlock(fragment.nodes[0])) {
fragment.nodes[0] = [fallback() || []] as Block[]
}
} else { } else {
// vdom slots // vdom slots
} }

View File

@ -129,16 +129,7 @@ export function createSlot(
fragment.fallback = fallback fragment.fallback = fallback
// create and cache bound version of the slot to make it stable // create and cache bound version of the slot to make it stable
// so that we avoid unnecessary updates if it resolves to the same slot // so that we avoid unnecessary updates if it resolves to the same slot
fragment.update( fragment.update(slot._bound || (slot._bound = () => slot(slotProps)))
slot._bound ||
(slot._bound = () => {
const slotContent = slot(slotProps)
if (slotContent instanceof DynamicFragment) {
slotContent.fallback = fallback
}
return slotContent
}),
)
} else { } else {
fragment.update(fallback) fragment.update(fallback)
} }