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: '

Hello

' + html: '

Hello

', + + test(assert, component) { + assert.htmlEqual(component.refs.nested.slots.default.innerHTML, 'Hello'); + } }; diff --git a/test/runtime/samples/component-slot-default/main.html b/test/runtime/samples/component-slot-default/main.html index d4adbd8c3c..3f5fad9363 100644 --- a/test/runtime/samples/component-slot-default/main.html +++ b/test/runtime/samples/component-slot-default/main.html @@ -1,4 +1,4 @@ - + Hello diff --git a/test/runtime/samples/component-slot-named/_config.js b/test/runtime/samples/component-slot-named/_config.js index b4d803a5d8..251ded4a65 100644 --- a/test/runtime/samples/component-slot-named/_config.js +++ b/test/runtime/samples/component-slot-named/_config.js @@ -5,5 +5,11 @@ export default {

bar

foo

- ` + `, + + test(assert, component) { + assert.htmlEqual(component.refs.nested.slots.default.innerHTML, 'Hello'); + assert.htmlEqual(component.refs.nested.slots.foo.innerHTML, `

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 @@ - + Hello

foo