Riot.js использует собственный синтаксис директив, который позволяет управлять поведением компонентов на уровне шаблонов. Директивы обеспечивают связь между данными и интерфейсом, позволяя обновлять DOM автоматически при изменении состояния. Основные директивы включают:
if — условная отрисовка элемента;each — повторение элементов на основе массива или
объекта;show / hide — управление видимостью
элемента;ref — создание ссылки на DOM-элемент;on — привязка событий к элементам;class / style — динамическое управление
классами и стилями.Каждая директива имеет строгую синтаксическую структуру, которая обеспечивает оптимизацию рендеринга и минимизацию обновлений DOM.
ifДиректива if позволяет отображать элемент только при
выполнении определённого условия. Синтаксис прост:
<div if={isVisible}>
Контент отображается, если isVisible = true
</div>
Особенности работы if:
else для альтернативного
контента:<div if={isLoggedIn}>
Добро пожаловать!
</div>
<div else>
Пожалуйста, войдите в систему.
</div>
<div if={user.age > 18 && user.active}>
Доступ разрешён
</div>
Использование if важно для случаев, когда элемент
содержит сложный внутренний DOM или тяжелые компоненты — это снижает
нагрузку на браузер.
eachДиректива each используется для рендеринга
коллекций:
<ul>
<li each={item, index in items}>{item.name} — {index}</li>
</ul>
Пояснения:
item — текущий элемент массива;index — порядковый номер элемента;items — массив данных.Особенности:
<li each={value, key in user.roles}>{key}: {value}</li>
if можно создавать фильтруемые
списки:<li each={task in tasks} if={task.completed}>{task.title}</li>
show и hideВ отличие от if, директивы show и
hide не удаляют элемент из DOM, а изменяют
его CSS-свойство display:
<div show={isActive}>Активный элемент</div>
<div hide={isActive}>Неактивный элемент</div>
Преимущества:
refДиректива ref позволяет сохранить ссылку на DOM-элемент
для дальнейшего использования в скриптах компонента:
<input ref="usernameInput">
Доступ к элементу:
this.usernameInput.focus()
Особенности:
ref работает только внутри компонента.onДиректива on используется для обработки событий:
<button onCl ick={handleClick}>Нажми меня</button>
Особенности:
onMouseOver, onInput, onSubmit и
т.д.).<button onCl ick={() => selectItem(item.id)}>Выбрать</button>
Для управления классами и стилями используются директивы
class и style:
<div class={isActive ? 'active' : 'inactive'}>Состояние элемента</div>
<div style={`color: ${textColor}; background: ${bgColor}`}>Текст с динамическим стилем</div>
Особенности:
<div class={{active: isActive, disabled: isDisabled}}>Текст</div>
Часто используется комбинация нескольких директив:
<ul>
<li each={task in tasks} if={!task.completed} class={{urgent: task.priority === 'high'}}>
{task.title}
<button onCl ick={() => completeTask(task.id)}>Завершить</button>
</li>
</ul>
Здесь:
each создаёт список задач;if фильтрует только незавершённые задачи;class добавляет класс urgent для задач с
высокой приоритетностью;onClick привязывает действие к кнопке.Такое сочетание позволяет строить динамичные, отзывчивые интерфейсы с минимальным количеством кода.
if и each вместе может
вызвать непредсказуемое поведение, если элемент часто
создаётся и уничтожается. В таких случаях рекомендуется оптимизировать
структуру данных.if и show, чтобы избегать постоянного
пересоздания DOM-узлов.