В Slim.js слоты позволяют создавать гибкие компоненты с возможностью динамического наполнения контентом. Fallback-контент — это содержимое, которое отображается в слоте по умолчанию, если пользователь не передал собственный контент при использовании компонента. Эта функция особенно полезна для обеспечения устойчивости интерфейса и сохранения базового отображения.
Слот объявляется с помощью тега <slot>. Для
указания fallback-контента необходимо поместить его внутрь тега
<slot>:
class MyComponent extends Slim {
get template() {
return `
<div class="card">
<slot>
<p>Контент по умолчанию</p>
</slot>
</div>
`;
}
}
Slim.tag('my-component', MyComponent);
В этом примере, если <my-component> будет
использован без вложенного контента, то на странице отобразится абзац с
текстом «Контент по умолчанию».
Компонент может содержать несколько слотов с разными именами и fallback-контентом. Именованные слоты позволяют более точно управлять структурой компонента:
class CardComponent extends Slim {
get template() {
return `
<div class="card">
<header>
<slot name="header">
<h2>Заголовок по умолчанию</h2>
</slot>
</header>
<main>
<slot>
<p>Основной контент по умолчанию</p>
</slot>
</main>
<footer>
<slot name="footer">
<p>Подвал по умолчанию</p>
</slot>
</footer>
</div>
`;
}
}
Slim.tag('card-component', CardComponent);
Использование именованных слотов позволяет передавать определённый контент в конкретные части компонента:
<card-component>
<span slot="header">Пользовательский заголовок</span>
</card-component>
В этом случае отображение будет таким: пользовательский заголовок
заменяет fallback в <slot name="header">, а основной
контент и футер остаются с содержимым по умолчанию.
Slim.js автоматически реагирует на изменения содержимого слотов. Если содержимое передано позже (например, через JavaScript), fallback-контент исчезает, а вставленный контент отображается вместо него:
const component = document.querySelector('my-component');
const newContent = document.createElement('span');
newContent.textContent = 'Динамический контент';
component.appendChild(newContent);
После добавления элемента в слот, текст «Контент по умолчанию» исчезает, и вместо него отображается «Динамический контент».
Fallback-контент наследует стили контейнера компонента, что позволяет создавать единообразное оформление:
.card p {
font-style: italic;
color: gray;
}
Даже если пользователь не передаст контент, fallback-текст будет соответствовать общему стилю компонента.
class AlertBox extends Slim {
get template() {
return `
<div class="alert">
<slot>
<span>Предупреждение: данные не загружены.</span>
</slot>
</div>
`;
}
}
Slim.tag('alert-box', AlertBox);
Использование:
<alert-box></alert-box> <!-- Покажет текст по умолчанию -->
<alert-box><span>Ошибка при загрузке файла!</span></alert-box> <!-- Покажет пользовательский текст -->
Такой подход гарантирует, что компонент будет информативным даже при отсутствии пользовательского контента, сохраняя дизайн и структуру страницы.