Условный рендеринг в Atomico позволяет изменять вывод компонентов в зависимости от состояния данных или пропсов. В отличие от классических фреймворков, Atomico использует декларативный подход с JSX-подобным синтаксисом и реактивными хуками, что делает условные конструкции лаконичными и гибкими.
Наиболее простой способ условного рендеринга — тернарный оператор внутри JSX. Например:
import { c, useState } from "atomico";
function MyComponent() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
return c(
"div",
null,
isLoggedIn ? c("p", null, "Добро пожаловать!") : c("p", null, "Пожалуйста, войдите")
);
}
customElements.define("my-component", MyComponent);
Ключевой момент: тернарный оператор подходит для коротких условий, когда необходимо отобразить одно из двух состояний.
Если нужно рендерить элемент только при определённом условии, удобнее
использовать логический оператор &&:
c("div", null,
isLoggedIn && c("button", { onclick: () => setIsLoggedIn(false) }, "Выйти")
)
Элемент button появится только тогда, когда
isLoggedIn истинно. Если условие ложное, возвращается
false, и элемент не рендерится.
Для сложных условий целесообразно выносить логику в отдельные функции. Это повышает читаемость и облегчает поддержку кода:
function renderMessage(isLoggedIn) {
if (isLoggedIn) {
return c("p", null, "Добро пожаловать!");
}
return c("p", null, "Пожалуйста, войдите");
}
function MyComponent() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
return c("div", null, renderMessage(isLoggedIn));
}
Такой подход особенно полезен при множественных ветвлениях и сложных UI-структурах.
Atomico позволяет легко интегрировать условный рендеринг при работе с массивами элементов. Например, отображение списка уведомлений только если они существуют:
const notifications = ["Сообщение 1", "Сообщение 2"];
c("ul", null,
notifications.length
? notifications.map(msg => c("li", null, msg))
: c("li", null, "Нет уведомлений")
)
Важно: метод map в JSX возвращает
массив элементов, который Atomico корректно рендерит. Пустые массивы или
null не вызывают ошибок.
Для ситуаций с несколькими условиями удобно использовать
switch или цепочки if внутри вспомогательной
функции:
function renderStatus(status) {
switch (status) {
case "loading":
return c("p", null, "Загрузка...");
case "error":
return c("p", null, "Произошла ошибка");
case "success":
return c("p", null, "Данные загружены");
default:
return null;
}
}
Использование такой функции упрощает поддержку кода и делает условные ветвления наглядными.
Atomico поддерживает реактивные хуки, что позволяет автоматически
обновлять UI при изменении состояния. Комбинация useState и
условного рендеринга обеспечивает динамическое управление отображением
компонентов:
function ToggleComponent() {
const [isVisible, setIsVisible] = useState(true);
return c(
"div",
null,
c("button", { onclick: () => setIsVisible(!isVisible) }, "Переключить"),
isVisible && c("p", null, "Элемент видим")
);
}
Каждое изменение состояния isVisible автоматически
обновляет DOM без дополнительных действий.
Для оптимизации производительности можно условно рендерить тяжелые компоненты только при необходимости:
function LazyComponent({ show }) {
if (!show) return null;
return c("div", null, "Тяжелый компонент");
}
В сочетании с useState или useEffect это
позволяет экономить ресурсы и ускорять загрузку страницы.
Условный рендеринг часто комбинируется: тернарный оператор для простых случаев, логическое И для редких элементов, вспомогательные функции для сложных ветвлений. Такой подход делает код атомарным, читабельным и гибким к изменениям состояния.