diff --git a/packages/language-core/lib/codegen/template/elementChildren.ts b/packages/language-core/lib/codegen/template/elementChildren.ts
index d931eb29f..e7ee82c36 100644
--- a/packages/language-core/lib/codegen/template/elementChildren.ts
+++ b/packages/language-core/lib/codegen/template/elementChildren.ts
@@ -22,7 +22,8 @@ export function* generateElementChildren(
// fix https://github.com/vuejs/language-tools/issues/932
if (
- !ctx.hasSlotElements.has(node)
+ componentCtxVar
+ && !ctx.hasSlotElements.has(node)
&& node.children.length
&& node.tagType !== CompilerDOM.ElementTypes.ELEMENT
&& node.tagType !== CompilerDOM.ElementTypes.TEMPLATE
diff --git a/packages/language-core/lib/codegen/template/slotOutlet.ts b/packages/language-core/lib/codegen/template/slotOutlet.ts
index dfefcf332..07a76905d 100644
--- a/packages/language-core/lib/codegen/template/slotOutlet.ts
+++ b/packages/language-core/lib/codegen/template/slotOutlet.ts
@@ -58,55 +58,54 @@ export function* generateSlotOutlet(
`}`,
);
yield `)${endOfLine}`;
- return;
}
else {
yield `var ${varSlot} = {${newLine}`;
yield* generateElementProps(options, ctx, node, node.props.filter(prop => prop !== nameProp), true);
yield `}${endOfLine}`;
- }
- if (
- nameProp?.type === CompilerDOM.NodeTypes.ATTRIBUTE
- && nameProp.value
- ) {
- ctx.slots.push({
- name: nameProp.value.content,
- loc: nameProp.loc.start.offset + nameProp.loc.source.indexOf(nameProp.value.content, nameProp.name.length),
- tagRange: [startTagOffset, startTagOffset + node.tag.length],
- varName: varSlot,
- nodeLoc: node.loc,
- });
- }
- else if (
- nameProp?.type === CompilerDOM.NodeTypes.DIRECTIVE
- && nameProp.exp?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION
- ) {
- const slotExpVar = ctx.getInternalVariable();
- yield `var ${slotExpVar} = `;
- yield* generateInterpolation(
- options,
- ctx,
- nameProp.exp.content,
- nameProp.exp,
- nameProp.exp.loc.start.offset,
- ctx.codeFeatures.all,
- '(',
- ')',
- );
- yield ` as const${endOfLine}`;
- ctx.dynamicSlots.push({
- expVar: slotExpVar,
- varName: varSlot,
- });
- }
- else {
- ctx.slots.push({
- name: 'default',
- tagRange: [startTagOffset, startTagOffset + node.tag.length],
- varName: varSlot,
- nodeLoc: node.loc,
- });
+ if (
+ nameProp?.type === CompilerDOM.NodeTypes.ATTRIBUTE
+ && nameProp.value
+ ) {
+ ctx.slots.push({
+ name: nameProp.value.content,
+ loc: nameProp.loc.start.offset + nameProp.loc.source.indexOf(nameProp.value.content, nameProp.name.length),
+ tagRange: [startTagOffset, startTagOffset + node.tag.length],
+ varName: varSlot,
+ nodeLoc: node.loc,
+ });
+ }
+ else if (
+ nameProp?.type === CompilerDOM.NodeTypes.DIRECTIVE
+ && nameProp.exp?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION
+ ) {
+ const slotExpVar = ctx.getInternalVariable();
+ yield `var ${slotExpVar} = `;
+ yield* generateInterpolation(
+ options,
+ ctx,
+ nameProp.exp.content,
+ nameProp.exp,
+ nameProp.exp.loc.start.offset,
+ ctx.codeFeatures.all,
+ '(',
+ ')',
+ );
+ yield ` as const${endOfLine}`;
+ ctx.dynamicSlots.push({
+ expVar: slotExpVar,
+ varName: varSlot,
+ });
+ }
+ else {
+ ctx.slots.push({
+ name: 'default',
+ tagRange: [startTagOffset, startTagOffset + node.tag.length],
+ varName: varSlot,
+ nodeLoc: node.loc,
+ });
+ }
}
yield* ctx.generateAutoImportCompletion();
yield* generateElementChildren(options, ctx, node, currentComponent, componentCtxVar);
diff --git a/test-workspace/tsc/vue2/tsconfig.json b/test-workspace/tsc/vue2/tsconfig.json
index b5c07b027..58dd2edb4 100644
--- a/test-workspace/tsc/vue2/tsconfig.json
+++ b/test-workspace/tsc/vue2/tsconfig.json
@@ -17,6 +17,7 @@
"../vue3/#3615",
"../vue3/#3656",
"../vue3/#3672",
+ "../vue3/#4327",
"../vue3/components",
"../vue3/defineEmits",
"../vue3/defineModel",
diff --git a/test-workspace/tsc/vue3/#4327/main.vue b/test-workspace/tsc/vue3/#4327/main.vue
new file mode 100644
index 000000000..f1d57d40b
--- /dev/null
+++ b/test-workspace/tsc/vue3/#4327/main.vue
@@ -0,0 +1,17 @@
+
+
+
+
+ Default slot content
+
+