diff --git a/src/generators/dom/index.ts b/src/generators/dom/index.ts index 2619a527a4..b5d2d6b9e6 100644 --- a/src/generators/dom/index.ts +++ b/src/generators/dom/index.ts @@ -201,6 +201,8 @@ export default function dom( `} `} + ${generator.slots.size && `this.slots = {};`} + this._fragment = @create_main_fragment( this._state, this ); if ( options.target ) { diff --git a/src/generators/dom/visitors/Slot.ts b/src/generators/dom/visitors/Slot.ts index c95398d29c..c3400a3ed6 100644 --- a/src/generators/dom/visitors/Slot.ts +++ b/src/generators/dom/visitors/Slot.ts @@ -15,6 +15,8 @@ export default function visitSlot( componentStack: Node[] ) { const slotName = getStaticAttributeValue(node, 'name') || 'default'; + generator.slots.add(slotName); + const name = block.getUniqueName(`slot_${slotName}`); const content_name = block.getUniqueName(`slot_content_${slotName}`); @@ -34,6 +36,14 @@ export default function visitSlot( `); } + block.builders.mount.addLine( + `#component.slots.${slotName} = ${name};` + ); + + block.builders.unmount.addLine( + `#component.slots.${slotName} = null;` + ); + block.builders.create.pushCondition(`!${content_name}`); block.builders.mount.pushCondition(`!${content_name}`); block.builders.unmount.pushCondition(`!${content_name}`); diff --git a/test/runtime/samples/component-slot-default/_config.js b/test/runtime/samples/component-slot-default/_config.js index 01d610e458..04ea8d044a 100644 --- a/test/runtime/samples/component-slot-default/_config.js +++ b/test/runtime/samples/component-slot-default/_config.js @@ -1,3 +1,7 @@ export default { - html: '
bar
foo
foo
`); + assert.htmlEqual(component.refs.nested.slots.bar.innerHTML, `bar
`); + } }; diff --git a/test/runtime/samples/component-slot-named/main.html b/test/runtime/samples/component-slot-named/main.html index 40718e261f..76ba5b072b 100644 --- a/test/runtime/samples/component-slot-named/main.html +++ b/test/runtime/samples/component-slot-named/main.html @@ -1,4 +1,4 @@ -foo