Что такое условный рендеринг в React?

JuniorReact · Frontend·Обновлено 21 августа 2026
Коротко
Условный рендеринг — это отображение разных элементов UI в зависимости от состояния, пропсов или другого условия. В React для этого не нужен специальный синтаксис — используются обычные конструкции JavaScript (тернарный оператор, &&, if/else, ранний return) прямо в JSX.

Что такое условный рендеринг

Условный рендеринг в React — это подход к отображению разных элементов интерфейса в зависимости от состояния приложения, пропсов или других условий. У React нет специальной директивы для условий (как v-if во Vue) — вместо этого используются обычные конструкции JavaScript внутри JSX, потому что JSX компилируется в вызовы функций и является обычным выражением.

Основные способы

Тернарный оператор

Удобен, когда нужно выбрать один из двух вариантов рендеринга.

function Greeting({ isLoggedIn }) {
  return (
    <div>
      {isLoggedIn ? <UserPanel /> : <LoginButton />}
    </div>
  );
}

Логическое И (&&)

Применяется, когда элемент нужно показать только при истинном условии, а иначе не рендерить ничего.

function Notifications({ count }) {
  return (
    <div>
      {count > 0 && <span className="badge">{count}</span>}
    </div>
  );
}

Важный нюанс: если count равен 0, React отрендерит на экране 0, потому что 0 — валидный React-узел (falsy, но не null/undefined/false). Чтобы избежать этого, условие приводят к boolean: count > 0 && ....

if / else до return

Если логика ветвления сложная, её лучше вынести за пределы JSX — так код читается проще.

function Status({ status }) {
  if (status === 'loading') {
    return <Spinner />;
  }
  if (status === 'error') {
    return <ErrorMessage />;
  }
  return <Content />;
}

Возврат null

Компонент может не рендерить ничего, вернув null (но не undefined).

function Banner({ show }) {
  if (!show) return null;
  return <div className="banner">Акция!</div>;
}

Объект-словарь вместо цепочки условий

Для нескольких вариантов удобнее замаппить значение на компонент, чем писать длинный if/else или switch.

const STATUS_COMPONENTS = {
  loading: <Spinner />,
  error: <ErrorMessage />,
  success: <Content />,
};

function Status({ status }) {
  return STATUS_COMPONENTS[status] ?? null;
}

Вынесение условия в переменную

Часто результат ветвления сохраняют в переменную перед return, чтобы сам JSX оставался плоским и читаемым:

function App({ isLoading, error, data }) {
  let content;
  if (isLoading) {
    content = <Spinner />;
  } else if (error) {
    content = <ErrorMessage message={error} />;
  } else {
    content = <List items={data} />;
  }

  return <div className="app">{content}</div>;
}

Условный рендеринг атрибутов

Условие можно применять не только к целым элементам, но и к отдельным атрибутам, например классам:

<button className={isActive ? 'btn active' : 'btn'}>
  Нажми меня
</button>

Почему это важно

Условный рендеринг — фундаментальная часть декларативного подхода React: вместо императивного управления DOM (показать/скрыть элемент через style.display) разработчик описывает, каким должен быть UI при данном состоянии, а React сам эффективно обновляет реальный DOM.

Что хочет услышать интервьюер

Понимание, что в React нет спецсинтаксиса для условий — используются обычные конструкции JavaScript внутри JSX

Знание основных паттернов: тернарный оператор, &&, if/else с ранним return, возврат null

Понимание подводного камня с оператором && при falsy числовых значениях (например, рендер 0)

Умение выбрать подходящий способ в зависимости от сложности условия и не плодить вложенные тернарники

Понимание, что JSX — это выражение JavaScript, а не шаблонизатор со своим синтаксисом

Пример: Тернарный оператор и &&

function UserGreeting({ user, unreadCount }) {
  return (
    <div>
      {user ? <span>Привет, {user.name}!</span> : <span>Войдите в аккаунт</span>}
      {unreadCount > 0 && <span className="badge">{unreadCount}</span>}
    </div>
  );
}

Пример: Условие, вынесенное в переменную

function Page({ isLoading, error, data }) {
  let content;

  if (isLoading) {
    content = <Spinner />;
  } else if (error) {
    content = <ErrorMessage message={error} />;
  } else {
    content = <List items={data} />;
  }

  return <main>{content}</main>;
}

Типичные ошибки

Использование && с числовыми значениями, из-за чего на экране случайно рендерится 0

Глубоко вложенные друг в друга тернарные операторы, которые сложно читать и поддерживать

Попытка вставить оператор if прямо внутри JSX-разметки — это синтаксическая ошибка

Возврат undefined вместо null из компонента, что приводит к ошибке рендера

Дублирование одинаковой обёртки разметки в каждой ветке условия вместо вынесения условия в переменную

Лучшие курсы по теме

изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Feature-Sliced Design

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.5
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее