Условный рендеринг в Slim.js позволяет динамически управлять
отображением элементов на странице в зависимости от состояния данных. В
отличие от прямого манипулирования DOM через методы вроде
appendChild или removeChild, Slim.js
использует декларативный подход, что делает код более читаемым и
поддерживаемым.
ifКлючевой механизм условного рендеринга — это атрибут if.
Он принимает логическое выражение, которое вычисляется в контексте
компонента. Если выражение истинно, элемент добавляется в DOM; если
ложно — элемент удаляется.
Пример использования:
class UserStatus extends Slim {
constructor() {
super();
this.loggedIn = false;
}
get template() {
return `
<div>
<p if="loggedIn">Вы вошли в систему</p>
<p if="!loggedIn">Пожалуйста, войдите</p>
<button oncl ick="this.toggleLogin()">Переключить статус</button>
</div>
`;
}
toggleLogin() {
this.loggedIn = !this.loggedIn;
this.update();
}
}
Slim.tag('user-status', UserStatus);
В этом примере:
<p if="loggedIn"> отображается только тогда,
когда loggedIn равно true.<p if="!loggedIn"> отображается при обратном
значении.update() пересчитывает шаблон и обновляет DOM без
ручного вмешательства.show и
hideSlim.js также предоставляет show и hide для
управления видимостью через CSS, не удаляя элемент из DOM. Разница с
if заключается в том, что if полностью
исключает элемент, а show/hide лишь меняют
свойство display.
Пример:
<div show="isVisible">Этот текст можно скрыть</div>
Если isVisible равно false, элемент
получает стиль display: none, но остаётся в DOM, сохраняя
все свои состояния и события.
Slim.js позволяет использовать условный рендеринг и для вложенных компонентов. Это удобно, когда необходимо динамически подгружать сложные структуры.
class AppView extends Slim {
constructor() {
super();
this.showProfile = false;
}
get template() {
return `
<button oncl ick="this.toggleProfile()">Показать профиль</button>
<profile-card if="showProfile"></profile-card>
`;
}
toggleProfile() {
this.showProfile = !this.showProfile;
this.update();
}
}
Slim.tag('app-view', AppView);
В этом случае <profile-card> создаётся только при
условии showProfile === true. Это снижает нагрузку на
браузер и упрощает управление состоянием.
В if можно использовать любые выражения, включая
логические операции и вызовы методов компонента:
<p if="user.isAdmin && user.isActive">Администратор активен</p>
<p if="!user.isAdmin || !user.isActive">Обычный пользователь или неактивен</p>
Для сложных условий часто создают геттеры в классе компонента:
get canEdit() {
return this.user.isAdmin && this.user.hasEditRights;
}
<p if="canEdit">Редактирование доступно</p>
Такой подход делает шаблон лаконичным и легко читаемым.
Часто условный рендеринг комбинируется с итерациями по массивам через
атрибут repeat. Элементы могут отображаться только при
выполнении определённого условия:
<li repeat="item in items" if="item.active">{{item.name}}</li>
Эта конструкция гарантирует, что в списке будут только активные
элементы. При изменении свойства item.active вызывается
update(), и DOM синхронизируется автоматически.
if создаются и уничтожаются полностью. Это
экономит память при работе с большими компонентами.show и hide не трогают структуру
DOM, что позволяет сохранять внутренние состояния и события.При удалении элементов через if все события, привязанные
к ним, автоматически очищаются. Это предотвращает утечки памяти. Если
необходимо сохранить состояние, лучше использовать
show/hide или хранить данные в компоненте.
if.show.repeat и if упрощает работу
с динамическими коллекциями.Условный рендеринг в Slim.js сочетает декларативность с высокой производительностью и гибкостью, обеспечивая удобное управление видимостью элементов и компонентами без лишних манипуляций с DOM.