Using components
#
Block and inline component syntaxComponents can be used in two ways: block-level or inline-level.
For example, given an icon_button
component.
<button>{{ children }} {% icon name=icon %}</button>
We can use the block syntax to pass the label of the button as children.
{% #icon_button icon="star" %}Favorite{% /icon_button %}
Note that #
denotes the opening tag and /
denotes the closing tag.
<button>Favorite <svg>...</svg></button>
If we didn't need to pass a label, or if the component itself doesn't use {{ children }}
, we can use the inline syntax instead.
{% icon_button icon="heart" %}
The inline syntax just uses the plain component name. No #
or /
.
<button><svg>...</svg></button>
#
Component contextUnlike the include
tag, component template tags do not pass the current context to the child component. Variables need to be passed in explicitly.
{% #button variant="primary" size="large" %}Hello{% /button %}
In addition, any variable set inside of a component template does not leak out to to the global context.
{% var class=class|default:"btn btn-primary" %}<button {% attrs class %}>{{ children }}</button>
{# The `class` variable will not "leak" out onto the global context #}
This is a deliberate design decision to improve readability and reduce side-effects.
You can of course still use {% include %}
if its behaviour is more convenient in specific circumstances.
#
Keyword argumentsUnlike normal template tags, component template tags support special characters in keyword arguments. Specifically _
, -
, @
, and :
.
This can be used in conjunction with the attrs
tag.
{# button component #}<button {% attrs aria-role x-bind:class @click %}>{{ children }}</button>
{# Usage #}{% #button aria-role="button" x-bind:class="!open ? 'hidden': ''" @click="myHandler" %}Hello{% /button %}
{# Output #}<button aria-role="button" x-bind:class="!open ? 'hidden': ''" @click="myHandler">Hello</button>
This makes keyword arguments work more like HTML attributes.
New in Slippers 0.5.0
Added support for special characters in keyword arguments.
#
Assigning output to a variableSimilar to a fragment
tag, a component's output can be assigned to a variable.
{% #heading variant="large" as my_heading %}Hello, World{% /heading %}
{# Render it like a normal variable #}{{ my_heading }}
{# Or pass to to another component #}{% card_heading heading=my_heading %}
note
Assigning component output to a variable cannot be done inside a with
block.