Створюй сучасні інтерфейси з найпопулярнішою бібліотекою!
📚 Урок 9 • Frontend • 30 хв читанняReact — це JavaScript бібліотека для створення користувацьких інтерфейсів. Розроблена Facebook (Meta) у 2013 році, сьогодні це найпопулярніший інструмент для frontend розробки!
Уяви, що ти будуєш будинок з LEGO. Кожна цеглинка — це компонент. В React ти створюєш маленькі компоненти (кнопка, картка, меню) і збираєш з них великий застосунок. Зламалась одна цеглинка? Заміни тільки її! 🧱
Розбивай UI на незалежні частини
Швидке оновлення без перезавантаження
UI автоматично оновлюється при зміні даних
Тисячі готових бібліотек та інструментів
Найбільше вакансій на ринку
Web, Mobile (React Native), Desktop
Facebook, Instagram, Netflix, Airbnb, Uber, WhatsApp, Discord, Dropbox, та ще тисячі компаній по всьому світу!
Найпростіший спосіб почати — використати Vite (швидкий збірник):
Переконайся, що у тебе встановлений Node.js (версія 18+). Перевір командою node -v
my-react-app/ ├── node_modules/ # залежності ├── public/ # статичні файли ├── src/ # твій код тут! │ ├── App.jsx # головний компонент │ ├── App.css # стилі │ └── main.jsx # точка входу ├── index.html # HTML шаблон ├── package.json # залежності та скрипти └── vite.config.js # налаштування Vite
JSX — це синтаксис, який дозволяє писати HTML-подібний код прямо в JavaScript:
function App() { const name = 'Кудик'; const isLoggedIn = true; return ( <div className="app"> <h1>Привіт, {name}!</h1> {/* JavaScript вирази в фігурних дужках */} <p>2 + 2 = {2 + 2}</p> {/* Умовний рендеринг */} {isLoggedIn && <p>Ти залогінений!</p>} </div> ); }
JSX повинен повертати один елемент. Використовуй <div> або фрагмент <>...</> для обгортки.
Компонент — це функція, яка повертає JSX. Ім'я компонента завжди з великої літери!
// Компонент Button function Button() { return ( <button className="btn"> Натисни мене! </button> ); } // Використання в іншому компоненті function App() { return ( <div> <h1>Мій застосунок</h1> <Button /> {/* використовуємо компонент */} <Button /> {/* можна багато разів! */} </div> ); }
Props (properties) — це параметри, які ми передаємо компоненту:
// Компонент приймає props function Card({ title, description, emoji }) { return ( <div className="card"> <span className="card-emoji">{emoji}</span> <h3>{title}</h3> <p>{description}</p> </div> ); } // Передаємо props при використанні function App() { return ( <div> <Card emoji="🦉" title="Кудик" description="Твій помічник у навчанні" /> <Card emoji="⚛️" title="React" description="Бібліотека для UI" /> </div> ); }
Замість function Card(props) і потім props.title, краще одразу деструктуризувати: function Card({ title, description })
State — це дані, які можуть змінюватися і при зміні яких компонент перемальовується:
import { useState } from 'react'; function Counter() { // [значення, функція_для_зміни] = useState(початкове_значення) const [count, setCount] = useState(0); return ( <div className="counter"> <h2>Лічильник: {count}</h2> <button onClick={() => setCount(count - 1)}> − Мінус </button> <button onClick={() => setCount(count + 1)}> + Плюс </button> </div> ); }
// Рядок const [name, setName] = useState(''); // Булеве значення const [isOpen, setIsOpen] = useState(false); // Масив const [items, setItems] = useState([]); // Об'єкт const [user, setUser] = useState({ name: '', age: 0 }); // Toggle (перемикач) <button onClick={() => setIsOpen(!isOpen)}> {isOpen ? 'Закрити' : 'Відкрити'} </button>
count = 5 — ❌ неправильно! setCount(5) — ✅ правильно! Завжди використовуй функцію-сеттер.
useEffect — хук для виконання побічних ефектів: запити на сервер, підписки, зміна DOM тощо:
import { useState, useEffect } from 'react'; function App() { const [data, setData] = useState(null); // Виконується один раз при монтуванні ([] — пустий масив) useEffect(() => { console.log('Компонент змонтовано!'); // Запит на API fetch('https://api.example.com/data') .then(res => res.json()) .then(data => setData(data)); }, []); // Виконується при кожній зміні count const [count, setCount] = useState(0); useEffect(() => { document.title = `Лічильник: ${count}`; }, [count]); // залежність — count return <div>...</div>; }
Виконається один раз при монтуванні
Виконається при зміні dep
Виконається при кожному рендері
function TodoList() { const todos = [ { id: 1, text: 'Вивчити React', done: true }, { id: 2, text: 'Створити проєкт', done: false }, { id: 3, text: 'Отримати роботу', done: false }, ]; return ( <ul> {todos.map(todo => ( <li key={todo.id} style={{ textDecoration: todo.done ? 'line-through' : 'none' }} > {todo.text} </li> ))} </ul> ); }
При рендерингу списку кожен елемент повинен мати унікальний key. Використовуй id з даних, а не індекс масиву!
function Greeting({ isLoggedIn, username }) { return ( <div> {/* Тернарний оператор */} {isLoggedIn ? <h1>Привіт, {username}!</h1> : <h1>Будь ласка, увійдіть</h1> } {/* Логічне І (&&) — показати якщо true */} {isLoggedIn && <button>Вийти</button>} {/* Логічне АБО (||) — показати якщо false */} {username || 'Гість'} </div> ); }
function Form() { const [value, setValue] = useState(''); // Обробник кліку const handleClick = () => { alert('Кнопку натиснуто!'); }; // Обробник введення const handleChange = (e) => { setValue(e.target.value); }; // Обробник форми const handleSubmit = (e) => { e.preventDefault(); // не перезавантажувати сторінку console.log('Відправлено:', value); }; return ( <form onSubmit={handleSubmit}> <input value={value} onChange={handleChange} placeholder="Введіть текст" /> <button type="submit">Надіслати</button> </form> ); }
Створимо простий список задач:
import { useState } from 'react'; function TodoApp() { const [todos, setTodos] = useState([]); const [input, setInput] = useState(''); // Додати задачу const addTodo = (e) => { e.preventDefault(); if (!input.trim()) return; setTodos([...todos, { id: Date.now(), text: input, done: false }]); setInput(''); }; // Видалити задачу const deleteTodo = (id) => { setTodos(todos.filter(todo => todo.id !== id)); }; return ( <div className="todo-app"> <h1>📝 Мої задачі</h1> <form onSubmit={addTodo}> <input value={input} onChange={(e) => setInput(e.target.value)} placeholder="Нова задача..." /> <button type="submit">Додати</button> </form> <ul> {todos.map(todo => ( <li key={todo.id}> {todo.text} <button onClick={() => deleteTodo(todo.id)}>🗑️</button> </li> ))} </ul> </div> ); }
Навігація між сторінками SPA
Глобальний стейт менеджмент
Робота з серверними даними
CSS-in-JS стилізація
Мобільні застосунки
SSR, SSG та фулстек React