- Главная
- Javascript
- Условный рендеринг в React — умный интерфейс
Условный рендеринг в React — умный интерфейс
Содержание
- Введение: зачем нужен условный рендеринг
- Способы условного рендеринга в React
- Способ 1.
if/else(для сложной логики) - Способ 2. Тернарный оператор
(? :)самый частый - Способ 3. Логическое
&&(показать или ничего) - Способ 4.
switch/case(для нескольких вариантов) - Способ 5.
nullничего не показывать - Способ 6. Переменная с JSX (сложная логика)
- Реальный пример: профиль пользователя
- Частые ошибки новичков
- Рекомендации по стилю
- Задание для закрепления (на 7–10 минут)
- Что дальше?
Цель урока: научиться управлять тем, что отображается на экране, в зависимости от условий. Показывать разные элементы для авторизованных и гостей, отображать загрузку, ошибки, пустые состояния и делать интерфейс живым и отзывчивым.
Введение: зачем нужен условный рендеринг
В реальных приложениях интерфейс никогда не статичен. Он меняется в зависимости от:
- Авторизован пользователь или нет
- Загрузились данные или ещё нет
- Есть ошибка или всё хорошо
- Пустой список или с данными
- Выбрана светлая или тёмная тема
Главная мысль: условный рендеринг — это способ показывать разный JSX в зависимости от условий. Это делает приложение интерактивным и адаптивным.
Способы условного рендеринга в React
| Способ | Когда использовать |
|---|---|
if/else |
Для сложной логики, которую выносят в отдельную функцию |
Тернарный оператор (? :) |
Для простых условий в JSX (есть/нет) |
Логическое && |
Когда нужно показать что-то только при истинном условии |
switch/case |
Для нескольких вариантов (редко) |
null |
Чтобы ничего не показывать |
Способ 1.if/else (для сложной логики)
if/else нельзя использовать внутри JSX, только снаружи.
Пример:
function Greeting({ isLoggedIn, userName }) {
if (isLoggedIn) {
return <h1>Добро пожаловать, {userName}!</h1>;
} else {
return <button>Войти</button>;
}
}
Вынос в отдельную функцию:
function getGreeting(isLoggedIn, userName) {
if (isLoggedIn) {
return <h1>Добро пожаловать, {userName}!</h1>;
}
return <button>Войти</button>;
}
function App({ isLoggedIn, userName }) {
return (
<div>
{getGreeting(isLoggedIn, userName)}
</div>
);
}
Способ 2. Тернарный оператор (? :) самый частый
Используется прямо внутри JSX для простых условий «если — иначе».
Синтаксис:
{условие ? <Если_правда> : <Если_ложь>}
Пример с авторизацией:
function App({ isLoggedIn, userName }) {
return (
<div>
{isLoggedIn ? (
<h1>Добро пожаловать, {userName}!</h1>
) : (
<button>Войти</button>
)}
</div>
);
}
Пример с загрузкой:
function DataDisplay({ isLoading, data }) {
return (
<div>
{isLoading ? (
<p>Загрузка...</p>
) : (
<p>Данные: {data}</p>
)}
</div>
);
}
Вложенные тернарники (осторожно!):
{status === 'loading' ? (
<p>Загрузка...</p>
) : status === 'error' ? (
<p>Ошибка!</p>
) : (
<p>Данные: {data}</p>
)}
Оживи свой сайт. Освой JavaScript!
Статичная верстка — это только скелет. Наш онлайн-курс "JavaScript с нуля до профи" даст твоим страницам мышцы и нервы. Научись создавать слайдеры, формы, интерактивные карты и получать данные с сервера.
От теории — к реальным скриптам в твоём портфолио.
Способ 3. Логическое && (показать или ничего)
Когда нужно показать элемент только при истинном условии (без блока «иначе»).
Синтаксис:
{условие && <Элемент>}
Принцип работы:
- Если условие
true— показывает элемент - Если условие
false— ничего не показывает (возвращает false)
Пример с уведомлениями:
function Notification({ count }) {
return (
<div>
<h1>Мои сообщения</h1>
{count > 0 && <p>У вас {count} новых сообщений!</p>}
</div>
);
}
Пример с корзиной:
function Cart({ items }) {
return (
<div>
<h2>Корзина</h2>
{items.length === 0 && <p>Корзина пуста</p>}
{items.length > 0 && <p>Товаров: {items.length}</p>}
</div>
);
}
Осторожно: && может показать 0 вместо ничего:
{items.length && <p>Товаров: {items.length}</p>}
// Если length = 0, на экране появится "0"
// Правильно:
{items.length > 0 && <p>Товаров: {items.length}</p>}
Способ 4. switch/case (для нескольких вариантов)
Используется, когда нужно выбрать один из многих вариантов.
Пример с типом уведомления:
function Alert({ type, message }) {
let alertStyle;
switch (type) {
case 'success':
alertStyle = { color: 'green', border: '2px solid green' };
break;
case 'error':
alertStyle = { color: 'red', border: '2px solid red' };
break;
case 'warning':
alertStyle = { color: 'orange', border: '2px solid orange' };
break;
default:
alertStyle = { color: 'blue', border: '2px solid blue' };
}
return <div style={alertStyle}>{message}</div>;
}
Альтернатива — объект с вариантами (чаще используется):
function Alert({ type, message }) {
const styles = {
success: { color: 'green', border: '2px solid green' },
error: { color: 'red', border: '2px solid red' },
warning: { color: 'orange', border: '2px solid orange' }
};
return <div style={styles[type] || styles.default}>{message}</div>;
}
Способ 5. null ничего не показывать
Можно вернуть null из компонента, чтобы ничего не рендерить.
Пример:
function AdBanner({ shouldShow }) {
if (!shouldShow) {
return null; // Ничего не показываем
}
return <div>Рекламный баннер</div>;
}
Когда использовать:
- Скрытие элементов по условию
- Запрет отображения в определённых ситуациях
Способ 6. Переменная с JSX (сложная логика)
Можно сохранить JSX в переменную и потом её отрендерить.
Пример:
function UserStatus({ isOnline, lastSeen }) {
let status;
if (isOnline) {
status = <span style={{ color: 'green' }}>Онлайн</span>;
} else if (lastSeen) {
status = <span style={{ color: 'gray' }}>Был в сети: {lastSeen}</span>;
} else {
status = <span style={{ color: 'gray' }}>Неизвестно</span>;
}
return <div>{status}</div>;
}
Реальный пример: профиль пользователя
Объединим все способы в один компонент:
function UserProfile({ user, isLoading, error }) {
// 1. Загрузка
if (isLoading) {
return <p>Загрузка профиля...</p>;
}
// 2. Ошибка
if (error) {
return <p style={{ color: 'red' }}>Ошибка: {error}</p>;
}
// 3. Нет данных
if (!user) {
return <p>Пользователь не найден</p>;
}
// 4. Есть данные — показываем профиль
return (
<div>
<h2>{user.name}</h2>
<p>Email: {user.email}</p>
<p>Возраст: {user.age}</p>
{user.isPremium && <span>⭐ Премиум-аккаунт</span>}
</div>
);
}
Частые ошибки новичков
| Ошибка | Почему | Исправление |
|---|---|---|
{condition && <Component />} когда condition = 0 |
0 отображается как число |
Используй > 0 или !!condition |
{if (x) { ... }} в JSX |
if — это инструкция, не выражение |
Используй тернарник или вынеси логику |
| Вложенные тернарники без скобок | Трудно читать | Вынеси в функцию или используй switch |
Забыл return null |
Компонент всегда что-то возвращает | Добавь return null для пустого состояния |
Рекомендации по стилю
| Ситуация | Что использовать |
|---|---|
| Одно условие (показать/скрыть) | && |
| Два варианта (А или Б) | Тернарный оператор ? : |
| Сложная логика (много условий) | if/else в отдельной функции |
| Несколько вариантов (3+) | switch или объект |
| Ничего не показывать | return null |
Задание для закрепления (на 7–10 минут)
Создай компонент UserDashboard, который:
- Принимает пропсы:
user, isLoading, error - Если
isLoading— показывает текст «Загрузка данных…» - Если есть
error— показывает «Ошибка:{error}» красным цветом - Если
userотсутствует — показывает «Пользователь не найден»
Если user есть — показывает:
- Имя пользователя (заголовок)
- Возраст
- Если
user.isAdmin === true— показывает звёздочку ⭐ рядом с именем - Если
user.isActive === false— показывает статус «Не активен» серым цветом
Дополнительно: Добавь проверку, что user.age не меньше 0 и не больше 120 (если нет — показывать ошибку валидации).
Проверка: Протестируй все состояния, меняя пропсы в App.jsx.
Что дальше?
В следующем уроке разберём Жизненный цикл компонентов — как React управляет созданием, обновлением и удалением компонентов. Ты узнаешь, что происходит с компонентом от момента появления на экране до его исчезновения, и научишься выполнять код в нужные моменты: при монтировании, обновлении и размонтировании.