https://github.com/devloversteam/react-interview-questions
Найпопулярніші запитання та відповіді на співбесіді з React
https://github.com/devloversteam/react-interview-questions
interview-questions react react-interview-questions react-interview-questions-and-answers
Last synced: 8 months ago
JSON representation
Найпопулярніші запитання та відповіді на співбесіді з React
- Host: GitHub
- URL: https://github.com/devloversteam/react-interview-questions
- Owner: DevLoversTeam
- License: mit
- Created: 2025-01-01T12:50:06.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-04-26T17:05:04.000Z (about 1 year ago)
- Last Synced: 2025-05-19T13:08:14.899Z (about 1 year ago)
- Topics: interview-questions, react, react-interview-questions, react-interview-questions-and-answers
- Homepage:
- Size: 814 KB
- Stars: 127
- Watchers: 5
- Forks: 12
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: .github/CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE.txt
- Code of conduct: CODE_OF_CONDUCT.md
- Security: SECURITY.md
Awesome Lists containing this project
README
React
Найпопулярніші запитання та відповіді на співбесіді з React
### Основи React
1. Що таке React?
#### React
- React — це JavaScript-бібліотека для створення користувацьких інтерфейсів. Основні характеристики:
1. **Компонентний підхід:** UI розбивається на окремі компоненти, які можна повторно використовувати.
2. **Virtual DOM:** Забезпечує ефективне оновлення інтерфейсу, мінімізуючи маніпуляції з реальним DOM.
3. **Декларативність:** Ви описуєте, як має виглядати UI в певному стані, а React забезпечує його відповідність.
4. **Однонаправлений потік даних:** Дані передаються згори донизу через props, що спрощує контроль за станом.
- React створений Facebook і широко використовується для розробки SPA (Single Page Applications).
2. Перерахуйте особливості React?
#### React
1. **Компонентний підхід:** Код розділений на багаторазові, незалежні компоненти.
2. **Віртуальний (Virtual) DOM:** Швидке оновлення інтерфейсу без прямого маніпулювання DOM.
3. **Односпрямований потік даних:** Дані передаються з батьківських компонентів у дочірні через пропси.
4. **JSX:** Розширення синтаксису JavaScript для написання UI у вигляді XML-подібного коду.
5. **Стан і життєвий цикл:** Компоненти можуть зберігати і управляти своїм станом.
6. **React Hooks:** Додають можливості роботи зі станом і побічними ефектами у функціональних компонентах.
7. **Екосистема:** Підтримує бібліотеки на кшталт React Router, Redux для розширення функціоналу.
8. **SEO-френдлі (з Next.js):** Серверний рендеринг для кращої індексації.
9. **Мобільна розробка:** React Native дозволяє створювати мобільні додатки на основі React.
10. **Відкритий код:** Активна підтримка спільноти.
3. Які основні функції React?
#### React
#### Основні функції React:
1. **Декларативний підхід**
- React дозволяє створювати інтерактивний інтерфейс, описуючи, як він повинен виглядати, а бібліотека сама оптимізує оновлення DOM.
2. **Компонентна структура**
- Додаток будується з незалежних, багаторазових компонентів, які спрощують розробку, тестування та підтримку.
3. **Віртуальний DOM**
- React використовує Virtual DOM для ефективного оновлення реального DOM, що значно покращує продуктивність.
4. **Односпрямований потік даних**
- Дані передаються від батьківських компонентів до дочірніх через props, що спрощує управління станом.
5. **Хуки (Hooks)**
- Дозволяють використовувати стан і методи життєвого циклу у функціональних компонентах.
6. **JSX**
- Розширення JavaScript для опису UI в синтаксисі, схожому на HTML.
7. **React Native**
- Можливість створювати нативні мобільні додатки з використанням тих самих принципів, що і для вебу.
8. **Екосистема**
- Великий набір бібліотек та інструментів, таких як React Router, Redux, Context API.
9. **Підтримка серверного рендерингу (SSR)**
- Дозволяє оптимізувати SEO та прискорювати початкове завантаження сторінок.
10. **Управління станом**
- За допомогою useState, Context API, Redux чи інших бібліотек.
Ці функції роблять React потужною і гнучкою бібліотекою для створення сучасних додатків.
4. Які ключові переваги використання React?
#### React
#### Ключові переваги використання React
1. **Швидкість**: Завдяки Virtual DOM React мінімізує взаємодії з реальним DOM, що підвищує продуктивність.
2. **Компонентний підхід**: Код розбивається на багаторазово використовувані компоненти, що спрощує розробку та підтримку.
3. **Одностороння передача даних**: Потік даних у React відбувається в одному напрямку (зверху вниз), що полегшує дебагінг.
4. **Велика спільнота**: React має величезну екосистему бібліотек, інструментів і розширень.
5. **Сумісність із мобільною розробкою**: Використовуючи React Native, можна створювати кросплатформені мобільні додатки.
6. **JSX**: Синтаксис, який дозволяє писати JavaScript разом із HTML, що підвищує читабельність коду.
7. **Підтримка хуків**: Спрощення роботи зі станом та життєвим циклом у функціональних компонентах.
8. **SEO-дружність**: Серверний рендеринг за допомогою інструментів, таких як Next.js, покращує SEO-оптимізацію.
9. **Гнучкість**: React можна інтегрувати в будь-який проєкт або фреймворк без значних змін у коді.
10. **React DevTools**: Інструмент для налагодження, який дозволяє зручно аналізувати компоненти та стан додатка.
5. Що таке JSX?
#### React
- **JSX (JavaScript XML)** — це синтаксис, який дозволяє писати структури UI у вигляді XML-подібного коду всередині JavaScript. JSX є розширенням JavaScript і використовується в React для опису, як виглядає інтерфейс.
#### Основні особливості JSX:
1. **XML-подібний синтаксис:** Нагадує HTML, але використовується у JavaScript.
```jsx
const element =
Hello, world!
;
```
2. **Вбудований JavaScript:** Ви можете писати JavaScript-код у фігурних дужках `{}`.
```jsx
const name = "Alice";
const element =
Hello, {name}!
;
```
3. **Трансляція:** JSX компілюється в звичайний JavaScript, використовуючи такі бібліотеки, як Babel.
```jsx
const element =
Hello
;
// Перетворюється в:
const element = React.createElement("h1", null, "Hello");
```
4. Атрибути: Використовуються як у HTML, але замість `class` пишеться `className`, а замість `for` — `htmlFor`.
```jsx
const input = ;
```
5. JSX повертає дерево елементів: JSX-вираз може повертати лише один кореневий елемент. Використовуйте `` або порожній тег `<>` для групування.
```jsx
return (
<>
Title
Description
>
);
```
#### Переваги:
- Зручне створення UI-компонентів.
- Зрозумілий і читабельний синтаксис.
- Тісна інтеграція з JavaScript-логікою.
JSX не обов'язковий у React, але широко використовується через зручність і гнучкість.
6. Різниця між станом (state) та пропсами (props)?
#### React
#### Різниця між станом (state) та пропсами (props)
| Критерій | State | Props |
| -------------------- | --------------------------------------------------------------------- | -------------------------------------------------------- |
| Призначення | Зберігає внутрішній стан компонента. | Передає дані від батьківського компонента до дочірнього. |
| Змінюваність | Може змінюватися всередині компонента. | Незмінні (read-only). |
| Доступність | Доступний тільки в компоненті, де визначений. | Доступний у дочірньому компоненті через атрибути. |
| Ініціалізація | Встановлюється в компоненті за допомогою `useState` або конструктора. | Визначається батьківським компонентом. |
| Область використання | Для збереження динамічних даних, що можуть змінюватися. | Для передачі фіксованих або динамічних даних. |
| Хто керує? | Компонент, у якому state визначений. | Батьківський компонент. |
7. Яка різниця між елементом і компонентом?
#### React
#### Різниця між елементом і компонентом у React:
| Критерій | Елемент | Компонент |
| --------------------------- | ---------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
| **Визначення** | Об'єкт, що описує, як має виглядати інтерфейс. | Функція або клас, який повертає React-елементи. |
| **Тип** | Нероздільний (immutable). | Багаторазовий і може мати стан (state). |
| **Синтаксис створення** | `React.createElement` або JSX (`
`). | Функція або клас (`function MyComponent() {}` або `class MyComponent extends React.Component {}`). |
| **Призначення** | Представляє окремий вузол у DOM. | Інкапсулює логіку та структуру інтерфейсу. |
| **Можливість використання** | Використовується для створення UI на базовому рівні. | Використовується для побудови складних структур із бізнес-логікою. |
| **Приклад** | `Hello
` | `function Hello() { return Hello
; }` |
- Елемент — це "будівельний блок", а компонент — "конструктор" для створення складних інтерфейсів.
8. Як створити компоненти в React?
#### React
#### У React компоненти можна створювати двома способами:
1. **Функціональний компонент**
- Це проста функція, яка повертає React-елементи.
```jsx
function Greeting(props) {
return
Hello, {props.name}!
;
}
// Використання:
;
```
2. **Класовий компонент**
- Це клас, який успадковується від React.Component і обов’язково має метод render.
```jsx
class Greeting extends React.Component {
render() {
return
Hello, {this.props.name}!
;
}
}
// Використання:
;
```
#### Відмінності:
- Функціональні компоненти простіші та краще підходять для компонентів без стану.
- Класові компоненти використовуються для складніших компонентів із власним станом або методами життєвого циклу.
**Примітка:** Сучасний підхід передбачає використання функціональних компонентів із хуками замість класових.
9. Що таке стан (state) у React?
#### React
- **Стан (state)** у React — це об'єкт, який використовується для зберігання даних, що можуть змінюватися з часом, і впливають на рендеринг компонента. Стан дозволяє компонентам React бути динамічними і реагувати на події, введення користувача тощо.
#### Особливості стану:
1. **Локальний для компонента:** Стан доступний тільки в тому компоненті, де він визначений.
2. **Змінюється асинхронно:** React об'єднує виклики setState для оптимізації рендерингу.
3. **Ініціалізується в конструкторі** (для класових компонентів) або через useState (у функціональних компонентах).
#### У класових компонентах:
```jsx
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
increment = () => {
this.setState({ count: this.state.count + 1 });
};
render() {
return (
Count: {this.state.count}
Increment
);
}
}
```
#### У функціональних компонентах (з хуком `useState`):
```jsx
import React, { useState } from "react";
function Counter() {
const [count, setCount] = useState(0);
return (
Count: {count}
setCount(count + 1)}>Increment
);
}
```
#### Основні відмінності між станом і пропсами:
- **State** — локальний для компонента і може змінюватися.
- **Props** — передаються зовні і є незмінними (immutable).
10. Що таке пропси (props) в React?
#### React
- **Пропси (props)** в React — це об'єкт, який містить дані, що передаються від батьківського компонента до дочірнього. Вони використовуються для налаштування компонентів і є незмінними (immutable).
#### Особливості пропсів:
1. **Передаються зверху вниз** (унідіrectional data flow) — від батьківського компонента до дочірнього.
2. **Незмінні** — компонент не може змінювати отримані пропси.
3. **Динамічні** — значення пропсів можуть змінюватися, якщо змінюються дані в батьківському компоненті.
#### Використання пропсів:
1. **У функціональному компоненті:**
```jsx
function Welcome(props) {
return
Hello, {props.name}!
;
}
// Використання:
;
```
2. **У класовому компоненті:**
```jsx
Копіювати;
Редагувати;
class Welcome extends React.Component {
render() {
return
Hello, {this.props.name}!
;
}
}
// Використання:
;
```
#### Передача пропсів:
```jsx
function App() {
return (
);
}
```
- Результат:
```bash
Hello, Alice!
Hello, Bob!
```
#### Деструктуризація пропсів:
```jsx
function Welcome({ name }) {
return
Hello, {name}!
;
}
```
#### Значення пропсів за замовчуванням:
```jsx
function Welcome({ name = "Guest" }) {
return
Hello, {name}!
;
}
// Використання:
; // Виведе: Hello, Guest!
```
- Пропси забезпечують компонентам React гнучкість і можливість повторного використання.
11. Навіщо потрібен атрибут key при рендері списків?
#### React
- Атрибут `key` використовується для ідентифікації елементів у списках під час рендеру.
#### Призначення:
1. **_Оптимізація оновлень:_** React використовує `key` для ефективного оновлення інтерфейсу, швидко визначаючи, які елементи змінити, додати або видалити.
2. **_Запобігання зайвим рендерам:_** `key` допомагає уникнути перерендеру незмінених елементів.
3. **_Збереження стану компонентів:_** Наприклад, якщо елемент списку містить форму, `key` дозволяє React зберігати її стан між оновленнями.
#### Правильне використання:
- Значення `key` має бути унікальним серед братніх елементів.
- Найкраще підходять стабільні ідентифікатори (наприклад, `id` з бази даних).
- Не рекомендується використовувати індекс масиву як `key`, оскільки це може призвести до помилок при зміні порядку елементів.
```jsx
const items = ["Apple", "Banana", "Cherry"];
return (
- {item} // Унікальний key для кожного елемента
{items.map((item, index) => (
))}
);
```
12. Як передаються дані між компонентами у React
#### React
- У React дані передаються між компонентами за ієрархією наступним чином:
#### Передача даних вниз (від батьківського компонента до дочірнього)
- Для передачі даних вниз використовується props. Батьківський компонент передає значення або функції через атрибути дочірньому компоненту.
- **Приклад:**
```jsx
function ParentComponent() {
const data = "Hello from Parent";
return ;
}
function ChildComponent({ message }) {
return
{message}
;}
```
- `message` передає значення `data` в дочірній компонент `ChildComponent`.
- У дочірньому компоненті доступ до пропсів відбувається через параметр функції або `this.props` у класовому компоненті.
#### Передача даних вгору (від дочірнього компонента до батьківського)
- Дані передаються вгору за допомогою callback-функцій. Батьківський компонент передає функцію дочірньому, а той викликає її з потрібними даними.
- **Приклад:**
```jsx
function ParentComponent() {
const handleData = (childData) => {
console.log("Data from child:", childData);
};
return ;
}
function ChildComponent({ sendData }) {
const data = "Hello from Child";
return sendData(data)}>Send Data;
}
```
- Батьківський компонент передає функцію `handleData` в пропс `sendData`.
- Дочірній компонент викликає `sendData`, передаючи значення `data`.
#### Альтернативні підходи для складних додатків:
1. **Контекст (Context API):**
- Для передачі даних глибоко по ієрархії без пропсів.
- Підходить для глобального стану, наприклад, теми чи мови інтерфейсу.
```jsx
const MyContext = React.createContext();
function ParentComponent() {
const data = "Hello from Context";
return (
);
}
function ChildComponent() {
const contextData = React.useContext(MyContext);
return
{contextData}
;}
```
2. **Менеджери стану (Redux, Zustand, MobX):**
- Для передачі даних у великих додатках через єдиний глобальний стан.
3. **Custom Hooks:**
- Використовується для спільного використання логіки між компонентами.
13. Чому React використовує className замість атрибута класу?
#### React
- У React використовується `className` замість `class`, тому що `class` є зарезервованим ключовим словом у JavaScript.
#### Причини:
1. **Уникнення конфліктів** – `class` використовується для визначення класів у JavaScript (`class MyComponent {}`), що могло б викликати синтаксичні помилки.
2. **Сумісність з JSX** – JSX є синтаксичним розширенням JavaScript, тому використання `className` допомагає уникнути неоднозначностей.
3. **Пряме відображення** у `document.createElement` – React перетворює JSX у виклики `React.createElement`, і для встановлення класів у DOM-елементах використовується `className`.
#### Приклад:
```jsx
// Коректний варіант у React
// Некоректний варіант (синтаксична помилка)
```
- Це стандарт React, який гарантує стабільність і узгодженість у коді.
14. Які є винятки щодо іменування компонентів React?
#### React
- В React є кілька важливих правил і винятків щодо іменування компонентів:
1. **Великі літери для компонентів:** Імена компонентів повинні починатися з великої літери. Це обов'язково, щоб React міг відрізнити компоненти від стандартних HTML-елементів.
- Наприклад:
- Правильно: ``
- Неправильно: ``
2. **CamelCase:** Рекомендується використовувати стиль CamelCase для імен компонентів. Це означає, що кожне нове слово в імені компонента починається з великої літери:
- `MyComponent`
- `UserProfile`
3. **Назви не повинні співпадати з HTML-елементами:** Не використовуйте імена компонентів, які співпадають з тегами стандартних HTML-елементів, такими як div, span, button, тощо. Це може викликати конфлікти та непередбачувану поведінку:
- Правильно: ``
- Неправильно: `` (хоча це і HTML-елемент, в React це буде трактуватися як стандартний HTML тег)
4. **Уникати спеціальних символів:** Не використовуйте спеціальні символи в іменах компонентів (наприклад, пробіли, тире, підкреслення тощо), оскільки це може призвести до синтаксичних помилок:
- Правильно: `MyComponent`
- Неправильно: `my_component`, `my-component`
5. **Функціональні компоненти vs. класи:** Якщо ви використовуєте класи для компонентів, вони також повинні мати імена з великої літери:
- `class MyComponent extends React.Component {}`
Дотримання цих правил допоможе забезпечити правильну роботу та зрозумілість у коді.
15. Як писати коментарі в React?
#### React
- В React коментарі пишуться так само, як і в JavaScript, але є певні нюанси, коли мова йде про JSX.
1. **Коментарі в JavaScript (за межами JSX)**
```javascript
// Однорядковий коментар
/*
Багаторядковий коментар
*/
```
2. **Коментарі всередині JSX**
- У JSX необхідно використовувати спеціальний синтаксис, оскільки JSX є частиною JavaScript.
- Коментарі в JSX потрібно писати всередині фігурних дужок `{}`:
```jsx
function MyComponent() {
return (
{/_ Це коментар всередині JSX _/}
Hello, world!
);
}
```
- Коментарі в JSX повинні бути оточені `{/* коментар */}`, інакше вони викликають помилки.
- Вони можуть бути використані тільки всередині виразів JSX.
3. **Коментарі в функціях та методах**
- Для коментарів всередині функцій або методів можна використовувати стандартні JavaScript коментарі:
```jsx
function MyComponent() {
// Ось тут ми рендеримо компонент
return
}
```
#### Висновок:
- У JSX використовуйте `{/* коментар */}`.
- У звичайному JavaScript — `//` для однорядкових і `/* ... */` для багаторядкових коментарів.
### Рендеринг та оновлення стану
16. Що таке Virtual DOM в React?
#### React
- **Virtual DOM** — це віртуальне представлення реального DOM, яке React використовує для ефективного оновлення інтерфейсу.
#### Як працює в React:
1. **Рендеринг у Virtual DOM:** При зміні стану або пропсів компонентів React оновлює Virtual DOM.
2. **Diffing:** React порівнює новий Virtual DOM зі старою версією, визначаючи мінімальний набір змін.
3. **Оновлення реального DOM:** Виявлені зміни застосовуються до реального DOM, зводячи до мінімуму кількість маніпуляцій.
#### Основна перевага:
- Оптимізація оновлень DOM, що значно покращує продуктивність додатків.
17. Що таке (key) prop і яка перевага його використання в масивах елементів?
#### React
- У React prop `key` використовується для ідентифікації кожного елементу в списках або масивах, щоб допомогти React ефективно керувати рендерами при зміні або оновленні елементів списку. Це важливо для оптимізації процесу рендерингу, особливо коли список змінюється (елементи додаються, видаляються або змінюються).
#### Основні моменти щодо `key`:
1. **Унікальність:** Кожен елемент у списку повинен мати унікальний `key`. Це дозволяє React відстежувати, які елементи змінюються, додаються або видаляються, а також зберігати їх стан між рендерами.
2. **Оптимізація рендерингу:** Використання key дозволяє React мінімізувати кількість ререндерів, виконуючи тільки необхідні зміни в DOM. Без `key`, React має важчий час для відстеження змін, що призводить до повного повторного рендерингу списку, навіть якщо тільки один елемент змінився.
3. **Природа key:** Prop `key` не передається в компонент, тому його не можна використовувати для відображення значень в UI. Це тільки інтерналізована властивість, що використовується React для відстеження елементів.
#### Приклад використання `key` в списку:
```jsx
const items = ["apple", "banana", "cherry"];
function FruitList() {
return (
- {item} // Важливо: використовувати унікальний key
{items.map((item, index) => (
))}
);
}
```
#### Важливість унікальності `key`:
- **Неправильне використання:** Якщо у якості key використовувати неунікальні значення (наприклад, однаковий index), React не зможе коректно відстежувати зміни, і це призведе до помилок в рендерингу.
- **Ідеальний key:** Зазвичай, якщо є унікальний ідентифікатор елемента (наприклад, id), він повинен бути використаний як key замість індексу масиву.
```jsx
const items = [
{ id: 1, name: "apple" },
{ id: 2, name: "banana" },
{ id: 3, name: "cherry" },
];
function FruitList() {
return (
- {item.name} // Краще використовувати унікальні id
{items.map((item) => (
))}
);
}
```
#### Переваги використання `key`:
- Покращує продуктивність рендерингу.
- Дозволяє React оптимально оновлювати тільки змінені елементи, а не весь список.
- Забезпечує коректну обробку стану елементів при їх переміщенні, видаленні або оновленні.
Таким чином, використання `key` є важливим для ефективної роботи з масивами елементів у React.
18. Що таке умовний рендеринг у React?
#### React
- Умовний рендеринг у React — це процес, при якому компонент рендерить різний вміст залежно від певних умов. Це дозволяє динамічно змінювати відображення компонента на основі стану, пропсів або інших факторів.
#### Основні підходи до умовного рендерингу:
1. **Оператор `if`:** Можна використовувати стандартний оператор if для вирішення, що рендерити.
```jsx
function Greeting(props) {
if (props.isLoggedIn) {
return
Welcome back!
;}
return
Please sign up.
;}
```
2. **Тернарний оператор:** Часто використовують тернарний оператор для коротших умовних виразів.
```jsx
function Greeting(props) {
return
{props.isLoggedIn ? "Welcome back!" : "Please sign up."}
;}
```
3. **Логічне І (&&) для рендерингу:** Можна використати логічний оператор `&&`, щоб рендерити елемент лише за умови, що вираз зліва від нього є істинним.
```jsx
function Notifications(props) {
return (
{props.unreadMessages.length > 0 && (
You have {props.unreadMessages.length} unread messages.
)}
);
}
```
- Це працює так: якщо props.unreadMessages.length більше за 0, то відобразиться повідомлення, інакше нічого не буде відображено.
4. **Використання `return` з умовним оператором:** Ви можете використовувати return для умовного рендерингу на основі різних умов, як в прикладі з `if` або тернарним оператором.
#### Переваги умовного рендерингу:
- Дозволяє динамічно змінювати вміст залежно від стану або пропсів.
- Покращує гнучкість і можливість відображення різного контенту для різних користувачів або ситуацій.
#### Приклад:
```jsx
function UserStatus(props) {
return (
{props.isLoggedIn ? (
Log Out
) : (
Log In
)}
);
}
```
- Тут кнопка змінюється в залежності від того, чи користувач увійшов в систему.
19. Що таке фрагменти (Fragments) у React?
#### React
- Фрагменти в React — це спосіб групувати кілька елементів без додавання зайвих елементів в DOM. Вони дозволяють повернути декілька елементів з компонента без обгортки, такої як `div`, що може допомогти уникнути зайвих елементів, що можуть порушити стилі або структуру документа.
#### Як використовуються фрагменти?
1. **Без фрагментів (з обгорткою):**
```jsx
function MyComponent() {
return (
Title
Some text
);
}
```
- У цьому прикладі повертається один `div`, який обгортає `h1` і `p`.
2. **З фрагментами (без обгортки):**
```jsx
function MyComponent() {
return (
<>
Title
Some text
>
);
}
```
Тепер `h1` і `p` рендеряться без додаткового контейнера, що дозволяє зберегти чистоту DOM.
#### Переваги:
- **_Чистий DOM:_** Можна обходитись без зайвих обгорток у DOM.
- **_Зручність для рендерингу кількох елементів:_** Повернення кількох елементів з одного компонента без необхідності використовувати додаткові елементи.
#### Синтаксис:
- Можна використовувати порожні теги `<>` і `>`, які є скороченням для ``.
- Також можна використовувати `React.Fragment`, якщо потрібно додавати ключі (наприклад, при рендерингу списків):
```jsx
{item.name}
{item.description}
```
#### Коли використовувати:
- Коли потрібно рендерити кілька елементів без додаткової обгортки в DOM.
- Коли зберігаєте структуру компонента без порушення стилів чи верстки.
Фрагменти є дуже корисними для зменшення зайвих елементів у DOM та покращення продуктивності.
20. Що таке узгодження (Reconciliation)?
#### React
- **Reconciliation** (узгодження) — це процес, який React використовує для оновлення DOM найефективнішим способом. Коли стан або пропси компонента змінюються, React обчислює мінімальні зміни, які потрібно внести до реального DOM, щоб синхронізувати його зі станом віртуального DOM.
#### Як працює reconciliation?
1. **Порівняння старого та нового віртуального DOM:**
- React зберігає копію попереднього віртуального DOM.
- При зміні стану чи пропсів створюється новий віртуальний DOM.
- React порівнює новий віртуальний DOM із попередньою копією (алгоритм diffing).
2. **Виявлення відмінностей (diffing):**
- React ідентифікує, які частини дерева змінилися (нові елементи, зміни в атрибутах чи видалення елементів).
- Для цього використовується алгоритм, оптимізований для роботи з деревоподібними структурами.
3. **Оновлення реального DOM:**
- React застосовує зміни лише до тих частин DOM, які потрібно оновити, уникаючи повного перерендеру.
#### Основні принципи reconciliation:
- **Збереження вузлів одного рівня:** Якщо вузли мають однаковий тип (наприклад, `
- **Повторне використання компонентів:** Якщо компонент залишається тим самим, React повторно використовує існуючий екземпляр компонента.
- **Ключі для списків:** Якщо список елементів рендериться з масиву, React використовує ключі (`key` prop) для порівняння та збереження вузлів.
#### Приклад роботи:
```jsx
function App({ isVisible }) {
return isVisible ?
Hello
:Goodbye
;}
```
- Якщо `isVisible` змінюється з `true` на `false`, React видалить `
` і замінить його на `
`.
#### Важливість ключів (`key` prop) для списків:
- Ключі допомагають React коректно визначати зміни в списках. Наприклад:
```jsx
- {item.text}
{items.map((item) => (
))}
```
- Без унікальних ключів React не зможе точно визначити, які елементи списку змінилися.
#### Переваги reconciliation:
- Зменшення кількості операцій із DOM.
- Підвищення продуктивності додатків.
- Гладке оновлення інтерфейсу користувача.
21. Як оновити стан компонента?
#### React
- У React стан компонента оновлюється за допомогою методу `setState` у класових компонентах або `useState` у функціональних компонентах.
#### Класові компоненти:
- Стан оновлюється через `this.setState()`.
- **_Приклад:_**
```jsx
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
increment = () => {
this.setState({ count: this.state.count + 1 });
};
render() {
return (
Count: {this.state.count}
Increment
);
}
}
```
#### Функціональні компоненти:
- Стан оновлюється через функцію, отриману з `useState`.
- **_Приклад:_**
```jsx
import React, { useState } from "react";
function Counter() {
const [count, setCount] = useState(0);
const increment = () => {
setCount(count + 1);
};
return (
Count: {count}
Increment
);
}
```
#### Примітки:
1. **Асинхронність:** `setState` і `useState` працюють асинхронно. Для оновлення стану на основі попереднього значення використовуйте функціональний підхід:
```jsx
this.setState((prevState) => ({ count: prevState.count + 1 }));
setCount((prevCount) => prevCount + 1);
```
2. **Не оновлюйте стан напряму:** Модифікація стану без використання `setState` або `useState` не викликає повторний рендеринг.
22. Що таке вбудовані умовні вирази?
#### React
- **Вбудовані умовні вирази** в JavaScript (зокрема у React) — це механізми, що дозволяють вбудовувати умови безпосередньо в JSX для умовного рендерингу елементів або компонентів. Це дозволяє зробити код компактнішим і зручнішим для розуміння.
#### Основні методи:
1. **Оператор умови (тернарний оператор):** Це один із найпоширеніших способів для умовного рендерингу елементів в JSX. Він має такий синтаксис:
```jsx
умова ? вираз_якщо_правда : вираз_якщо_неправда;
```
**Приклад:**
```jsx
const isLoggedIn = true;
function App() {
return
Welcome, User!
:Please log in
}}
```
2. **Логічний оператор AND (&&):** Цей метод дозволяє відображати компонент або елемент тільки тоді, коли умова є true. Якщо умова не виконується, нічого не буде рендеритись.
**Приклад:**
```jsx
const isUserAdmin = true;
function App() {
return
You have admin privileges
}}
```
- У цьому випадку `
You have admin privileges
` буде відображено лише, якщо `isUserAdmin` — це `true`.3. **IF перед поверненням JSX:** Можна також використовувати звичайні умовні оператори if перед поверненням JSX, коли умова має бути більш складною або коли потрібно виконати декілька умовних дій.
**Приклад:**
```jsx
function App() {
let content;
if (isLoggedIn) {
content =
Welcome back!
;} else {
content =
Please sign in.
;}
return
}
```
#### Переваги:
- Вбудовані умовні вирази дозволяють писати більш чистий і компактний код.
- Вони покращують читаємість і зменшують використання додаткових умовних конструкцій.
#### Важливо:
- В React не можна використовувати інструкції `if` безпосередньо в JSX. Однак можна застосувати їх перед поверненням JSX.
### Події в React
23. Яка різниця між обробкою подій HTML і React?
#### React
#### Різниця між обробкою подій у HTML та React:
| Критерій | HTML | React |
| ---------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| **Прив’язка події** | Вказується як атрибут: ``. | Використовується camelCase: ``. |
| **Тип функції** | Посилання на глобальну функцію або рядок із JavaScript-кодом. | Прив’язка до функції компонента (зазвичай вказується як метод або стрілочна функція). |
| **Додавання слухачів подій** | Обробники додаються вручну через `addEventListener`. | React автоматично керує прив’язкою через віртуальний DOM. |
| **Контекст `this`** | Потрібно вручну встановлювати контекст, якщо використовується в класах. | React автоматично зберігає правильний контекст у функціональних компонентах. |
| **Стандартна поведінка** | Необхідно явно викликати `return false` для припинення поведінки. | Використовується `event.preventDefault()` для зупинки стандартної поведінки. |
| **Сумісність** | Обробляє лише реальні DOM-події. | Використовує "SyntheticEvent", що є обгорткою над нативними подіями. |
| **Кросбраузерність** | Потрібно вручну враховувати відмінності між браузерами. | React забезпечує кросбраузерну сумісність через SyntheticEvent. |
| **Прив’язка контексту** | Часто вимагає використання `bind`. | У класових компонентах потрібен `bind`, у функціональних — ні. |
#### Приклад у HTML:
```html
Click me
```
#### Приклад у React:
```jsx
function handleClick() {
alert("Clicked!");
}
function App() {
return Click me;
}
```
#### SyntheticEvent у React:
- React використовує обгортку над нативними подіями, яка нормалізує поведінку між різними браузерами та підвищує продуктивність.
24. Що таке синтетичні події в React?
#### React
- **Синтетичні події (Synthetic Events)** у React — це обгортки для нативних DOM-подій, які надають однаковий інтерфейс для обробки подій на різних браузерах. React створює SyntheticEvent для кожної події, що дозволяє працювати з подіями в уніфікованому вигляді, забезпечуючи кросбраузерну сумісність і покращуючи продуктивність.
#### Основні характеристики:
1. **Кросбраузерність:** SyntheticEvent абстрагує особливості роботи з подіями в різних браузерах, забезпечуючи однакову поведінку.
2. **Оптимізація:** SyntheticEvent використовує пул об'єктів, що дозволяє зменшити витрати на створення нових об'єктів подій.
3. **Одноразове використання:** Після обробки події об'єкт SyntheticEvent "повертається" в пул, і його не можна використовувати після цього. Для асинхронних операцій потрібно зберігати подію в окремій змінній.
4. **Інтерфейс:** SyntheticEvent має такі ж методи, як і стандартні нативні події (наприклад, `preventDefault()`, `stopPropagation()`).
#### Приклад використання:
```jsx
function handleClick(event) {
// SyntheticEvent має доступ до методу preventDefault()
event.preventDefault();
console.log("Button clicked!");
}
function App() {
return Click me;
}
```
- У цьому прикладі event — це SyntheticEvent, який працює аналогічно до нативної події, але з покращеними можливостями.
25. Як обробляти події в React?
#### React
- В React обробка подій працює схоже на стандартний JavaScript, але з деякими відмінностями. Події в React є синтетичними, що означає, що вони мають абстракцію поверх реальних подій браузера, що забезпечує крос-браузерну сумісність.
#### Основні принципи обробки подій в React:
1. **Синтетичні події:** Всі події в React обгорнуті в об'єкт **SyntheticEvent**, який є крос-браузерною реалізацією стандартних подій DOM. Це дозволяє обробляти події однаково в усіх браузерах.
2. **Використання camelCase для подій:** У React події записуються у форматі camelCase замість стандартного нижнього регістру (наприклад, `onClick` замість `onclick`).
3. **Передача функцій як обробників подій:** Події в React обробляються за допомогою функцій, які передаються через атрибути компонентів.
#### Приклад обробки події `click`:
```jsx
import React, { Component } from "react";
class MyButton extends Component {
handleClick = () => {
alert("Button clicked!");
};
render() {
return Click Me;
}
}
export default MyButton;
```
#### Приклад з функціональним компонентом:
```jsx
import React, { useState } from "react";
function MyButton() {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1);
};
return Clicked {count} times;
}
export default MyButton;
```
#### Особливості обробки подій:
1. **Не потрібно використовувати `addEventListener`:** В React немає необхідності вручну додавати або видаляти обробники подій. Це автоматично керується бібліотекою React.
2. **Збереження контексту в методах класових компонентів:** Якщо методи класових компонентів використовуються як обробники подій, контекст (`this`) потрібно прив'язати або через стрілкові функції, або вручну в конструкторі.
```jsx
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
// Прив'язка методу
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState({ count: this.state.count + 1 });
}
render() {
return (
Clicked {this.state.count} times
);
}
}
```
3. **Передача параметрів у функцію обробника:** Якщо потрібно передати додаткові аргументи в обробник події, можна використовувати стрілкові функції або функції з параметрами.
```jsx
function MyButton({ label }) {
const handleClick = (event, label) => {
console.log(label);
};
return (
handleClick(event, label)}>{label}
);
}
```
#### Обробка подій в DOM:
- Всі події, що відбуваються в React, працюють за принципом делегування подій, де один обробник подій реєструється для всього дерева компонентів і пропускається через React SyntheticEvent.
26. Що таке події вказівника (Pointer Events)?
#### React
#### Події вказівника (Pointer Events) у React
- **Pointer Events** — це API, що об'єднує події миші, сенсорного екрану та стилуса в єдину систему обробки подій.
#### Основні події Pointer Events
| **Подія** | **Опис** |
| ------------------- | ------------------------------------------------------------------------ |
| **onPointerDown** | Спрацьовує при натисканні пальцем, мишею або стилусом. |
| **onPointerUp** | Спрацьовує при відпусканні кнопки миші, пальця або стилуса. |
| **onPointerMove** | Викликається при русі вказівника над елементом. |
| **onPointerEnter** | Спрацьовує, коли вказівник входить у межі елемента. |
| **onPointerLeave** | Спрацьовує, коли вказівник виходить за межі елемента. |
| **onPointerCancel** | Викликається, коли браузер скасовує подію (наприклад, при зміні фокусу). |
#### Приклад використання у React
```jsx
const PointerExample = () => {
const handlePointerDown = () => console.log("Вказівник натиснуто");
return (
Клікни тут
);
};
```
- Цей код виведе `"Вказівник натиснуто"` у консоль при натисканні будь-яким пристроєм (миша, сенсор, стилус).
### Компоненти та їх типи
27. Коли використовувати компонент класу замість функціонального компонента?
#### React
- Класові компоненти використовувалися, коли потрібна була одна або кілька з цих функцій:
1. **Робота зі станом (state):** Раніше функціональні компоненти не підтримували локальний стан, тому використовували класи для цього.
Сьогодні хуки (useState, useReducer) дозволяють функціональним компонентам працювати зі станом.
2. **Методи життєвого циклу:** Класи забезпечували доступ до методів, таких як componentDidMount, componentDidUpdate, componentWillUnmount, для управління компонентом на різних етапах його існування.
Зараз це вирішується хуком useEffect.
3. **Обробка складної логіки:** Якщо логіка потребувала кількох методів і доступу до властивостей через this, класи виглядали логічним вибором.
Сучасний підхід — хуки, які дозволяють інкапсулювати логіку.
#### Коли класи більше не потрібні:
- Починаючи з React 16.8, функціональні компоненти з хуками замінили потребу у класових компонентах. Тому в нових проєктах перевагу варто віддавати функціональним компонентам. Класи використовуються лише для підтримки застарілого коду.
28. Що таке компоненти без стану (stateless components)?
#### React
- Компоненти без стану (stateless components) — це компоненти, які не зберігають і не обробляють жодного внутрішнього стану. Вони лише отримують дані через props і відображають їх у вигляді UI. Зазвичай ці компоненти є функціональними.
#### Особливості:
1. **Відсутність стану:** Вони не використовують this.state і не змінюють свій внутрішній стан.
2. **Тільки рендеринг:** Вони просто отримують пропси та відображають їх у вигляді елементів UI.
3. **Простота та передбачуваність:** Легше тестувати і підтримувати, оскільки не потрібно слідкувати за змінами стану.
#### Приклад:
```jsx
// Stateless component
function Greeting(props) {
return
Hello, {props.name}!
;}
// Використання:
;
```
#### Переваги:
- **Простота:** Легше розуміти та підтримувати.
- **Оптимізація продуктивності:** Оскільки ці компоненти не мають стану, React може більш ефективно їх оновлювати.
#### Коли використовувати:
- Коли компонент просто відображає дані та не потребує змін.
29. Що таке компоненти стану (stateful components)?
#### React
- **Компоненти стану** (stateful components) — це компоненти, які зберігають і управляють своїм внутрішнім станом. Вони використовують state для збереження даних, які можуть змінюватися протягом часу, і ці зміни впливають на рендеринг компонента.
#### Особливості:
1. **Стан (state):** Вони використовують this.state для зберігання і управління даними, які можуть змінюватися.
2. **Методи для оновлення стану:** Використовують метод this.setState() для оновлення стану.
3. **Життєвий цикл:** Мають доступ до методів життєвого циклу компонента, таких як componentDidMount(), shouldComponentUpdate(), componentDidUpdate() тощо.
#### Приклад:
```jsx
// Stateful component
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0,
};
}
increment = () => {
this.setState({ count: this.state.count + 1 });
};
render() {
return (
{this.state.count}
Increment
);
}
}
```
#### Переваги:
- **Динамічні компоненти:** Можуть змінювати свій вміст і вигляд на основі змін в стані.
- **Інтерактивність:** Підходять для створення інтерактивних інтерфейсів, де є потреба в оновленні стану при взаємодії з користувачем.
#### Коли використовувати:
- Коли компонент потребує управління внутрішнім станом, наприклад, для збереження введених даних у формі, рахунку, вибору тощо.
30. Що таке чисті компоненти (Pure Components)?
#### React
- **Чисті компоненти (Pure Components)** — це спеціальні класові компоненти React, які автоматично оптимізують рендеринг. Вони реалізують поверхневе порівняння пропсів і стану, щоб запобігти зайвим оновленням, якщо значення пропсів або стану не змінилися.
#### Як створити чистий компонент?
- Чистий компонент створюється шляхом успадкування від React.PureComponent.
```jsx
import React, { PureComponent } from "react";
class MyComponent extends PureComponent {
render() {
return
Hello, {this.props.name}!
;}
}
// Використання:
;
```
#### Як працює `PureComponent`?
- Виконує поверхневе порівняння (`shallow comparison`) пропсів і стану у методі `shouldComponentUpdate`.
- Якщо пропси та стан не змінилися, компонент не рендериться повторно.
#### Коли використовувати `PureComponent`?
- Коли пропси та стан є простими структурами (примітивні значення або неглибокі об'єкти).
- Для підвищення продуктивності в компонентах, які часто оновлюються.
#### Обмеження:
1. **Глибоке порівняння:** `PureComponent` не враховує зміни всередині вкладених об'єктів або масивів.
- Наприклад, якщо ви оновлюєте об'єкт, але посилання на нього залишається незмінним, компонент не оновиться.
```jsx
this.setState({ data: { ...this.state.data, key: "new value" } }); // Обхідна
```
2. **Не працює з функціональними компонентами.**
- Альтернатива: використовувати `React.memo` для оптимізації функціональних компонентів.
```jsx
const MyComponent = React.memo(function MyComponent(props) {
return
Hello, {props.name}!
;});
```
31. Що таке компоненти вищого порядку (Higher-Order components)?
#### React
#### Компоненти вищого порядку (Higher-Order Components, HOC)
- Компонент вищого порядку — це функція, яка приймає компонент як вхідний аргумент і повертає новий компонент, розширюючи його функціональність.
#### Синтаксис HOC:
```jsx
const EnhancedComponent = higherOrderComponent(WrappedComponent);
```
#### Особливості HOC:
1. Приймає компонент як аргумент.
2. Повертає новий компонент із додатковими властивостями чи поведінкою.
3. Дозволяє перевикористовувати логіку у різних компонентах.
#### Приклад використання:
- HOC для додавання стану до компонента:
```jsx
import React, { useState } from "react";
// HOC: додає логіку роботи зі станом
function withCounter(WrappedComponent) {
return function EnhancedComponent(props) {
const [count, setCount] = useState(0);
const increment = () => setCount(count + 1);
return ;
};
}
// Компонент, який буде розширено
function Button({ count, increment }) {
return Clicked {count} times;
}
// Використання HOC
const EnhancedButton = withCounter(Button);
export default EnhancedButton;
```
#### Реальні сценарії використання HOC:
1. **Авторизація (Authentication)** — обгортання компонентів для перевірки прав доступу.
2. **Обробка даних** — підключення до API чи обробка стану.
3. **Логування** — додавання журналювання дій компонентів.
#### Обмеження HOC:
- Може створювати глибокі вкладення (component tree), якщо використовувати забагато HOC.
- Ускладнює читабельність через обгортання компонентів.
HOC — потужний інструмент для повторного використання логіки, але в сучасних додатках їх часто замінюють React Hooks.
32. Що таке children prop?
#### React
#### Що таке `children` prop?
- `children` — це спеціальний пропс у React, який використовується для передачі вкладених елементів або компонентів у компонент-обгортку.
#### Як це працює?
- Коли ви передаєте дочірній вміст між відкриваючим і закриваючим тегами компонента, цей вміст автоматично передається як значення `props.children`.
#### Приклад:
- **Компонент-обгортка:**
```jsx
function Wrapper({ children }) {
return
}
```
- **Використання:**
```jsx
function App() {
return (
Hello, World!
This is a paragraph inside the wrapper.
);
}
```
- **Результат:**
```html
Hello, World!
This is a paragraph inside the wrapper.
```
#### Ключові особливості `children`:
1. **Гнучкість:** Можна передавати будь-який тип даних: текст, JSX, компоненти, масиви елементів.
2. **Повторне використання:** Компонент-обгортка може динамічно відображати різний вміст.
3. **Структурованість:** Допомагає створювати компоненти з вкладеною структурою.
#### Використання `children` з функціональними пропсами:
Іноді `children` використовується як функція для динамічної передачі даних:
```jsx
function List({ items, children }) {
return
- {items.map((item) => children(item))}
}
function App() {
return (
{(item) =>
);
}
```
- **Результат:**
```html
```
- `children` — це потужний інструмент для створення універсальних і багаторазових компонентів у React.
33. Що таке портал (Portal)?
#### React
- **Портал (Portal)** у React — це спосіб рендерити дочірні елементи в DOM-вузол, який знаходиться за межами DOM-ієрархії батьківського компонента.
#### Як працює:
- React забезпечує портали через метод `ReactDOM.createPortal`, який приймає два аргументи:
1. **React-елемент**, що потрібно рендерити.
2. **Цільовий DOM-вузол**, у який слід вставити елемент.
#### Синтаксис:
```jsx
ReactDOM.createPortal(child, container);
```
- **child** — React-елемент, який потрібно рендерити.
- **container** — DOM-вузол, де елемент буде вставлено.
#### Приклад використання:
```jsx
import React from "react";
import ReactDOM from "react-dom";
function Modal({ children }) {
return ReactDOM.createPortal(
document.getElementById("modal-root") // Цільовий вузол
);
}
function App() {
return (
Основний контент
Це контент модального вікна
);
}
```
#### Де використовують портали:
- Модальні вікна.
- Спливаючі підказки (tooltips).
- Контекстні меню.
#### Особливості:
1. **Ієрархія подій:**
- Хоча елемент рендериться поза ієрархією DOM, обробка подій відбувається відповідно до React-ієрархії компонентів. Наприклад, події onClick підніматимуться до батьківських компонентів React.
2. Гнучкість: Портали дозволяють вставляти елементи в місця, які не вписуються в поточну структуру DOM.
#### Переваги:
- Легке управління "плаваючими" елементами.
- Збереження контексту React навіть за межами основної DOM-ієрархії.
34. Як працюють портали (Portals) в React, і які їх переваги та основні застосування в UI-розробці?
#### React
- **Портали (Portals)** в React дозволяють рендерити дочірні елементи в іншу частину DOM, а не в стандартне місце рендерингу компонента. Це корисно для розміщення елементів, які повинні знаходитися поза звичною ієрархією DOM, наприклад, модальні вікна, тултіп або спливаючі елементи.
#### Основні переваги порталів:
- Вони дають можливість рендерити елементи в інше місце DOM, не порушуючи структуру React-компонентів.
- Порти можуть бути корисні, коли потрібно рендерити елементи поверх іншого вмісту (наприклад, модальні вікна, спливаючі меню).
#### Як працюють портали:
- Портал дозволяє відправити вміст в будь-яке місце DOM, навіть поза межами кореневого контейнера React.
#### Приклад використання порталу:
```jsx
import ReactDOM from "react-dom";
const Modal = () => {
return ReactDOM.createPortal(
Це модальне вікно
document.getElementById("modal-root") // Місце в DOM, куди рендеримо портал
);
};
const App = () => {
return (
Головна сторінка
);
};
```
#### Ключові моменти:
- `ReactDOM.createPortal()`: використовується для створення порталу. Перший аргумент — це вміст, який рендериться, а другий аргумент — це DOM-елемент, в який цей вміст вставляється.
- Портали можуть бути використані для модальних вікон, тултіпів, спливаючих меню та інших елементів, які мають бути відображені поза межами основного дерева компонентів.
#### Особливості:
- Хоча елементи, що рендеряться через портали, знаходяться поза межами основної ієрархії React-компонентів, вони все одно мають доступ до контексту, стану і пропсів своїх батьків.
- Порти можуть бути корисні, якщо потрібно обробити випадки, коли елементи повинні бути розташовані "поверх" іншого контенту або на іншому рівні ієрархії DOM (наприклад, модальне вікно, яке не має бути обмежене батьківським контейнером).
Порти дозволяють зберігати логіку компонента і структуру, не порушуючи правила DOM, що дозволяє створювати зручні й чисті UI-компоненти.
### Життєвий цикл компонента
35. Методи життєвого циклу компонента у React?
#### React
- Методи життєвого циклу компонента в React використовуються для управління різними етапами життя компонентів: створення, оновлення та видалення.
#### Основні фази життєвого циклу:
1. **Монтування (Mounting):** Коли компонент додається в DOM.
- **_constructor():_** Ініціалізація стану та прив'язка методів.
- **_static getDerivedStateFromProps(props, state):_** Оновлення стану перед рендером (рідко використовується).
- **_render():_** Рендерить JSX у віртуальний DOM.
- **_componentDidMount():_** Викликається одразу після додавання компонента в DOM. Використовується для запитів API, ініціалізації бібліотек.
2. **Оновлення (Updating):** Коли змінюються пропси або стан.
- **_static getDerivedStateFromProps(props, state):_** Викликається перед кожним рендером.
- **_shouldComponentUpdate(nextProps, nextState):_** Контролює, чи потрібно повторно рендерити компонент. За замовчуванням повертає true.
- **_render():_** Виконується для оновлення віртуального DOM.
- **_getSnapshotBeforeUpdate(prevProps, prevState):_** Отримує знімок перед змінами (наприклад, положення скролу).
- **_componentDidUpdate(prevProps, prevState, snapshot):_** Викликається після оновлення. Використовується для повторних запитів або роботи з DOM.
3. **Розмонтування (Unmounting):** Коли компонент видаляється з DOM.
- **_componentWillUnmount():_** Використовується для очищення ресурсів (наприклад, таймерів, підписок).
4. **Обробка помилок (Error Handling):** Коли компонент викликає помилку.
- **_static getDerivedStateFromError(error):_** Дозволяє оновити стан після помилки.
- **_componentDidCatch(error, info):_** Логування помилок.
#### Таблиця методів:
| Фаза | Метод | Опис |
| ------------------- | ---------------------------- | --------------------------------------- |
| **Монтування** | `constructor()` | Ініціалізація стану та налаштування. |
| | `getDerivedStateFromProps()` | Оновлення стану перед рендером. |
| | `render()` | Рендеринг JSX у віртуальний DOM. |
| | `componentDidMount()` | Виконується після додавання в DOM. |
| **Оновлення** | `getDerivedStateFromProps()` | Оновлення стану перед рендером. |
| | `shouldComponentUpdate()` | Визначає, чи потрібен повторний рендер. |
| | `render()` | Оновлює віртуальний DOM. |
| | `getSnapshotBeforeUpdate()` | Отримує знімок стану перед оновленням. |
| | `componentDidUpdate()` | Виконується після оновлення. |
| **Розмонтування** | `componentWillUnmount()` | Очищення ресурсів перед видаленням. |
| **Обробка помилок** | `getDerivedStateFromError()` | Оновлює стан у разі помилки. |
| | `componentDidCatch()` | Логування помилок. |
#### Сучасний підхід:
У функціональних компонентах замість методів життєвого циклу використовують **хуки**:
- `useEffect` замінює `componentDidMount`, `componentDidUpdate`, `componentWillUnmount`.
- `useState` для управління станом.
36. Що робить метод shouldComponentUpdate?
#### React
- `shouldComponentUpdate` – це метод життєвого циклу у класових компонентах, який визначає, чи потрібно повторно рендерити компонент.
#### Як працює:
- За замовчуванням повертає `true`, що означає ререндер при будь-якій зміні `state` або `props`.
- Якщо повертає `false`, React не буде ререндерити компонент, навіть якщо props або `state` змінилися.
#### Приклад використання:
```jsx
class MyComponent extends React.Component {
shouldComponentUpdate(nextProps, nextState) {
return nextProps.value !== this.props.value; // Ререндер тільки при зміні value
}
render() {
return
}
}
```
#### Альтернатива у функціональних компонентах:
- Використовуй `React.memo()` для мемоізації.
- `useMemo()` і `useCallback()` допомагають оптимізувати ререндери.
37. Як виконати код перед видаленням компонента з дерева?
#### React
- Щоб виконати код перед видаленням компонента з дерева в React, використовують такі підходи:
1. Класові компоненти: componentWillUnmount
- Для класових компонентів є метод життєвого циклу componentWillUnmount, який викликається перед видаленням компонента.
```jsx
class MyComponent extends React.Component {
componentWillUnmount() {
console.log("Компонент буде видалено");
}
render() {
return
}
}
```
2. Функціональні компоненти: useEffect з очищенням
- У функціональних компонентах очищення можна зробити в useEffect, повернувши функцію, яка виконається перед видаленням компонента.
```jsx
import { useEffect } from "react";
function MyComponent() {
useEffect(() => {
return () => {
console.log("Компонент буде видалено");
};
}, []);
return
}
```
3. Обробка перед закриттям сторінки (beforeunload)
- Якщо потрібно виконати код перед закриттям вкладки або перезавантаженням сторінки:
```jsx
useEffect(() => {
const handleUnload = () => {
console.log("Сторінка закривається");
};
window.addEventListener("beforeunload", handleUnload);
return () => window.removeEventListener("beforeunload", handleUnload);
}, []);
```
#### Висновок
- `componentWillUnmount` – для класових компонентів.
- `useEffect` із `return` – для функціональних.
- `beforeunload` – для випадків, коли потрібно реагувати на вихід із сторінки.
38. Чому фрагменти (Fragment) кращі за контейнерні div?
#### React
- Фрагменти (`` або `<>...>`) кращі за контейнерні `
1. **Зменшення зайвого HTML**
- Фрагменти не додають додатковий елемент у DOM, що зменшує кількість вкладених тегів і покращує продуктивність.
```jsx
<>
Title
Text
>
```
- Результат у DOM:
```html
Title
Text
```
- На відміну від `
```html
Title
Text
```
2. **Відсутність стилістичних побічних ефектів**
- Додатковий `
3. **Краща сумісність з таблицями**
- У `` не можна безпосередньо вкладати `
```jsx
<>
Row 1
Row 2
>
```
- Це працює правильно, тоді як `
4. **Оптимізація продуктивності**
- Менше зайвих вузлів у DOM → швидший рендеринг та менше споживання пам’яті.
### Хуки
39. Що таке Хуки (Hooks) в React?
#### React
- **React Хуки (Hooks)** — це функції, які дозволяють вам використовувати стан та інші можливості React без написання класів.
#### Основні типи хуків:
1. **useState** — дозволяє додавати стан в функціональні компоненти.
```jsx
const [state, setState] = useState(initialState);
```
2. **useEffect** — дозволяє виконувати побічні ефекти (наприклад, запити до API або підписки) у функціональних компонентах.
```jsx
useEffect(() => {
// код для ефекту
}, [dependencies]); // залежності
```
3. **useContext** — доступ до значень контексту без необхідності використовувати компонент Consumer.
```jsx
const value = useContext(MyContext);
```
4. **useRef** — дозволяє створювати посилання на DOM-елементи або зберігати значення між рендерами без змін стану.
```jsx
const myRef = useRef(initialValue);
```
5. **useReducer** — альтернатива useState, зручна для управління складнішими станами через редуктори, подібно до Redux.
```jsx
const [state, dispatch] = useReducer(reducer, initialState);
```
6. **useMemo** — оптимізує обчислення значень, щоб уникнути непотрібних повторних обчислень.
```jsx
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
```
7. **useCallback** — повертає мемоізовану версію функції, щоб вона не створювалась знову при кожному рендері.
```jsx
const memoizedCallback = useCallback(() => {
// функція;
}, [dependencies]);
```
#### Основні переваги:
- **Функціональні компоненти:** Замість класових компонентів ви можете використовувати функціональні компоненти з хуками.
- **Покращена читабельність:** Логіка можна розділити на декілька хуків, що зменшує кількість коду та підвищує модульність.
- **Перерозподіл логіки:** Хуки дозволяють повторно використовувати логіку в різних компонентах без створення складних ієрархій.
40. Переваги Хуків (Hooks) в React?
#### React
| **Перевага** | **Опис** |
| ------------------------------------ | ---------------------------------------------------------------------------------------------- |
| **Менше коду** | Хуки дозволяють уникнути класів і скоротити обсяг коду. |
| **Краща читабельність** | Код з хуками легший для розуміння та підтримки. |
| **Повторне використання логіки** | Custom Hooks дозволяють повторно використовувати логіку між компонентами. |
| **Спрощене управління станом** | Використання `useState` і `useReducer` робить стейт-менеджмент простішим. |
| **Гнучкість у використанні ефектів** | `useEffect` дозволяє виконувати побічні ефекти без потреби в класових методах життєвого циклу. |
| **Легша міграція** | Полегшує перехід від класових компонентів до функціональних. |
41. Недоліки Хуків (Hooks) в React?
#### React
| **Недолік** | **Опис** |
| -------------------------------------- | ------------------------------------------------------------------------------------------- |
| **Збільшена кількість ререндерів** | Неправильне використання хуків, особливо `useEffect`, може викликати зайві ререндери. |
| **Ускладнене розуміння логіки** | Логіка компонента може бути розпорошена між кількома `useEffect`, що ускладнює дебаг. |
| **Відсутність явного життєвого циклу** | На відміну від класових компонентів, хуки не мають чітко виражених методів життєвого циклу. |
| **Можливі проблеми з оптимізацією** | Неправильне використання `useCallback` і `useMemo` може призвести до неефективної роботи. |
| **Складність у великих проєктах** | У масштабних додатках хуки можуть ускладнювати управління станом і побічними ефектами. |
42. Правила (обмеження) використання Хуків (Hooks) в React?
#### React
| **Правило** | **Опис** |
| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- |
| **Використання тільки у функціях** | Хуки можна викликати лише у функціональних компонентах або в кастомних хуках. |
| **Збереження порядку виклику** | Хуки не можна викликати умовно (`if`, `for`, `while`), інакше порушиться порядок виклику. |
| **Виклик тільки на верхньому рівні** | Хуки не можна викликати всередині вкладених функцій або обробників подій. |
| **Іменування кастомних хуків** | Кастомні хуки мають починатися з `use` (наприклад, `useAuth`). |
| **Дотримання правил залежностей** | У `useEffect`, `useMemo` та `useCallback` залежності (`[]`) потрібно вказувати правильно, щоб уникнути непередбачуваної поведінки. |
43. Що таке useReducer()?
#### React
- `useReducer()` — це хук у React, який використовується для управління станом у функціональних компонентах. Це альтернатива `useState()`, яка підходить для складних логік оновлення стану, особливо якщо зміни залежать від попереднього стану.
#### Синтаксис:
```jsx
const [state, dispatch] = useReducer(reducer, initialState);
```
- `reducer` — функція, яка приймає `state` і `action`, повертаючи новий стан.
- `initialState` — початковий стан.
- `dispatch` — функція для виклику редюсера з певною `action`.
#### Приклад:
```jsx
import { useReducer } from "react";
const initialState = { count: 0 };
function reducer(state, action) {
switch (action.type) {
case "increment":
return { count: state.count + 1 };
case "decrement":
return { count: state.count - 1 };
default:
return state;
}
}
function Counter() {
const [state, dispa