Slots
Child content passed to a component is rendered where the <slot /> tag is placed:
// Button.torp
export default function Button() {
@render {
<button>
<slot />
</button>
}
}
// App.torp
import Button from "./Button.torp"
export default function App() {
@render {
<Button>Click me!</Button>
}
}
Content inside the <slot> tag is used as a fallback when no children are passed:
// Button.torp
export default function Button() {
@render {
<button>
<slot>
<span>Click me!</span>
</slot>
</button>
}
}
Named slots
Use a <fill> tag to send content to a named <slot>. Content without a name is sent to the default slot:
// Card.torp
export default function Card() {
@render {
<section>
<header>
<slot name="header" />
</header>
<slot />
</section>
}
}
// App.torp
import Card from "./Card.torp"
export default function App() {
@render {
<Card>
<fill name="header">Welcome!</fill>
<p>The card's content.</p>
</Card>
}
}
Let slots
A component can pass data back out to the slot content by adding props to the <slot> tag. The parent accesses them with $slot:
// List.torp
export default function List($props: { items: string[] }) {
@render {
<ul>
@for (let item of $props.items) {
<li>
<slot item={item} />
</li>
}
</ul>
}
}
// App.torp
import List from "./List.torp"
export default function App() {
let $state = $watch({
items: ["one", "two", "three"]
})
@render {
<List items={$state.items}>
{$slot.item}
</List>
}
}