mirror of https://github.com/sveltejs/svelte
allow <slot> to be part of a slot (#4295)
parent
0645631b28
commit
8056829a91
@ -0,0 +1,61 @@
|
||||
import ElementWrapper from './index';
|
||||
import SlotWrapper from '../Slot';
|
||||
import Block from '../../Block';
|
||||
import { sanitize } from '../../../../utils/names';
|
||||
import InlineComponentWrapper from '../InlineComponent';
|
||||
import create_debugging_comment from '../shared/create_debugging_comment';
|
||||
import { get_slot_definition } from '../shared/get_slot_definition';
|
||||
|
||||
export default function create_slot_block(attribute, element: ElementWrapper | SlotWrapper, block: Block) {
|
||||
const owner = find_slot_owner(element.parent);
|
||||
|
||||
if (owner && owner.node.type === 'InlineComponent') {
|
||||
const name = attribute.get_static_value() as string;
|
||||
|
||||
if (!((owner as unknown) as InlineComponentWrapper).slots.has(name)) {
|
||||
const child_block = block.child({
|
||||
comment: create_debugging_comment(element.node, element.renderer.component),
|
||||
name: element.renderer.component.get_unique_name(
|
||||
`create_${sanitize(name)}_slot`
|
||||
),
|
||||
type: 'slot'
|
||||
});
|
||||
|
||||
const { scope, lets } = element.node;
|
||||
const seen = new Set(lets.map(l => l.name.name));
|
||||
|
||||
((owner as unknown) as InlineComponentWrapper).node.lets.forEach(l => {
|
||||
if (!seen.has(l.name.name)) lets.push(l);
|
||||
});
|
||||
|
||||
((owner as unknown) as InlineComponentWrapper).slots.set(
|
||||
name,
|
||||
get_slot_definition(child_block, scope, lets)
|
||||
);
|
||||
element.renderer.blocks.push(child_block);
|
||||
}
|
||||
|
||||
element.slot_block = ((owner as unknown) as InlineComponentWrapper).slots.get(
|
||||
name
|
||||
).block;
|
||||
|
||||
return element.slot_block;
|
||||
}
|
||||
|
||||
return block;
|
||||
}
|
||||
|
||||
function find_slot_owner(owner) {
|
||||
while (owner) {
|
||||
if (owner.node.type === 'InlineComponent') {
|
||||
break;
|
||||
}
|
||||
|
||||
if (owner.node.type === 'Element' && /-/.test(owner.node.name)) {
|
||||
break;
|
||||
}
|
||||
|
||||
owner = owner.parent;
|
||||
}
|
||||
return owner;
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
<script>
|
||||
import Two from './Two.svelte';
|
||||
export let a, b;
|
||||
</script>
|
||||
|
||||
<Two {b} let:two>
|
||||
<slot name="one" slot="two" one={a} two={two}></slot>
|
||||
</Two>
|
@ -0,0 +1,4 @@
|
||||
<script>
|
||||
export let b;
|
||||
</script>
|
||||
<slot name="two" two={b}></slot>
|
@ -0,0 +1,18 @@
|
||||
export default {
|
||||
html: `
|
||||
<p slot='one'>one: 1 two: 2</p>
|
||||
`,
|
||||
test({ assert, component, target }) {
|
||||
component.a = 3;
|
||||
component.b = 4;
|
||||
assert.htmlEqual(target.innerHTML, `
|
||||
<p slot='one'>one: 3 two: 4</p>
|
||||
`);
|
||||
|
||||
component.a = 5;
|
||||
component.b = 6;
|
||||
assert.htmlEqual(target.innerHTML, `
|
||||
<p slot='one'>one: 5 two: 6</p>
|
||||
`);
|
||||
}
|
||||
};
|
@ -0,0 +1,9 @@
|
||||
<script>
|
||||
import One from './One.svelte';
|
||||
export let a = 1;
|
||||
export let b = 2;
|
||||
</script>
|
||||
|
||||
<One {a} {b}>
|
||||
<p slot='one' let:one let:two>one: {one} two: {two}</p>
|
||||
</One>
|
Loading…
Reference in new issue