14 - Boolean context, Truthy, Falsy, условный рендеринг в React

Оценить качество материала и подачу материала автором видео:

Front-end

Трудоустройтесь middle front-end разработчиком на React JS (TypeScript) за 12-16 месяцев обучения с ежедневной менторской поддержкой в формате видео 1 на 1 и коммерческими проектами в портфолио

Перейти на курс
Front-end

Back-end

Трудоустройтесь middle back-end разработчиком за 12-16 месяцев обучения с ежедневной менторской поддержкой в формате видео 1 на 1 и коммерческими проектами в портфолио

Перейти на курс
Back-end

Карьерный бустер

Получите коммерческий опыт на реальных стартапах, прокачайте tech & soft навыки, научитесь работать в команде, проходить собеседования и получите первую работу в IT!

Перейти на курс
Карьерный бустер

Основы Front-end

Сделайте первый шаг в IT, освоив базовые знания разработки и научившись создавать небольшие проекты на JavaScript

Перейти на курс
Основы Front-end

Основы Back-end

Сделайте первый шаг в IT, освоив базовые знания разработки. Без опыта. Без математики. Только практика: JavaScript, SQL, Node JS, база данных

Перейти на курс
Основы Back-end

Булевы выражения и условный рендеринг в React/JavaScript

Автор конспекта: Андрей Комаров
💡

Этот урок — фундамент, на котором строится 90% кода в JSX. Здесь мы разберем базовые концепции truthy/falsy, работу логических операторов && и ||, и разные способы условного рендеринга в React.

🎯 Концепции "truthy" и "falsy" выражений

JavaScript — гибкий язык, который в логическом контексте автоматически преобразует truthy (псевдоистинные) и falsy (псевдоложные) значения к булевому типу.

"Falsy" (псевдоложные) значения:

  • Пустая строка ''
  • Числа 0, -0, 0n (BigInt)
  • null
  • undefined
  • NaN (Not a Number)

"Truthy" (псевдоистинные) значения:

  • Любая непустая строка (даже с пробелом ' ')
  • Любое число, отличное от нуля (включая отрицательные)
  • Любой объект (даже пустой {})
  • Любой массив (даже пустой [])
  • Любая функция

🔥 Логические операторы && (И) и || (ИЛИ) — как они работают на самом деле

  • a && b → возвращает первый falsy или последний truthy.
  • a || b → возвращает первый truthy или последний falsy.

Это важно: в JSX они возвращают не true/false, а сам операнд.

Оператор && (И) — строгий привратник:

ИЛИ "&&" вернёт первое ложное значение, либо если такового нет в условии, то вернёт последнее

  • Вычисление идет слева направо
  • Если левый операнд "falsy" - возвращается этот операнд
  • Если левый операнд "truthy" - возвращается правый операнд
javascript
// Если слева falsy — возвращает его и останавливается
console.log("" && "World") // '' (пустая строка)
 
// Если слева truthy — возвращает правое значение
console.log("Hello" && "World") // 'World'
console.log(true && "Hello") // 'Hello'

Оператор || (ИЛИ) — оптимистичный искатель

ИЛИ "||" находит первое истинное значение, либо если такового нет в условии, то возвращает последнее

  • Вычисление идет слева направо
  • Если левый операнд "falsy" - идёт проверять дальше
  • Если левый операнд "truthy" - возвращается этот операнд
javascript
// Если слева truthy — возвращает его и останавливается
console.log("Hello" || "World") // 'Hello'
 
// Если слева falsy — возвращает правое значение
console.log("" || "World") // 'World'
console.log(null || "Backup") // 'Backup'

🚀 Условный рендеринг в React

Базовый паттерн: условие && JSX

jsx
{
  isLoggedIn && <UserProfile />
}
{
  tasks.length > 0 && <TaskList />
}

Важный нюанс! Если используете array.length, может отобразиться "0"

jsx
{
  tasks.length && <TaskList />
} // Может показать 0!
{
  tasks.length > 0 && <TaskList />
} // Правильно!

Тернарное выражение (? :) для выбора между двумя вариантами

jsx
{
  isLoading ? <Spinner /> : <Content />
}
// то же самое что:
if (isLoading === true) {
  return <Spinner />
} else return <Content />

Комбинируем условия для сложных сценариев

jsx
// Показываем лоадер когда выбрано, но еще не загружено
{
  selectedTrackId && !selectedTrack && <span>Loading...</span>
}

🛠️ Реальный пример из нашего приложения (От теории к практике)

🔄 Пошаговый рефакторинг блока деталей трека

  • Для тестирования логики искусственно замедлим соединение

  • (F12 -> Nerwork -> No throttling -> 3G)

Netwok-screenshot

  • Было: Простой тернарный оператор

App.tsx
<div>
  <h3>Details</h3>
  {selectedTrack == null ? (
    "Track is not selected"
  ) : (
    <div>
      <h3>{selectedTrack.attributes.title}</h3>
    </div>
  )}
</div>

Шаг 1: Заменим тернарник на логические операторы

App.tsx
<div>
  <h3>Details</h3>
  {!selectedTrack && "Track is not selected"}
  {selectedTrack && (
    <div>
      <h3>{selectedTrack.attributes.title}</h3>
    </div>
  )}
</div>

Шаг 2: Добавим обработку загрузки

App.tsx
<div>
  <h3>Details</h3>
  {/*если треков нет и трек не выбран покажем "Track is not selected"*/}
  {!selectedTrack && !selectedTrackId && "Track is not selected"}
  {/*если треков нет, но трек выбран покажем "Loading..."*/}
  {!selectedTrack && selectedTrackId && "Loading..."}
  {selectedTrack && (
    <div>
      <h3>{selectedTrack.attributes.title}</h3>
    </div>
  )}
</div>

Теперь если ничего не выбрано или выбор сброшен увидим "Track is not selected"

screenshot-1

Шаг 3: Добавляем проверку на рассинхрон

Показывает Loading... если трек есть, ID выбран, но они не совпадают (данные устарели).

App.tsx
<div>
  <h3>Details</h3>
  {!selectedTrack && !selectedTrackId && "Track is not selected"}
  {/*если треков нет, но трек выбран покажем "Loading..."*/}
  {!selectedTrack && selectedTrackId && "Loading..."}
  {/*если треки есть, и трек выбран, но ID не совпадают, покажем "Loading..."*/}
  {selectedTrack && selectedTrackId && selectedTrack.id !== selectedTrackId && "Loading..."}
  {/*если треки есть, трек выбран и ID совпадают, покажем JSX*/}
  {selectedTrack && selectedTrack.id === selectedTrackId && (
    <div>
      <h3>{selectedTrack.attributes.title}</h3>
      <h4>Lyrics</h4>
      <p>{selectedTrack.attributes.lyrics ?? "no lyrics"}</p>
    </div>
  )}
</div>

Если треки есть, и трек выбран, но ID не совпадают, видим "Loading..." или, если треков нет, но трек выбран, тоже "Loading..."

screen2

Шаг 4: Финальная версия с улучшенной логикой

App.tsx
<div>
  <h3>Details</h3>
  {!selectedTrack && !selectedTrackId && "Track is not selected"}
  {!selectedTrack && selectedTrackId && "Loading..."}
  {selectedTrack && selectedTrackId && selectedTrack.id !== selectedTrackId && "Loading..."}
  {/*если треки есть, покажем JSX*/}
  {selectedTrack && (
    <div>
      <h3>{selectedTrack.attributes.title}</h3>
      <h4>Lyrics</h4>
      <p>{selectedTrack.attributes.lyrics ?? "no lyrics"}</p>
    </div>
  )}
</div>

Если треки есть, и трек выбран, но ID не совпадают, видим "Loading..."

screenshot3

Если треки есть, трек выбран и ID совпадают, покажем JSX

screenshot4

Заключение

🔴

Понимание truthy/falsy значений и работы логических операторов - это фундамент для эффективной работы с условным рендерингом в React. Практикуйтесь с различными комбинациями условий, чтобы развить интуитивное понимание этих концепций.

Ключевые выводы:

  • Используйте && для условного показа элементов
  • Используйте ? : для выбора между двумя вариантами
  • Выносите сложную логику в переменные для читаемости
  • Помните об особенностях преобразования разных типов в boolean

🏠 Домашнее задание

Цель задания:

Сформировать глубокое понимание логических операторов && и || в JavaScript и научиться эффективно применять их в современной веб-разработке.

1. Оператор && ("и" / "and")

Задание 1.1: Предскажи результат выполнения и объясни почему:

javascript
console.log(true && "Hello") // ?
console.log(false && "World") // ?
console.log("" && "JavaScript") // ?
console.log("React" && "Vue") // ?
console.log(5 && 10) // ?
console.log(0 && 100) // ?
console.log(null && "Test") // ?
console.log(undefined && 42) // ?

Задание 1.2: Что выведут эти выражения?

javascript
console.log("A" && "B" && "C") // ?
console.log("X" && "" && "Z") // ?
console.log(1 && 2 && 0 && 4) // ?
console.log(true && "Yes" && 7) // ?

2. Оператор || ('или' / 'or')

Задание 2.1: Предскажи результат:

javascript
console.log(false || "Default") // ?
console.log("" || "Fallback") // ?
console.log(null || "Backup") // ?
console.log("First" || "Second") // ?
console.log(0 || 42) // ?
console.log(undefined || "Value") // ?

Задание 2.2: Цепочки операторов ||:

javascript
console.log("" || 0 || "Found") // ?
console.log(false || null || "OK") // ?
console.log(undefined || "" || 0 || "Final") // ?
console.log("Start" || false || "End") // ?

3. Смешанные операторы

Задание 3.1: Сложные выражения:

javascript
console.log("A" && ("B" || "C")) // ?
console.log(false || ("X" && "Y")) // ?
console.log(("" && "Test") || "Default") // ?
console.log("Hi" || (false && "Bye")) // ?
console.log((true && "Yes") || "No") // ?
console.log(null || (0 && "Zero")) // ?

Задание 3.2: Приоритет операторов:

javascript
console.log("A" || ("B" && "C")) // ?
console.log(("A" || "B") && "C") // ?
console.log(("A" && "B") || ("C" && "D")) // ?
console.log((false && true) || (true && "Result")) // ?

4. Практические задачи

Задание 4.1: Напиши функцию getUserName, которая:

  • Принимает объект пользователя (user)
  • Если у пользователя есть имя, то возвращает его имя, если имя отсутствует, возвращает "Гость"
  • Используй оператор ||
javascript
function getUserName(user) {
  // Твой код здесь
}
 
// Тесты:
console.log(getUserName({ name: "Анна" })) // "Анна"
console.log(getUserName({})) // "Гость"
console.log(getUserName({ name: "" })) // "Гость"

Задание 4.2: Напиши функцию canAccess, которая проверяет права доступа:

  • Пользователь может получить доступ, если:
  • он авторизован И (имеет роль admin ИЛИ является владельцем ресурса)
  • Используй операторы && и ||
javascript
function canAccess(user, resource) {
  // Твой код здесь
}
 
// Тесты:
console.log(canAccess({ isAuth: true, role: "admin" }, { owner: "user1" })) // true
console.log(canAccess({ isAuth: true, id: "user1" }, { owner: "user1" })) // true
console.log(canAccess({ isAuth: false, role: "admin" }, { owner: "user1" })) // false

5. React компоненты

Выполни домашнее задание со звездочкой из предыдущего домашнего задания

Улучшение UX

  1. Проблема отзывчивости: При медленном интернете пользователь не понимает, что клик произошёл
  • Реши эту проблему БЕЗ добавления нового состояния loading
  • Подсказка: подумай о последовательности обновления состояний
  1. Индикация загрузки: Когда детали задачи загружаются, покажи "Loading..." вместо старых данных
  • Используй только существующие состояния
  • Подумай о логических условиях отображения

Итоговый результат 🚀. Для того чтобы проверить в Network выбери 3G

res13-3


💡

🔶 Помни: каждая задача в этом домашнем задании основана на реальных ситуациях из мира веб-разработки. То, что ты изучишь сегодня, завтра поможет тебе писать код быстрее, чище и надёжнее.

🔶 Не бойся экспериментировать! Запускай код в консоли, меняй значения, наблюдай за результатами. Именно через практику приходит истинное понимание.

🔶 Удачи в изучении! Каждое правильно решённое задание приближает тебя к статусу профессионального разработчика. 🚀

Боевой маршрут (React Путь Самурая: без альтернатив)

Видеоурок - 16 видео из 30