В Slim.js слоты используются для организации шаблонов компонентов, позволяя вставлять в них динамический контент. Каждый компонент может содержать один или несколько слотов, которые определяют, куда будет помещён контент, переданный при использовании компонента. Слот по умолчанию — это слот, в который помещается любой контент, не назначенный конкретным именованным слотам.
Слот по умолчанию создаётся с помощью тега <slot>
без атрибута name. В разметке компонента это выглядит
следующим образом:
Slim.tag('my-card', `
<div class="card">
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot> <!-- слот по умолчанию -->
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
`);
В этом примере:
<slot name="header"> — именованный слот для
заголовка.<slot> — слот по умолчанию для основного
содержимого.<slot name="footer"> — именованный слот для
подвала.Контент, переданный компоненту без явного указания имени слота, автоматически попадёт в слот по умолчанию.
Пример использования компонента с содержимым для слота по умолчанию:
<my-card>
<p>Основной текст карточки, который попадет в слот по умолчанию.</p>
</my-card>
В результате <p> окажется внутри
<main> блока компонента, так как
<slot> без имени принимает все элементы, не
предназначенные для именованных слотов.
Если одновременно используются именованные слоты и слот по умолчанию, Slim.js автоматически распределяет элементы по соответствующим слотам:
<my-card>
<span slot="header">Заголовок</span>
<p>Основной текст</p>
<span slot="footer">Подвал</span>
</my-card>
<span slot="header"> попадёт в слот
header.<p> попадёт в слот по умолчанию.<span slot="footer"> попадёт в слот
footer.Слот по умолчанию может содержать начальное содержимое, которое будет отображаться, если компонент вызван без вставки контента:
Slim.tag('my-message', `
<div class="message">
<slot>Сообщение отсутствует</slot>
</div>
`);
В этом случае, если <my-message> используется без
внутреннего контента, в слот по умолчанию подставится текст
"Сообщение отсутствует". Если же контент передан, он
заменяет этот текст.
Один слот по умолчанию на компонент. Слот без имени может присутствовать в компоненте только один раз. Наличие нескольких слотов без имени приведёт к неопределённому поведению.
Приоритет именованных слотов. Контент с
атрибутом slot="имя" никогда не попадёт в слот по
умолчанию.
Реактивность. Slim.js автоматически обновляет содержимое слота при изменении DOM внутри компонента. Любые элементы, добавленные динамически через JavaScript, будут корректно отображены в слоте по умолчанию.
Слот по умолчанию поддерживает динамическую вставку с использованием Slim.js реактивных выражений. Например:
Slim.tag('user-card', `
<div class="user-card">
<slot>
<p>{{ defaultMessage }}</p>
</slot>
</div>
`, class UserCard {
defaultMessage = "Информация недоступна";
});
При изменении свойства defaultMessage автоматически
обновится содержимое слота по умолчанию, если пользователь не передал
собственный контент.
Слоты по умолчанию могут быть вложенными, что позволяет создавать гибкие компоненты:
Slim.tag('container-box', `
<div class="box">
<slot>
<div class="inner-box">
<slot>Вложенный текст по умолчанию</slot>
</div>
</slot>
</div>
`);
При этом внешняя вставка заменяет весь внешний слот, а внутренний слот по умолчанию используется только при отсутствии вложенного контента.
Слоты по умолчанию в Slim.js позволяют создавать модульные и переиспользуемые компоненты, сохраняя гибкость структуры и упрощая управление содержимым без явного указания всех мест вставки.