From: daiwei Date: Fri, 30 May 2025 01:17:04 +0000 (+0800) Subject: chore: update X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c23d63582e3ddc569b84102b22757549b97ea8f0;p=thirdparty%2Fvuejs%2Fcore.git chore: update --- diff --git a/packages/compiler-vapor/src/transform.ts b/packages/compiler-vapor/src/transform.ts index 6d07ebcaf5..763e9612cd 100644 --- a/packages/compiler-vapor/src/transform.ts +++ b/packages/compiler-vapor/src/transform.ts @@ -76,7 +76,7 @@ export class TransformContext { inVOnce: boolean = false inVFor: number = 0 - inSlot: number = 0 + inSlot: boolean = false comment: CommentNode[] = [] component: Set = this.ir.component diff --git a/packages/compiler-vapor/src/transforms/transformSlotOutlet.ts b/packages/compiler-vapor/src/transforms/transformSlotOutlet.ts index a281c90a70..dc2b620ddb 100644 --- a/packages/compiler-vapor/src/transforms/transformSlotOutlet.ts +++ b/packages/compiler-vapor/src/transforms/transformSlotOutlet.ts @@ -5,7 +5,6 @@ import { ErrorCodes, NodeTypes, type SimpleExpressionNode, - type TemplateChildNode, createCompilerError, createSimpleExpression, isStaticArgOf, @@ -100,16 +99,7 @@ export const transformSlotOutlet: NodeTransform = (node, context) => { } return () => { - const { - block: { node: slotNode }, - inSlot, - } = context - const forwarded = - inSlot !== 0 && - slotNode.type === NodeTypes.ELEMENT && - hasForwardedSlots(slotNode.children) - if (forwarded) context.ir.hasForwardedSlot = true - + if (context.inSlot) context.ir.hasForwardedSlot = true exitBlock && exitBlock() context.dynamic.operation = { type: IRNodeTypes.SLOT_OUTLET_NODE, @@ -117,7 +107,7 @@ export const transformSlotOutlet: NodeTransform = (node, context) => { name: slotName, props: irProps, fallback, - forwarded, + forwarded: context.inSlot, } } } @@ -143,20 +133,3 @@ function createFallback( context.reference() return [fallback, exitBlock] } - -function hasForwardedSlots(children: TemplateChildNode[]): boolean { - for (let i = 0; i < children.length; i++) { - const child = children[i] - switch (child.type) { - case NodeTypes.ELEMENT: - if ( - child.tagType === ElementTypes.SLOT || - hasForwardedSlots(child.children) - ) { - return true - } - break - } - } - return false -} diff --git a/packages/compiler-vapor/src/transforms/vSlot.ts b/packages/compiler-vapor/src/transforms/vSlot.ts index 2e767cb41c..525fa323d3 100644 --- a/packages/compiler-vapor/src/transforms/vSlot.ts +++ b/packages/compiler-vapor/src/transforms/vSlot.ts @@ -237,11 +237,11 @@ function createSlotBlock( const block: SlotBlockIRNode = newBlock(slotNode) block.props = dir && dir.exp const exitBlock = context.enterBlock(block) - context.inSlot++ + context.inSlot = true return [ block, () => { - context.inSlot-- + context.inSlot = false exitBlock() }, ] diff --git a/packages/runtime-vapor/__tests__/componentSlots.spec.ts b/packages/runtime-vapor/__tests__/componentSlots.spec.ts index 46bfc3d938..bdbd960363 100644 --- a/packages/runtime-vapor/__tests__/componentSlots.spec.ts +++ b/packages/runtime-vapor/__tests__/componentSlots.spec.ts @@ -554,5 +554,56 @@ describe('component: slots', () => { await nextTick() expect(host.innerHTML).toBe('bar') }) + + test('mixed with non-forwarded slot', async () => { + const Child = defineVaporComponent({ + setup() { + return [createSlot('foo', null)] + }, + }) + const Parent = defineVaporComponent({ + setup() { + const createForwardedSlot = forwardedSlotCreator() + const n2 = createComponent(Child, null, { + foo: () => { + const n0 = createForwardedSlot('foo', null) + return n0 + }, + }) + const n3 = createSlot('default', null) + return [n2, n3] + }, + }) + + const foo = ref('foo') + const { host } = define({ + setup() { + const n2 = createComponent( + Parent, + null, + { + foo: () => { + const n0 = template(' ')() as any + renderEffect(() => setText(n0, foo.value)) + return n0 + }, + default: () => { + const n3 = template(' ')() as any + renderEffect(() => setText(n3, foo.value)) + return n3 + }, + }, + true, + ) + return n2 + }, + }).render() + + expect(host.innerHTML).toBe('foofoo') + + foo.value = 'bar' + await nextTick() + expect(host.innerHTML).toBe('barbar') + }) }) }) diff --git a/packages/runtime-vapor/src/componentSlots.ts b/packages/runtime-vapor/src/componentSlots.ts index 00ae4ea29a..19e9b5b6d1 100644 --- a/packages/runtime-vapor/src/componentSlots.ts +++ b/packages/runtime-vapor/src/componentSlots.ts @@ -93,11 +93,8 @@ export function forwardedSlotCreator(): ( fallback?: VaporSlot, ) => Block { const instance = currentInstance as VaporComponentInstance - return ( - name: string | (() => string), - rawProps?: LooseRawProps | null, - fallback?: VaporSlot, - ) => createSlot(name, rawProps, fallback, instance) + return (name, rawProps, fallback) => + createSlot(name, rawProps, fallback, instance) } export function createSlot(