Условный рендеринг — это механизм, позволяющий управлять отображением элементов интерфейса в зависимости от определённых условий. Он является ключевым инструментом при создании динамических приложений, где содержимое страницы меняется в зависимости от состояния данных.
Наиболее распространённый способ условного рендеринга — применение
стандартных условных операторов Jav * aScript: if,
else if и else. Они позволяют включать или
исключать части интерфейса на основе логических условий.
const isLoggedIn = true;
if (isLoggedIn) {
console.log("Пользователь вошёл в систему");
} else {
console.log("Пользователь не авторизован");
}
В контексте веб-разработки условные операторы часто используются для определения, какие компоненты отображать:
const user = { name: "Иван", age: 25 };
function renderUser(user) {
if (user) {
return `<h1>Привет, ${user.name}</h1>`;
} else {
return `<h1>Гость</h1>`;
}
}
Для краткой записи условного рендеринга применяется тернарный
оператор ? :. Он позволяет встроить условие прямо в
выражение.
const isAdmin = false;
const message = isAdmin ? "Добро пожаловать, администратор" : "Добро пожаловать, пользователь";
console.log(message);
В JSX (React) тернарный оператор используется непосредственно внутри разметки:
function Greeting({ isLoggedIn }) {
return (
<div>
{isLoggedIn ? <h1>Привет, пользователь!</h1> : <h1>Пожалуйста, войдите</h1>}
</div>
);
}
Тернарный оператор особенно полезен для простых условий и компактного
кода, но при сложной логике лучше использовать if или
отдельные функции.
&&) и ИЛИ
(||)Для условного рендеринга без необходимости else удобно
использовать логические операторы && и
||.
&&) Используется
для отображения элемента только при истинном условии:const isLoggedIn = true;
<div>
{isLoggedIn && <button>Выйти</button>}
</div>
Если isLoggedIn ложное, кнопка не будет отрендерена.
||) Позволяет задавать
значение по умолчанию, если условие ложное:const username = null;
const displayName = username || "Гость";
console.log(displayName); // "Гость"
Для сложных условий и множественных вариантов отображения удобно использовать отдельные функции, возвращающие компоненты:
function renderStatus(status) {
switch (status) {
case "loading":
return <p>Загрузка данных...</p>;
case "success":
return <p>Данные успешно загружены</p>;
case "error":
return <p>Произошла ошибка</p>;
default:
return null;
}
}
function App({ status }) {
return (
<div>
{renderStatus(status)}
</div>
);
}
Такой подход повышает читаемость и позволяет централизованно управлять логикой отображения.
При работе с массивами объектов условие может применяться к каждому элементу списка:
const todos = [
{ id: 1, text: "Изучить JavaScript", completed: true },
{ id: 2, text: "Сделать домашнее задание", completed: false },
];
function TodoList({ todos }) {
return (
<ul>
{todos.map(todo =>
todo.completed ? (
<li key={todo.id}><s>{todo.text}</s></li>
) : (
<li key={todo.id}>{todo.text}</li>
)
)}
</ul>
);
}
Здесь условие todo.completed определяет, будет ли текст
перечеркнут, что наглядно демонстрирует использование условного
рендеринга на практике.
Совмещение деструктуризации с условными выражениями позволяет писать компактный и чистый код:
const user = { name: "Анна", isAdmin: true };
const { name, isAdmin } = user;
<div>
<h1>Привет, {name}</h1>
{isAdmin && <p>Вы администратор</p>}
</div>
Такой подход упрощает доступ к данным и минимизирует повторение кода.
Условный рендеринг может сочетаться с ленивой загрузкой компонентов. Компонент создаётся и загружается только при необходимости, что экономит ресурсы:
import { Suspense, lazy } from "react";
const LazyComponent = lazy(() => import("./HeavyComponent"));
function App({ show }) {
return (
<div>
{show && (
<Suspense fallback={<div>Загрузка...</div>}>
<LazyComponent />
</Suspense>
)}
</div>
);
}
Это особенно важно в больших приложениях, где тяжелые компоненты не должны грузиться сразу.
if или switch
для сложных.else.Условный рендеринг обеспечивает гибкость интерфейса и позволяет создавать адаптивные, динамичные веб-приложения с минимальными затратами на сложность кода.