nmk

Практична робота №3 (2 години)

Тема: Логіка умовного відображення

Мета: Навчитися створювати динамічні інтерфейси, які змінюють свій вигляд залежно від стану додатка; опанувати використання логічних операторів (&&), тернарних операторів та складніших конструкцій для реалізації табів (вкладок) та перемикачів.

Необхідні інструменти: Проєкт, розроблений на попередніх заняттях (Vite + React), редактор коду (VS Code).

План заняття

  1. Підготовка (Git branch)
  2. Просте умовне відображення (Оператор &&)
  3. Тернарний оператор (Toggle)
  4. Реалізація інтерфейсу з табами
  5. Фіксація змін (Git)

Хід виконання роботи

Ми продовжуємо розвивати наш додаток. На цьому етапі ми навчимося не просто виводити списки, а керувати їх видимістю та перемикатися між різними представленнями даних.

1. Підготовка (Git branch)

Перед початком роботи створіть нову гілку, щоб зберегти історію розробки:

git checkout -b feature/conditional-rendering

2. Просте умовне відображення (Оператор &&)

Найпростіший спосіб показати або приховати елемент у React — логічний оператор «І» (&&). Якщо ліва частина істинна, React відрендерить праву частину.

Завдання: Додати кнопку, яка показує або ховає коротку довідку про програму.

  1. У компоненті App.jsx створіть стан showHelp за допомогою useState (за замовчуванням false).

    const [showHelp, setShowHelp] = useState(false);
    
  2. Додайте кнопку, яка змінює цей стан на протилежний.

    <button onClick={() => setShowHelp(!showHelp)}>
      {showHelp ? "Приховати інструкцію" : "Показати інструкцію"}
    </button>
    
  3. Використовуйте конструкцію &&:

    {
      showHelp && <p>Довідка: Дозволяє керувати списками студентів.</p>;
    }
    

3. Тернарний оператор (Toggle)

Тернарний оператор ідеально підходить, коли у вас є два взаємовиключні стани (наприклад, “Увійти” / “Вийти” або “Список” / “Сітка”).

Завдання: Реалізувати перемикач режиму перегляду списку (повний список / тільки відфільтровані дані).

  1. Створіть стан filterActive (boolean).
  2. Створіть кнопку, текст якої змінюється залежно від стану: {filterActive ? "Показати всіх" : "Показати тільки успішних"}.
  3. У блоці рендерингу списку використайте тернарний оператор, щоб вирішити, який масив мапити: filterActive ? filteredStudents : allStudents.

    // Зміна кольору тексту залежно від балу
    <span style=>
      {student.score >= 60 ? "Зараховано" : "Незараховано"}
    </span>
    

4. Реалізація інтерфейсу з табами

Для складніших випадків, коли варіантів відображення більше ніж два, використовується стан-ідентифікатор (рядок або число).

Завдання: Створити систему табів: “Всі студенти”, “Статистика”, “Про автора”.

  1. Створіть стан activeTab зі значенням за замовчуванням 'list'.

    const [activeTab, setActiveTab] = useState("list"); // default
    
  2. Створіть навігаційну панель (набір кнопок). При кліку на кнопку activeTab змінюється на 'list', 'stats' або 'about'.
  3. Реалізуйте логіку відображення контенту:

    <div className="content">
      {activeTab === "list" && <StudentList />}
      {activeTab === "stats" && <StatisticsData />}
      {activeTab === "about" && <AboutAuthor />}
    </div>
    

5. Фіксація змін (Git)

  1. Додайте зміни:
    git add .
    
  2. Зробіть коміт:
    git commit -m "feat: add conditional rendering and tabs"
    
  3. Поверніться в головну гілку:
    git checkout main
    
  4. Злийте зміни:
    git merge feature/conditional-rendering
    

Завдання для самостійного виконання

  1. Порожній стан (Empty State): Додайте перевірку: якщо після фільтрації масив студентів порожній, замість списку виведіть повідомлення: “За вашим запитом нікого не знайдено”.
  2. Динамічні класи: Використовуючи тернарний оператор, додайте активній кнопці таба спеціальний CSS-клас (наприклад, active-tab), щоб візуально виділити її серед інших.
  3. Захист від помилок: Реалізуйте перевірку: якщо в об’єкті студента відсутнє поле score, замість цифри виведіть текст “Оцінка відсутня” за допомогою оператора нульового злиття (??) або тернарного оператора.

Контрольні запитання

  1. Чому використання if/else безпосередньо всередині JSX-розмітки призведе до помилки?
  2. Яка небезпека криється у використанні числа 0 у лівій частині оператора && в JSX? (Підказка: що React виведе на екран?).
  3. Як реалізувати умовний рендеринг, якщо логіка вибору компонента дуже складна (наприклад, 5+ варіантів)?
  4. В яких випадках використання тернарного оператора є кращим за використання оператора &&?
  5. Як React розуміє, що потрібно перерендерити частину інтерфейсу при зміні вкладки?

Результат заняття

Створено гнучкий інтерфейс, де користувач може перемикатися між різними екранами додатка без перезавантаження сторінки, використовуючи лише внутрішній стан React-компонентів.