├── .github ├── CONTRIBUTING.md ├── FUNDING.yml └── PULL_REQUEST_TEMPLATE.md ├── CODE_OF_CONDUCT.md ├── LICENSE.txt ├── README.md ├── SECURITY.md └── assets ├── code.png └── react.svg /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # 🧠 Як зробити внесок у Frontend Lovers 2 | 3 | Дякуємо, що хочете зробити внесок у наш проєкт! Нижче описано кілька простих правил, які допоможуть вам підготувати якісний pull request. 4 | 5 | ## 🔧 Формат доповнення 6 | 7 | - Кожне питання повинне бути оформлене в HTML-елементі `
` зі структурою: 8 | 9 | ![Code](../assets/code.png) 10 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # FUNDING.yml 2 | # Налаштування можливостей підтримки проєкту 3 | 4 | github: ViktorSvertoka 5 | buy_me_a_coffee: viktor.svertoka 6 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Чекліст: 6 | 7 | - [ ] Я ознайомився з [CONTRIBUTING.md](CONTRIBUTING.md) і дотримувався вказівок. 8 | - [ ] Моє доповнення не дублює вже існуюче питання чи відповідь. 9 | - [ ] Я додав(ла) нове запитання у відповідному форматі (див. існуючі приклади). 10 | - [ ] Я додав(ла) нове запитання **в кінець файлу** з **наступним за порядком номером**. 11 | 12 | --- 13 | 14 | 15 | 16 | ... 17 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | - Demonstrating empathy and kindness toward other people 21 | - Being respectful of differing opinions, viewpoints, and experiences 22 | - Giving and gracefully accepting constructive feedback 23 | - Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | - Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | - The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | - Trolling, insulting or derogatory comments, and personal or political attacks 33 | - Public or private harassment 34 | - Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | - Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | [frontendlovers@gmail.com](mailto:frontendlovers@gmail.com). 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Frontend Lovers 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | React 3 |

4 | 5 |

Найпопулярніші запитання та відповіді на співбесіді з React

6 | 7 | ### Основи React 8 | 9 |
10 | 1. Що таке React? 11 | 12 | #### React 13 | 14 | - React — це JavaScript-бібліотека для створення користувацьких інтерфейсів. Основні характеристики: 15 | 16 | 1. **Компонентний підхід:** UI розбивається на окремі компоненти, які можна повторно використовувати. 17 | 18 | 2. **Virtual DOM:** Забезпечує ефективне оновлення інтерфейсу, мінімізуючи маніпуляції з реальним DOM. 19 | 20 | 3. **Декларативність:** Ви описуєте, як має виглядати UI в певному стані, а React забезпечує його відповідність. 21 | 22 | 4. **Однонаправлений потік даних:** Дані передаються згори донизу через props, що спрощує контроль за станом. 23 | 24 | - React створений Facebook і широко використовується для розробки SPA (Single Page Applications). 25 | 26 |
27 | 28 |
29 | 2. Перерахуйте особливості React? 30 | 31 | #### React 32 | 33 | 1. **Компонентний підхід:** Код розділений на багаторазові, незалежні компоненти. 34 | 35 | 2. **Віртуальний (Virtual) DOM:** Швидке оновлення інтерфейсу без прямого маніпулювання DOM. 36 | 37 | 3. **Односпрямований потік даних:** Дані передаються з батьківських компонентів у дочірні через пропси. 38 | 39 | 4. **JSX:** Розширення синтаксису JavaScript для написання UI у вигляді XML-подібного коду. 40 | 41 | 5. **Стан і життєвий цикл:** Компоненти можуть зберігати і управляти своїм станом. 42 | 43 | 6. **React Hooks:** Додають можливості роботи зі станом і побічними ефектами у функціональних компонентах. 44 | 45 | 7. **Екосистема:** Підтримує бібліотеки на кшталт React Router, Redux для розширення функціоналу. 46 | 47 | 8. **SEO-френдлі (з Next.js):** Серверний рендеринг для кращої індексації. 48 | 49 | 9. **Мобільна розробка:** React Native дозволяє створювати мобільні додатки на основі React. 50 | 51 | 10. **Відкритий код:** Активна підтримка спільноти. 52 | 53 |
54 | 55 |
56 | 3. Які основні функції React? 57 | 58 | #### React 59 | 60 | #### Основні функції React: 61 | 62 | 1. **Декларативний підхід** 63 | 64 | - React дозволяє створювати інтерактивний інтерфейс, описуючи, як він повинен виглядати, а бібліотека сама оптимізує оновлення DOM. 65 | 66 | 2. **Компонентна структура** 67 | 68 | - Додаток будується з незалежних, багаторазових компонентів, які спрощують розробку, тестування та підтримку. 69 | 70 | 3. **Віртуальний DOM** 71 | 72 | - React використовує Virtual DOM для ефективного оновлення реального DOM, що значно покращує продуктивність. 73 | 74 | 4. **Односпрямований потік даних** 75 | 76 | - Дані передаються від батьківських компонентів до дочірніх через props, що спрощує управління станом. 77 | 78 | 5. **Хуки (Hooks)** 79 | 80 | - Дозволяють використовувати стан і методи життєвого циклу у функціональних компонентах. 81 | 82 | 6. **JSX** 83 | 84 | - Розширення JavaScript для опису UI в синтаксисі, схожому на HTML. 85 | 86 | 7. **React Native** 87 | 88 | - Можливість створювати нативні мобільні додатки з використанням тих самих принципів, що і для вебу. 89 | 90 | 8. **Екосистема** 91 | 92 | - Великий набір бібліотек та інструментів, таких як React Router, Redux, Context API. 93 | 94 | 9. **Підтримка серверного рендерингу (SSR)** 95 | 96 | - Дозволяє оптимізувати SEO та прискорювати початкове завантаження сторінок. 97 | 98 | 10. **Управління станом** 99 | 100 | - За допомогою useState, Context API, Redux чи інших бібліотек. 101 | 102 | Ці функції роблять React потужною і гнучкою бібліотекою для створення сучасних додатків. 103 | 104 |
105 | 106 |
107 | 4. Які ключові переваги використання React? 108 | 109 | #### React 110 | 111 | #### Ключові переваги використання React 112 | 113 | 1. **Швидкість**: Завдяки Virtual DOM React мінімізує взаємодії з реальним DOM, що підвищує продуктивність. 114 | 115 | 2. **Компонентний підхід**: Код розбивається на багаторазово використовувані компоненти, що спрощує розробку та підтримку. 116 | 117 | 3. **Одностороння передача даних**: Потік даних у React відбувається в одному напрямку (зверху вниз), що полегшує дебагінг. 118 | 119 | 4. **Велика спільнота**: React має величезну екосистему бібліотек, інструментів і розширень. 120 | 121 | 5. **Сумісність із мобільною розробкою**: Використовуючи React Native, можна створювати кросплатформені мобільні додатки. 122 | 123 | 6. **JSX**: Синтаксис, який дозволяє писати JavaScript разом із HTML, що підвищує читабельність коду. 124 | 125 | 7. **Підтримка хуків**: Спрощення роботи зі станом та життєвим циклом у функціональних компонентах. 126 | 127 | 8. **SEO-дружність**: Серверний рендеринг за допомогою інструментів, таких як Next.js, покращує SEO-оптимізацію. 128 | 129 | 9. **Гнучкість**: React можна інтегрувати в будь-який проєкт або фреймворк без значних змін у коді. 130 | 131 | 10. **React DevTools**: Інструмент для налагодження, який дозволяє зручно аналізувати компоненти та стан додатка. 132 | 133 |
134 | 135 |
136 | 5. Що таке JSX? 137 | 138 | #### React 139 | 140 | - **JSX (JavaScript XML)** — це синтаксис, який дозволяє писати структури UI у вигляді XML-подібного коду всередині JavaScript. JSX є розширенням JavaScript і використовується в React для опису, як виглядає інтерфейс. 141 | 142 | #### Основні особливості JSX: 143 | 144 | 1. **XML-подібний синтаксис:** Нагадує HTML, але використовується у JavaScript. 145 | 146 | ```jsx 147 | const element =

Hello, world!

; 148 | ``` 149 | 150 | 2. **Вбудований JavaScript:** Ви можете писати JavaScript-код у фігурних дужках `{}`. 151 | 152 | ```jsx 153 | const name = "Alice"; 154 | const element =

Hello, {name}!

; 155 | ``` 156 | 157 | 3. **Трансляція:** JSX компілюється в звичайний JavaScript, використовуючи такі бібліотеки, як Babel. 158 | 159 | ```jsx 160 | const element =

Hello

; 161 | // Перетворюється в: 162 | const element = React.createElement("h1", null, "Hello"); 163 | ``` 164 | 165 | 4. Атрибути: Використовуються як у HTML, але замість `class` пишеться `className`, а замість `for` — `htmlFor`. 166 | 167 | ```jsx 168 | const input = ; 169 | ``` 170 | 171 | 5. JSX повертає дерево елементів: JSX-вираз може повертати лише один кореневий елемент. Використовуйте `` або порожній тег `<>` для групування. 172 | 173 | ```jsx 174 | return ( 175 | <> 176 |

Title

177 |

Description

178 | 179 | ); 180 | ``` 181 | 182 | #### Переваги: 183 | 184 | - Зручне створення UI-компонентів. 185 | - Зрозумілий і читабельний синтаксис. 186 | - Тісна інтеграція з JavaScript-логікою. 187 | 188 | JSX не обов'язковий у React, але широко використовується через зручність і гнучкість. 189 | 190 |
191 | 192 |
193 | 6. Різниця між станом (state) та пропсами (props)? 194 | 195 | #### React 196 | 197 | #### Різниця між станом (state) та пропсами (props) 198 | 199 | | Критерій | State | Props | 200 | | -------------------- | --------------------------------------------------------------------- | -------------------------------------------------------- | 201 | | Призначення | Зберігає внутрішній стан компонента. | Передає дані від батьківського компонента до дочірнього. | 202 | | Змінюваність | Може змінюватися всередині компонента. | Незмінні (read-only). | 203 | | Доступність | Доступний тільки в компоненті, де визначений. | Доступний у дочірньому компоненті через атрибути. | 204 | | Ініціалізація | Встановлюється в компоненті за допомогою `useState` або конструктора. | Визначається батьківським компонентом. | 205 | | Область використання | Для збереження динамічних даних, що можуть змінюватися. | Для передачі фіксованих або динамічних даних. | 206 | | Хто керує? | Компонент, у якому state визначений. | Батьківський компонент. | 207 | 208 |
209 | 210 |
211 | 7. Яка різниця між елементом і компонентом? 212 | 213 | #### React 214 | 215 | #### Різниця між елементом і компонентом у React: 216 | 217 | | Критерій | Елемент | Компонент | 218 | | --------------------------- | ---------------------------------------------------- | -------------------------------------------------------------------------------------------------- | 219 | | **Визначення** | Об'єкт, що описує, як має виглядати інтерфейс. | Функція або клас, який повертає React-елементи. | 220 | | **Тип** | Нероздільний (immutable). | Багаторазовий і може мати стан (state). | 221 | | **Синтаксис створення** | `React.createElement` або JSX (`
`). | Функція або клас (`function MyComponent() {}` або `class MyComponent extends React.Component {}`). | 222 | | **Призначення** | Представляє окремий вузол у DOM. | Інкапсулює логіку та структуру інтерфейсу. | 223 | | **Можливість використання** | Використовується для створення UI на базовому рівні. | Використовується для побудови складних структур із бізнес-логікою. | 224 | | **Приклад** | `

Hello

` | `function Hello() { return

Hello

; }` | 225 | 226 | - Елемент — це "будівельний блок", а компонент — "конструктор" для створення складних інтерфейсів. 227 | 228 |
229 | 230 |
231 | 8. Як створити компоненти в React? 232 | 233 | #### React 234 | 235 | #### У React компоненти можна створювати двома способами: 236 | 237 | 1. **Функціональний компонент** 238 | 239 | - Це проста функція, яка повертає React-елементи. 240 | 241 | ```jsx 242 | function Greeting(props) { 243 | return

Hello, {props.name}!

; 244 | } 245 | 246 | // Використання: 247 | ; 248 | ``` 249 | 250 | 2. **Класовий компонент** 251 | 252 | - Це клас, який успадковується від React.Component і обов’язково має метод render. 253 | 254 | ```jsx 255 | class Greeting extends React.Component { 256 | render() { 257 | return

Hello, {this.props.name}!

; 258 | } 259 | } 260 | 261 | // Використання: 262 | ; 263 | ``` 264 | 265 | #### Відмінності: 266 | 267 | - Функціональні компоненти простіші та краще підходять для компонентів без стану. 268 | 269 | - Класові компоненти використовуються для складніших компонентів із власним станом або методами життєвого циклу. 270 | 271 | **Примітка:** Сучасний підхід передбачає використання функціональних компонентів із хуками замість класових. 272 | 273 |
274 | 275 |
276 | 9. Що таке стан (state) у React? 277 | 278 | #### React 279 | 280 | - **Стан (state)** у React — це об'єкт, який використовується для зберігання даних, що можуть змінюватися з часом, і впливають на рендеринг компонента. Стан дозволяє компонентам React бути динамічними і реагувати на події, введення користувача тощо. 281 | 282 | #### Особливості стану: 283 | 284 | 1. **Локальний для компонента:** Стан доступний тільки в тому компоненті, де він визначений. 285 | 286 | 2. **Змінюється асинхронно:** React об'єднує виклики setState для оптимізації рендерингу. 287 | 288 | 3. **Ініціалізується в конструкторі** (для класових компонентів) або через useState (у функціональних компонентах). 289 | 290 | #### У класових компонентах: 291 | 292 | ```jsx 293 | class Counter extends React.Component { 294 | constructor(props) { 295 | super(props); 296 | this.state = { count: 0 }; 297 | } 298 | 299 | increment = () => { 300 | this.setState({ count: this.state.count + 1 }); 301 | }; 302 | 303 | render() { 304 | return ( 305 |
306 |

Count: {this.state.count}

307 | 308 |
309 | ); 310 | } 311 | } 312 | ``` 313 | 314 | #### У функціональних компонентах (з хуком `useState`): 315 | 316 | ```jsx 317 | import React, { useState } from "react"; 318 | 319 | function Counter() { 320 | const [count, setCount] = useState(0); 321 | 322 | return ( 323 |
324 |

Count: {count}

325 | 326 |
327 | ); 328 | } 329 | ``` 330 | 331 | #### Основні відмінності між станом і пропсами: 332 | 333 | - **State** — локальний для компонента і може змінюватися. 334 | 335 | - **Props** — передаються зовні і є незмінними (immutable). 336 | 337 |
338 | 339 |
340 | 10. Що таке пропси (props) в React? 341 | 342 | #### React 343 | 344 | - **Пропси (props)** в React — це об'єкт, який містить дані, що передаються від батьківського компонента до дочірнього. Вони використовуються для налаштування компонентів і є незмінними (immutable). 345 | 346 | #### Особливості пропсів: 347 | 348 | 1. **Передаються зверху вниз** (унідіrectional data flow) — від батьківського компонента до дочірнього. 349 | 350 | 2. **Незмінні** — компонент не може змінювати отримані пропси. 351 | 352 | 3. **Динамічні** — значення пропсів можуть змінюватися, якщо змінюються дані в батьківському компоненті. 353 | 354 | #### Використання пропсів: 355 | 356 | 1. **У функціональному компоненті:** 357 | 358 | ```jsx 359 | function Welcome(props) { 360 | return

Hello, {props.name}!

; 361 | } 362 | 363 | // Використання: 364 | ; 365 | ``` 366 | 367 | 2. **У класовому компоненті:** 368 | 369 | ```jsx 370 | Копіювати; 371 | Редагувати; 372 | class Welcome extends React.Component { 373 | render() { 374 | return

Hello, {this.props.name}!

; 375 | } 376 | } 377 | 378 | // Використання: 379 | ; 380 | ``` 381 | 382 | #### Передача пропсів: 383 | 384 | ```jsx 385 | function App() { 386 | return ( 387 |
388 | 389 | 390 |
391 | ); 392 | } 393 | ``` 394 | 395 | - Результат: 396 | 397 | ```bash 398 | Hello, Alice! 399 | Hello, Bob! 400 | ``` 401 | 402 | #### Деструктуризація пропсів: 403 | 404 | ```jsx 405 | function Welcome({ name }) { 406 | return

Hello, {name}!

; 407 | } 408 | ``` 409 | 410 | #### Значення пропсів за замовчуванням: 411 | 412 | ```jsx 413 | function Welcome({ name = "Guest" }) { 414 | return

Hello, {name}!

; 415 | } 416 | 417 | // Використання: 418 | ; // Виведе: Hello, Guest! 419 | ``` 420 | 421 | - Пропси забезпечують компонентам React гнучкість і можливість повторного використання. 422 | 423 |
424 | 425 |
426 | 11. Навіщо потрібен атрибут key при рендері списків? 427 | 428 | #### React 429 | 430 | - Атрибут `key` використовується для ідентифікації елементів у списках під час рендеру. 431 | 432 | #### Призначення: 433 | 434 | 1. **_Оптимізація оновлень:_** React використовує `key` для ефективного оновлення інтерфейсу, швидко визначаючи, які елементи змінити, додати або видалити. 435 | 436 | 2. **_Запобігання зайвим рендерам:_** `key` допомагає уникнути перерендеру незмінених елементів. 437 | 438 | 3. **_Збереження стану компонентів:_** Наприклад, якщо елемент списку містить форму, `key` дозволяє React зберігати її стан між оновленнями. 439 | 440 | #### Правильне використання: 441 | 442 | - Значення `key` має бути унікальним серед братніх елементів. 443 | 444 | - Найкраще підходять стабільні ідентифікатори (наприклад, `id` з бази даних). 445 | 446 | - Не рекомендується використовувати індекс масиву як `key`, оскільки це може призвести до помилок при зміні порядку елементів. 447 | 448 | ```jsx 449 | const items = ["Apple", "Banana", "Cherry"]; 450 | return ( 451 | 456 | ); 457 | ``` 458 | 459 |
460 | 461 |
462 | 12. Як передаються дані між компонентами у React 463 | 464 | #### React 465 | 466 | - У React дані передаються між компонентами за ієрархією наступним чином: 467 | 468 | #### Передача даних вниз (від батьківського компонента до дочірнього) 469 | 470 | - Для передачі даних вниз використовується props. Батьківський компонент передає значення або функції через атрибути дочірньому компоненту. 471 | 472 | - **Приклад:** 473 | 474 | ```jsx 475 | function ParentComponent() { 476 | const data = "Hello from Parent"; 477 | 478 | return ; 479 | } 480 | 481 | function ChildComponent({ message }) { 482 | return

{message}

; 483 | } 484 | ``` 485 | 486 | - `message` передає значення `data` в дочірній компонент `ChildComponent`. 487 | 488 | - У дочірньому компоненті доступ до пропсів відбувається через параметр функції або `this.props` у класовому компоненті. 489 | 490 | #### Передача даних вгору (від дочірнього компонента до батьківського) 491 | 492 | - Дані передаються вгору за допомогою callback-функцій. Батьківський компонент передає функцію дочірньому, а той викликає її з потрібними даними. 493 | 494 | - **Приклад:** 495 | 496 | ```jsx 497 | function ParentComponent() { 498 | const handleData = (childData) => { 499 | console.log("Data from child:", childData); 500 | }; 501 | 502 | return ; 503 | } 504 | 505 | function ChildComponent({ sendData }) { 506 | const data = "Hello from Child"; 507 | 508 | return ; 509 | } 510 | ``` 511 | 512 | - Батьківський компонент передає функцію `handleData` в пропс `sendData`. 513 | 514 | - Дочірній компонент викликає `sendData`, передаючи значення `data`. 515 | 516 | #### Альтернативні підходи для складних додатків: 517 | 518 | 1. **Контекст (Context API):** 519 | 520 | - Для передачі даних глибоко по ієрархії без пропсів. 521 | 522 | - Підходить для глобального стану, наприклад, теми чи мови інтерфейсу. 523 | 524 | ```jsx 525 | const MyContext = React.createContext(); 526 | 527 | function ParentComponent() { 528 | const data = "Hello from Context"; 529 | 530 | return ( 531 | 532 | 533 | 534 | ); 535 | } 536 | 537 | function ChildComponent() { 538 | const contextData = React.useContext(MyContext); 539 | 540 | return

{contextData}

; 541 | } 542 | ``` 543 | 544 | 2. **Менеджери стану (Redux, Zustand, MobX):** 545 | 546 | - Для передачі даних у великих додатках через єдиний глобальний стан. 547 | 548 | 3. **Custom Hooks:** 549 | 550 | - Використовується для спільного використання логіки між компонентами. 551 | 552 |
553 | 554 |
555 | 13. Чому React використовує className замість атрибута класу? 556 | 557 | #### React 558 | 559 | - У React використовується `className` замість `class`, тому що `class` є зарезервованим ключовим словом у JavaScript. 560 | 561 | #### Причини: 562 | 563 | 1. **Уникнення конфліктів** – `class` використовується для визначення класів у JavaScript (`class MyComponent {}`), що могло б викликати синтаксичні помилки. 564 | 565 | 2. **Сумісність з JSX** – JSX є синтаксичним розширенням JavaScript, тому використання `className` допомагає уникнути неоднозначностей. 566 | 567 | 3. **Пряме відображення** у `document.createElement` – React перетворює JSX у виклики `React.createElement`, і для встановлення класів у DOM-елементах використовується `className`. 568 | 569 | #### Приклад: 570 | 571 | ```jsx 572 | // Коректний варіант у React 573 | 574 |
Hello
575 | 576 | // Некоректний варіант (синтаксична помилка) 577 | 578 |
Hello
579 | ``` 580 | 581 | - Це стандарт React, який гарантує стабільність і узгодженість у коді. 582 | 583 |
584 | 585 |
586 | 14. Які є винятки щодо іменування компонентів React? 587 | 588 | #### React 589 | 590 | - В React є кілька важливих правил і винятків щодо іменування компонентів: 591 | 592 | 1. **Великі літери для компонентів:** Імена компонентів повинні починатися з великої літери. Це обов'язково, щоб React міг відрізнити компоненти від стандартних HTML-елементів. 593 | 594 | - Наприклад: 595 | - Правильно: `` 596 | - Неправильно: `` 597 | 598 | 2. **CamelCase:** Рекомендується використовувати стиль CamelCase для імен компонентів. Це означає, що кожне нове слово в імені компонента починається з великої літери: 599 | 600 | - `MyComponent` 601 | - `UserProfile` 602 | 603 | 3. **Назви не повинні співпадати з HTML-елементами:** Не використовуйте імена компонентів, які співпадають з тегами стандартних HTML-елементів, такими як div, span, button, тощо. Це може викликати конфлікти та непередбачувану поведінку: 604 | 605 | - Правильно: `` 606 | - Неправильно: `
620 | 621 |
622 | 15. Як писати коментарі в React? 623 | 624 | #### React 625 | 626 | - В React коментарі пишуться так само, як і в JavaScript, але є певні нюанси, коли мова йде про JSX. 627 | 628 | 1. **Коментарі в JavaScript (за межами JSX)** 629 | 630 | ```javascript 631 | // Однорядковий коментар 632 | 633 | /* 634 | Багаторядковий коментар 635 | */ 636 | ``` 637 | 638 | 2. **Коментарі всередині JSX** 639 | 640 | - У JSX необхідно використовувати спеціальний синтаксис, оскільки JSX є частиною JavaScript. 641 | 642 | - Коментарі в JSX потрібно писати всередині фігурних дужок `{}`: 643 | 644 | ```jsx 645 | function MyComponent() { 646 | return ( 647 |
648 | {/_ Це коментар всередині JSX _/} 649 |

Hello, world!

650 |
651 | ); 652 | } 653 | ``` 654 | 655 | - Коментарі в JSX повинні бути оточені `{/* коментар */}`, інакше вони викликають помилки. 656 | 657 | - Вони можуть бути використані тільки всередині виразів JSX. 658 | 659 | 3. **Коментарі в функціях та методах** 660 | 661 | - Для коментарів всередині функцій або методів можна використовувати стандартні JavaScript коментарі: 662 | 663 | ```jsx 664 | function MyComponent() { 665 | // Ось тут ми рендеримо компонент 666 | return
Hello, world!
; 667 | } 668 | ``` 669 | 670 | #### Висновок: 671 | 672 | - У JSX використовуйте `{/* коментар */}`. 673 | 674 | - У звичайному JavaScript — `//` для однорядкових і `/* ... */` для багаторядкових коментарів. 675 | 676 |
677 | 678 | ### Рендеринг та оновлення стану 679 | 680 |
681 | 16. Що таке Virtual DOM в React? 682 | 683 | #### React 684 | 685 | - **Virtual DOM** — це віртуальне представлення реального DOM, яке React використовує для ефективного оновлення інтерфейсу. 686 | 687 | #### Як працює в React: 688 | 689 | 1. **Рендеринг у Virtual DOM:** При зміні стану або пропсів компонентів React оновлює Virtual DOM. 690 | 691 | 2. **Diffing:** React порівнює новий Virtual DOM зі старою версією, визначаючи мінімальний набір змін. 692 | 693 | 3. **Оновлення реального DOM:** Виявлені зміни застосовуються до реального DOM, зводячи до мінімуму кількість маніпуляцій. 694 | 695 | #### Основна перевага: 696 | 697 | - Оптимізація оновлень DOM, що значно покращує продуктивність додатків. 698 | 699 |
700 | 701 |
702 | 17. Що таке (key) prop і яка перевага його використання в масивах елементів? 703 | 704 | #### React 705 | 706 | - У React prop `key` використовується для ідентифікації кожного елементу в списках або масивах, щоб допомогти React ефективно керувати рендерами при зміні або оновленні елементів списку. Це важливо для оптимізації процесу рендерингу, особливо коли список змінюється (елементи додаються, видаляються або змінюються). 707 | 708 | #### Основні моменти щодо `key`: 709 | 710 | 1. **Унікальність:** Кожен елемент у списку повинен мати унікальний `key`. Це дозволяє React відстежувати, які елементи змінюються, додаються або видаляються, а також зберігати їх стан між рендерами. 711 | 712 | 2. **Оптимізація рендерингу:** Використання key дозволяє React мінімізувати кількість ререндерів, виконуючи тільки необхідні зміни в DOM. Без `key`, React має важчий час для відстеження змін, що призводить до повного повторного рендерингу списку, навіть якщо тільки один елемент змінився. 713 | 714 | 3. **Природа key:** Prop `key` не передається в компонент, тому його не можна використовувати для відображення значень в UI. Це тільки інтерналізована властивість, що використовується React для відстеження елементів. 715 | 716 | #### Приклад використання `key` в списку: 717 | 718 | ```jsx 719 | const items = ["apple", "banana", "cherry"]; 720 | 721 | function FruitList() { 722 | return ( 723 | 728 | ); 729 | } 730 | ``` 731 | 732 | #### Важливість унікальності `key`: 733 | 734 | - **Неправильне використання:** Якщо у якості key використовувати неунікальні значення (наприклад, однаковий index), React не зможе коректно відстежувати зміни, і це призведе до помилок в рендерингу. 735 | 736 | - **Ідеальний key:** Зазвичай, якщо є унікальний ідентифікатор елемента (наприклад, id), він повинен бути використаний як key замість індексу масиву. 737 | 738 | ```jsx 739 | const items = [ 740 | { id: 1, name: "apple" }, 741 | { id: 2, name: "banana" }, 742 | { id: 3, name: "cherry" }, 743 | ]; 744 | 745 | function FruitList() { 746 | return ( 747 | 752 | ); 753 | } 754 | ``` 755 | 756 | #### Переваги використання `key`: 757 | 758 | - Покращує продуктивність рендерингу. 759 | 760 | - Дозволяє React оптимально оновлювати тільки змінені елементи, а не весь список. 761 | 762 | - Забезпечує коректну обробку стану елементів при їх переміщенні, видаленні або оновленні. 763 | 764 | Таким чином, використання `key` є важливим для ефективної роботи з масивами елементів у React. 765 | 766 |
767 | 768 |
769 | 18. Що таке умовний рендеринг у React? 770 | 771 | #### React 772 | 773 | - Умовний рендеринг у React — це процес, при якому компонент рендерить різний вміст залежно від певних умов. Це дозволяє динамічно змінювати відображення компонента на основі стану, пропсів або інших факторів. 774 | 775 | #### Основні підходи до умовного рендерингу: 776 | 777 | 1. **Оператор `if`:** Можна використовувати стандартний оператор if для вирішення, що рендерити. 778 | 779 | ```jsx 780 | function Greeting(props) { 781 | if (props.isLoggedIn) { 782 | return

Welcome back!

; 783 | } 784 | return

Please sign up.

; 785 | } 786 | ``` 787 | 788 | 2. **Тернарний оператор:** Часто використовують тернарний оператор для коротших умовних виразів. 789 | 790 | ```jsx 791 | function Greeting(props) { 792 | return

{props.isLoggedIn ? "Welcome back!" : "Please sign up."}

; 793 | } 794 | ``` 795 | 796 | 3. **Логічне І (&&) для рендерингу:** Можна використати логічний оператор `&&`, щоб рендерити елемент лише за умови, що вираз зліва від нього є істинним. 797 | 798 | ```jsx 799 | function Notifications(props) { 800 | return ( 801 |
802 | {props.unreadMessages.length > 0 && ( 803 |

You have {props.unreadMessages.length} unread messages.

804 | )} 805 |
806 | ); 807 | } 808 | ``` 809 | 810 | - Це працює так: якщо props.unreadMessages.length більше за 0, то відобразиться повідомлення, інакше нічого не буде відображено. 811 | 812 | 4. **Використання `return` з умовним оператором:** Ви можете використовувати return для умовного рендерингу на основі різних умов, як в прикладі з `if` або тернарним оператором. 813 | 814 | #### Переваги умовного рендерингу: 815 | 816 | - Дозволяє динамічно змінювати вміст залежно від стану або пропсів. 817 | 818 | - Покращує гнучкість і можливість відображення різного контенту для різних користувачів або ситуацій. 819 | 820 | #### Приклад: 821 | 822 | ```jsx 823 | function UserStatus(props) { 824 | return ( 825 |
826 | {props.isLoggedIn ? ( 827 | 828 | ) : ( 829 | 830 | )} 831 |
832 | ); 833 | } 834 | ``` 835 | 836 | - Тут кнопка змінюється в залежності від того, чи користувач увійшов в систему. 837 | 838 |
839 | 840 |
841 | 19. Що таке фрагменти (Fragments) у React? 842 | 843 | #### React 844 | 845 | - Фрагменти в React — це спосіб групувати кілька елементів без додавання зайвих елементів в DOM. Вони дозволяють повернути декілька елементів з компонента без обгортки, такої як `div`, що може допомогти уникнути зайвих елементів, що можуть порушити стилі або структуру документа. 846 | 847 | #### Як використовуються фрагменти? 848 | 849 | 1. **Без фрагментів (з обгорткою):** 850 | 851 | ```jsx 852 | function MyComponent() { 853 | return ( 854 |
855 |

Title

856 |

Some text

857 |
858 | ); 859 | } 860 | ``` 861 | 862 | - У цьому прикладі повертається один `div`, який обгортає `h1` і `p`. 863 | 864 | 2. **З фрагментами (без обгортки):** 865 | 866 | ```jsx 867 | function MyComponent() { 868 | return ( 869 | <> 870 |

Title

871 |

Some text

872 | 873 | ); 874 | } 875 | ``` 876 | 877 | Тепер `h1` і `p` рендеряться без додаткового контейнера, що дозволяє зберегти чистоту DOM. 878 | 879 | #### Переваги: 880 | 881 | - **_Чистий DOM:_** Можна обходитись без зайвих обгорток у DOM. 882 | 883 | - **_Зручність для рендерингу кількох елементів:_** Повернення кількох елементів з одного компонента без необхідності використовувати додаткові елементи. 884 | 885 | #### Синтаксис: 886 | 887 | - Можна використовувати порожні теги `<>` і ``, які є скороченням для ``. 888 | 889 | - Також можна використовувати `React.Fragment`, якщо потрібно додавати ключі (наприклад, при рендерингу списків): 890 | 891 | ```jsx 892 | 893 |

{item.name}

894 |

{item.description}

895 |
896 | ``` 897 | 898 | #### Коли використовувати: 899 | 900 | - Коли потрібно рендерити кілька елементів без додаткової обгортки в DOM. 901 | 902 | - Коли зберігаєте структуру компонента без порушення стилів чи верстки. 903 | 904 | Фрагменти є дуже корисними для зменшення зайвих елементів у DOM та покращення продуктивності. 905 | 906 |
907 | 908 |
909 | 20. Що таке узгодження (Reconciliation)? 910 | 911 | #### React 912 | 913 | - **Reconciliation** (узгодження) — це процес, який React використовує для оновлення DOM найефективнішим способом. Коли стан або пропси компонента змінюються, React обчислює мінімальні зміни, які потрібно внести до реального DOM, щоб синхронізувати його зі станом віртуального DOM. 914 | 915 | #### Як працює reconciliation? 916 | 917 | 1. **Порівняння старого та нового віртуального DOM:** 918 | 919 | - React зберігає копію попереднього віртуального DOM. 920 | - При зміні стану чи пропсів створюється новий віртуальний DOM. 921 | - React порівнює новий віртуальний DOM із попередньою копією (алгоритм diffing). 922 | 923 | 2. **Виявлення відмінностей (diffing):** 924 | 925 | - React ідентифікує, які частини дерева змінилися (нові елементи, зміни в атрибутах чи видалення елементів). 926 | - Для цього використовується алгоритм, оптимізований для роботи з деревоподібними структурами. 927 | 928 | 3. **Оновлення реального DOM:** 929 | 930 | - React застосовує зміни лише до тих частин DOM, які потрібно оновити, уникаючи повного перерендеру. 931 | 932 | #### Основні принципи reconciliation: 933 | 934 | - **Збереження вузлів одного рівня:** Якщо вузли мають однаковий тип (наприклад, `
` залишається `
`), React змінює лише атрибути та дочірні елементи. 935 | - **Повторне використання компонентів:** Якщо компонент залишається тим самим, React повторно використовує існуючий екземпляр компонента. 936 | - **Ключі для списків:** Якщо список елементів рендериться з масиву, React використовує ключі (`key` prop) для порівняння та збереження вузлів. 937 | 938 | #### Приклад роботи: 939 | 940 | ```jsx 941 | function App({ isVisible }) { 942 | return isVisible ?

Hello

:

Goodbye

; 943 | } 944 | ``` 945 | 946 | - Якщо `isVisible` змінюється з `true` на `false`, React видалить `

` і замінить його на `

`. 947 | 948 | #### Важливість ключів (`key` prop) для списків: 949 | 950 | - Ключі допомагають React коректно визначати зміни в списках. Наприклад: 951 | 952 | ```jsx 953 |

    954 | {items.map((item) => ( 955 |
  • {item.text}
  • 956 | ))} 957 |
958 | ``` 959 | 960 | - Без унікальних ключів React не зможе точно визначити, які елементи списку змінилися. 961 | 962 | #### Переваги reconciliation: 963 | 964 | - Зменшення кількості операцій із DOM. 965 | - Підвищення продуктивності додатків. 966 | - Гладке оновлення інтерфейсу користувача. 967 | 968 |

969 | 970 |
971 | 21. Як оновити стан компонента? 972 | 973 | #### React 974 | 975 | - У React стан компонента оновлюється за допомогою методу `setState` у класових компонентах або `useState` у функціональних компонентах. 976 | 977 | #### Класові компоненти: 978 | 979 | - Стан оновлюється через `this.setState()`. 980 | 981 | - **_Приклад:_** 982 | 983 | ```jsx 984 | class Counter extends React.Component { 985 | constructor(props) { 986 | super(props); 987 | this.state = { count: 0 }; 988 | } 989 | 990 | increment = () => { 991 | this.setState({ count: this.state.count + 1 }); 992 | }; 993 | 994 | render() { 995 | return ( 996 |
997 |

Count: {this.state.count}

998 | 999 |
1000 | ); 1001 | } 1002 | } 1003 | ``` 1004 | 1005 | #### Функціональні компоненти: 1006 | 1007 | - Стан оновлюється через функцію, отриману з `useState`. 1008 | 1009 | - **_Приклад:_** 1010 | 1011 | ```jsx 1012 | import React, { useState } from "react"; 1013 | 1014 | function Counter() { 1015 | const [count, setCount] = useState(0); 1016 | 1017 | const increment = () => { 1018 | setCount(count + 1); 1019 | }; 1020 | 1021 | return ( 1022 |
1023 |

Count: {count}

1024 | 1025 |
1026 | ); 1027 | } 1028 | ``` 1029 | 1030 | #### Примітки: 1031 | 1032 | 1. **Асинхронність:** `setState` і `useState` працюють асинхронно. Для оновлення стану на основі попереднього значення використовуйте функціональний підхід: 1033 | 1034 | ```jsx 1035 | this.setState((prevState) => ({ count: prevState.count + 1 })); 1036 | setCount((prevCount) => prevCount + 1); 1037 | ``` 1038 | 1039 | 2. **Не оновлюйте стан напряму:** Модифікація стану без використання `setState` або `useState` не викликає повторний рендеринг. 1040 | 1041 |
1042 | 1043 |
1044 | 22. Що таке вбудовані умовні вирази? 1045 | 1046 | #### React 1047 | 1048 | - **Вбудовані умовні вирази** в JavaScript (зокрема у React) — це механізми, що дозволяють вбудовувати умови безпосередньо в JSX для умовного рендерингу елементів або компонентів. Це дозволяє зробити код компактнішим і зручнішим для розуміння. 1049 | 1050 | #### Основні методи: 1051 | 1052 | 1. **Оператор умови (тернарний оператор):** Це один із найпоширеніших способів для умовного рендерингу елементів в JSX. Він має такий синтаксис: 1053 | 1054 | ```jsx 1055 | умова ? вираз_якщо_правда : вираз_якщо_неправда; 1056 | ``` 1057 | 1058 | **Приклад:** 1059 | 1060 | ```jsx 1061 | const isLoggedIn = true; 1062 | 1063 | function App() { 1064 | return
{isLoggedIn ?

Welcome, User!

:

Please log in

}
; 1065 | } 1066 | ``` 1067 | 1068 | 2. **Логічний оператор AND (&&):** Цей метод дозволяє відображати компонент або елемент тільки тоді, коли умова є true. Якщо умова не виконується, нічого не буде рендеритись. 1069 | 1070 | **Приклад:** 1071 | 1072 | ```jsx 1073 | const isUserAdmin = true; 1074 | 1075 | function App() { 1076 | return
{isUserAdmin &&

You have admin privileges

}
; 1077 | } 1078 | ``` 1079 | 1080 | - У цьому випадку `

You have admin privileges

` буде відображено лише, якщо `isUserAdmin` — це `true`. 1081 | 1082 | 3. **IF перед поверненням JSX:** Можна також використовувати звичайні умовні оператори if перед поверненням JSX, коли умова має бути більш складною або коли потрібно виконати декілька умовних дій. 1083 | 1084 | **Приклад:** 1085 | 1086 | ```jsx 1087 | function App() { 1088 | let content; 1089 | if (isLoggedIn) { 1090 | content =

Welcome back!

; 1091 | } else { 1092 | content =

Please sign in.

; 1093 | } 1094 | 1095 | return
{content}
; 1096 | } 1097 | ``` 1098 | 1099 | #### Переваги: 1100 | 1101 | - Вбудовані умовні вирази дозволяють писати більш чистий і компактний код. 1102 | 1103 | - Вони покращують читаємість і зменшують використання додаткових умовних конструкцій. 1104 | 1105 | #### Важливо: 1106 | 1107 | - В React не можна використовувати інструкції `if` безпосередньо в JSX. Однак можна застосувати їх перед поверненням JSX. 1108 | 1109 |
1110 | 1111 | ### Події в React 1112 | 1113 |
1114 | 23. Яка різниця між обробкою подій HTML і React? 1115 | 1116 | #### React 1117 | 1118 | #### Різниця між обробкою подій у HTML та React: 1119 | 1120 | | Критерій | HTML | React | 1121 | | ---------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | 1122 | | **Прив’язка події** | Вказується як атрибут: ` 1135 | ``` 1136 | 1137 | #### Приклад у React: 1138 | 1139 | ```jsx 1140 | function handleClick() { 1141 | alert("Clicked!"); 1142 | } 1143 | 1144 | function App() { 1145 | return ; 1146 | } 1147 | ``` 1148 | 1149 | #### SyntheticEvent у React: 1150 | 1151 | - React використовує обгортку над нативними подіями, яка нормалізує поведінку між різними браузерами та підвищує продуктивність. 1152 | 1153 |
1154 | 1155 |
1156 | 24. Що таке синтетичні події в React? 1157 | 1158 | #### React 1159 | 1160 | - **Синтетичні події (Synthetic Events)** у React — це обгортки для нативних DOM-подій, які надають однаковий інтерфейс для обробки подій на різних браузерах. React створює SyntheticEvent для кожної події, що дозволяє працювати з подіями в уніфікованому вигляді, забезпечуючи кросбраузерну сумісність і покращуючи продуктивність. 1161 | 1162 | #### Основні характеристики: 1163 | 1164 | 1. **Кросбраузерність:** SyntheticEvent абстрагує особливості роботи з подіями в різних браузерах, забезпечуючи однакову поведінку. 1165 | 1166 | 2. **Оптимізація:** SyntheticEvent використовує пул об'єктів, що дозволяє зменшити витрати на створення нових об'єктів подій. 1167 | 1168 | 3. **Одноразове використання:** Після обробки події об'єкт SyntheticEvent "повертається" в пул, і його не можна використовувати після цього. Для асинхронних операцій потрібно зберігати подію в окремій змінній. 1169 | 1170 | 4. **Інтерфейс:** SyntheticEvent має такі ж методи, як і стандартні нативні події (наприклад, `preventDefault()`, `stopPropagation()`). 1171 | 1172 | #### Приклад використання: 1173 | 1174 | ```jsx 1175 | function handleClick(event) { 1176 | // SyntheticEvent має доступ до методу preventDefault() 1177 | event.preventDefault(); 1178 | console.log("Button clicked!"); 1179 | } 1180 | 1181 | function App() { 1182 | return ; 1183 | } 1184 | ``` 1185 | 1186 | - У цьому прикладі event — це SyntheticEvent, який працює аналогічно до нативної події, але з покращеними можливостями. 1187 | 1188 |
1189 | 1190 |
1191 | 25. Як обробляти події в React? 1192 | 1193 | #### React 1194 | 1195 | - В React обробка подій працює схоже на стандартний JavaScript, але з деякими відмінностями. Події в React є синтетичними, що означає, що вони мають абстракцію поверх реальних подій браузера, що забезпечує крос-браузерну сумісність. 1196 | 1197 | #### Основні принципи обробки подій в React: 1198 | 1199 | 1. **Синтетичні події:** Всі події в React обгорнуті в об'єкт **SyntheticEvent**, який є крос-браузерною реалізацією стандартних подій DOM. Це дозволяє обробляти події однаково в усіх браузерах. 1200 | 1201 | 2. **Використання camelCase для подій:** У React події записуються у форматі camelCase замість стандартного нижнього регістру (наприклад, `onClick` замість `onclick`). 1202 | 1203 | 3. **Передача функцій як обробників подій:** Події в React обробляються за допомогою функцій, які передаються через атрибути компонентів. 1204 | 1205 | #### Приклад обробки події `click`: 1206 | 1207 | ```jsx 1208 | import React, { Component } from "react"; 1209 | 1210 | class MyButton extends Component { 1211 | handleClick = () => { 1212 | alert("Button clicked!"); 1213 | }; 1214 | 1215 | render() { 1216 | return ; 1217 | } 1218 | } 1219 | 1220 | export default MyButton; 1221 | ``` 1222 | 1223 | #### Приклад з функціональним компонентом: 1224 | 1225 | ```jsx 1226 | import React, { useState } from "react"; 1227 | 1228 | function MyButton() { 1229 | const [count, setCount] = useState(0); 1230 | 1231 | const handleClick = () => { 1232 | setCount(count + 1); 1233 | }; 1234 | 1235 | return ; 1236 | } 1237 | 1238 | export default MyButton; 1239 | ``` 1240 | 1241 | #### Особливості обробки подій: 1242 | 1243 | 1. **Не потрібно використовувати `addEventListener`:** В React немає необхідності вручну додавати або видаляти обробники подій. Це автоматично керується бібліотекою React. 1244 | 1245 | 2. **Збереження контексту в методах класових компонентів:** Якщо методи класових компонентів використовуються як обробники подій, контекст (`this`) потрібно прив'язати або через стрілкові функції, або вручну в конструкторі. 1246 | 1247 | ```jsx 1248 | class MyComponent extends React.Component { 1249 | constructor(props) { 1250 | super(props); 1251 | this.state = { count: 0 }; 1252 | // Прив'язка методу 1253 | this.handleClick = this.handleClick.bind(this); 1254 | } 1255 | 1256 | handleClick() { 1257 | this.setState({ count: this.state.count + 1 }); 1258 | } 1259 | 1260 | render() { 1261 | return ( 1262 | 1265 | ); 1266 | } 1267 | } 1268 | ``` 1269 | 1270 | 3. **Передача параметрів у функцію обробника:** Якщо потрібно передати додаткові аргументи в обробник події, можна використовувати стрілкові функції або функції з параметрами. 1271 | 1272 | ```jsx 1273 | function MyButton({ label }) { 1274 | const handleClick = (event, label) => { 1275 | console.log(label); 1276 | }; 1277 | 1278 | return ( 1279 | 1280 | ); 1281 | } 1282 | ``` 1283 | 1284 | #### Обробка подій в DOM: 1285 | 1286 | - Всі події, що відбуваються в React, працюють за принципом делегування подій, де один обробник подій реєструється для всього дерева компонентів і пропускається через React SyntheticEvent. 1287 | 1288 |
1289 | 1290 |
1291 | 26. Що таке події вказівника (Pointer Events)? 1292 | 1293 | #### React 1294 | 1295 | #### Події вказівника (Pointer Events) у React 1296 | 1297 | - **Pointer Events** — це API, що об'єднує події миші, сенсорного екрану та стилуса в єдину систему обробки подій. 1298 | 1299 | #### Основні події Pointer Events 1300 | 1301 | | **Подія** | **Опис** | 1302 | | ------------------- | ------------------------------------------------------------------------ | 1303 | | **onPointerDown** | Спрацьовує при натисканні пальцем, мишею або стилусом. | 1304 | | **onPointerUp** | Спрацьовує при відпусканні кнопки миші, пальця або стилуса. | 1305 | | **onPointerMove** | Викликається при русі вказівника над елементом. | 1306 | | **onPointerEnter** | Спрацьовує, коли вказівник входить у межі елемента. | 1307 | | **onPointerLeave** | Спрацьовує, коли вказівник виходить за межі елемента. | 1308 | | **onPointerCancel** | Викликається, коли браузер скасовує подію (наприклад, при зміні фокусу). | 1309 | 1310 | #### Приклад використання у React 1311 | 1312 | ```jsx 1313 | const PointerExample = () => { 1314 | const handlePointerDown = () => console.log("Вказівник натиснуто"); 1315 | 1316 | return ( 1317 |
1321 | Клікни тут 1322 |
1323 | ); 1324 | }; 1325 | ``` 1326 | 1327 | - Цей код виведе `"Вказівник натиснуто"` у консоль при натисканні будь-яким пристроєм (миша, сенсор, стилус). 1328 | 1329 |
1330 | 1331 | ### Компоненти та їх типи 1332 | 1333 |
1334 | 27. Коли використовувати компонент класу замість функціонального компонента? 1335 | 1336 | #### React 1337 | 1338 | - Класові компоненти використовувалися, коли потрібна була одна або кілька з цих функцій: 1339 | 1340 | 1. **Робота зі станом (state):** Раніше функціональні компоненти не підтримували локальний стан, тому використовували класи для цього. 1341 | Сьогодні хуки (useState, useReducer) дозволяють функціональним компонентам працювати зі станом. 1342 | 1343 | 2. **Методи життєвого циклу:** Класи забезпечували доступ до методів, таких як componentDidMount, componentDidUpdate, componentWillUnmount, для управління компонентом на різних етапах його існування. 1344 | Зараз це вирішується хуком useEffect. 1345 | 1346 | 3. **Обробка складної логіки:** Якщо логіка потребувала кількох методів і доступу до властивостей через this, класи виглядали логічним вибором. 1347 | Сучасний підхід — хуки, які дозволяють інкапсулювати логіку. 1348 | 1349 | #### Коли класи більше не потрібні: 1350 | 1351 | - Починаючи з React 16.8, функціональні компоненти з хуками замінили потребу у класових компонентах. Тому в нових проєктах перевагу варто віддавати функціональним компонентам. Класи використовуються лише для підтримки застарілого коду. 1352 | 1353 |
1354 | 1355 |
1356 | 28. Що таке компоненти без стану (stateless components)? 1357 | 1358 | #### React 1359 | 1360 | - Компоненти без стану (stateless components) — це компоненти, які не зберігають і не обробляють жодного внутрішнього стану. Вони лише отримують дані через props і відображають їх у вигляді UI. Зазвичай ці компоненти є функціональними. 1361 | 1362 | #### Особливості: 1363 | 1364 | 1. **Відсутність стану:** Вони не використовують this.state і не змінюють свій внутрішній стан. 1365 | 1366 | 2. **Тільки рендеринг:** Вони просто отримують пропси та відображають їх у вигляді елементів UI. 1367 | 1368 | 3. **Простота та передбачуваність:** Легше тестувати і підтримувати, оскільки не потрібно слідкувати за змінами стану. 1369 | 1370 | #### Приклад: 1371 | 1372 | ```jsx 1373 | // Stateless component 1374 | function Greeting(props) { 1375 | return

Hello, {props.name}!

; 1376 | } 1377 | 1378 | // Використання: 1379 | ; 1380 | ``` 1381 | 1382 | #### Переваги: 1383 | 1384 | - **Простота:** Легше розуміти та підтримувати. 1385 | 1386 | - **Оптимізація продуктивності:** Оскільки ці компоненти не мають стану, React може більш ефективно їх оновлювати. 1387 | 1388 | #### Коли використовувати: 1389 | 1390 | - Коли компонент просто відображає дані та не потребує змін. 1391 | 1392 |
1393 | 1394 |
1395 | 29. Що таке компоненти стану (stateful components)? 1396 | 1397 | #### React 1398 | 1399 | - **Компоненти стану** (stateful components) — це компоненти, які зберігають і управляють своїм внутрішнім станом. Вони використовують state для збереження даних, які можуть змінюватися протягом часу, і ці зміни впливають на рендеринг компонента. 1400 | 1401 | #### Особливості: 1402 | 1403 | 1. **Стан (state):** Вони використовують this.state для зберігання і управління даними, які можуть змінюватися. 1404 | 1405 | 2. **Методи для оновлення стану:** Використовують метод this.setState() для оновлення стану. 1406 | 1407 | 3. **Життєвий цикл:** Мають доступ до методів життєвого циклу компонента, таких як componentDidMount(), shouldComponentUpdate(), componentDidUpdate() тощо. 1408 | 1409 | #### Приклад: 1410 | 1411 | ```jsx 1412 | // Stateful component 1413 | class Counter extends React.Component { 1414 | constructor(props) { 1415 | super(props); 1416 | this.state = { 1417 | count: 0, 1418 | }; 1419 | } 1420 | 1421 | increment = () => { 1422 | this.setState({ count: this.state.count + 1 }); 1423 | }; 1424 | 1425 | render() { 1426 | return ( 1427 |
1428 |

{this.state.count}

1429 | 1430 |
1431 | ); 1432 | } 1433 | } 1434 | ``` 1435 | 1436 | #### Переваги: 1437 | 1438 | - **Динамічні компоненти:** Можуть змінювати свій вміст і вигляд на основі змін в стані. 1439 | 1440 | - **Інтерактивність:** Підходять для створення інтерактивних інтерфейсів, де є потреба в оновленні стану при взаємодії з користувачем. 1441 | 1442 | #### Коли використовувати: 1443 | 1444 | - Коли компонент потребує управління внутрішнім станом, наприклад, для збереження введених даних у формі, рахунку, вибору тощо. 1445 | 1446 |
1447 | 1448 |
1449 | 30. Що таке чисті компоненти (Pure Components)? 1450 | 1451 | #### React 1452 | 1453 | - **Чисті компоненти (Pure Components)** — це спеціальні класові компоненти React, які автоматично оптимізують рендеринг. Вони реалізують поверхневе порівняння пропсів і стану, щоб запобігти зайвим оновленням, якщо значення пропсів або стану не змінилися. 1454 | 1455 | #### Як створити чистий компонент? 1456 | 1457 | - Чистий компонент створюється шляхом успадкування від React.PureComponent. 1458 | 1459 | ```jsx 1460 | import React, { PureComponent } from "react"; 1461 | 1462 | class MyComponent extends PureComponent { 1463 | render() { 1464 | return

Hello, {this.props.name}!

; 1465 | } 1466 | } 1467 | 1468 | // Використання: 1469 | ; 1470 | ``` 1471 | 1472 | #### Як працює `PureComponent`? 1473 | 1474 | - Виконує поверхневе порівняння (`shallow comparison`) пропсів і стану у методі `shouldComponentUpdate`. 1475 | 1476 | - Якщо пропси та стан не змінилися, компонент не рендериться повторно. 1477 | 1478 | #### Коли використовувати `PureComponent`? 1479 | 1480 | - Коли пропси та стан є простими структурами (примітивні значення або неглибокі об'єкти). 1481 | 1482 | - Для підвищення продуктивності в компонентах, які часто оновлюються. 1483 | 1484 | #### Обмеження: 1485 | 1486 | 1. **Глибоке порівняння:** `PureComponent` не враховує зміни всередині вкладених об'єктів або масивів. 1487 | 1488 | - Наприклад, якщо ви оновлюєте об'єкт, але посилання на нього залишається незмінним, компонент не оновиться. 1489 | 1490 | ```jsx 1491 | this.setState({ data: { ...this.state.data, key: "new value" } }); // Обхідна 1492 | ``` 1493 | 1494 | 2. **Не працює з функціональними компонентами.** 1495 | 1496 | - Альтернатива: використовувати `React.memo` для оптимізації функціональних компонентів. 1497 | 1498 | ```jsx 1499 | const MyComponent = React.memo(function MyComponent(props) { 1500 | return

Hello, {props.name}!

; 1501 | }); 1502 | ``` 1503 | 1504 |
1505 | 1506 |
1507 | 31. Що таке компоненти вищого порядку (Higher-Order components)? 1508 | 1509 | #### React 1510 | 1511 | #### Компоненти вищого порядку (Higher-Order Components, HOC) 1512 | 1513 | - Компонент вищого порядку — це функція, яка приймає компонент як вхідний аргумент і повертає новий компонент, розширюючи його функціональність. 1514 | 1515 | #### Синтаксис HOC: 1516 | 1517 | ```jsx 1518 | const EnhancedComponent = higherOrderComponent(WrappedComponent); 1519 | ``` 1520 | 1521 | #### Особливості HOC: 1522 | 1523 | 1. Приймає компонент як аргумент. 1524 | 1525 | 2. Повертає новий компонент із додатковими властивостями чи поведінкою. 1526 | 1527 | 3. Дозволяє перевикористовувати логіку у різних компонентах. 1528 | 1529 | #### Приклад використання: 1530 | 1531 | - HOC для додавання стану до компонента: 1532 | 1533 | ```jsx 1534 | import React, { useState } from "react"; 1535 | 1536 | // HOC: додає логіку роботи зі станом 1537 | function withCounter(WrappedComponent) { 1538 | return function EnhancedComponent(props) { 1539 | const [count, setCount] = useState(0); 1540 | 1541 | const increment = () => setCount(count + 1); 1542 | 1543 | return ; 1544 | }; 1545 | } 1546 | 1547 | // Компонент, який буде розширено 1548 | function Button({ count, increment }) { 1549 | return ; 1550 | } 1551 | 1552 | // Використання HOC 1553 | const EnhancedButton = withCounter(Button); 1554 | 1555 | export default EnhancedButton; 1556 | ``` 1557 | 1558 | #### Реальні сценарії використання HOC: 1559 | 1560 | 1. **Авторизація (Authentication)** — обгортання компонентів для перевірки прав доступу. 1561 | 1562 | 2. **Обробка даних** — підключення до API чи обробка стану. 1563 | 1564 | 3. **Логування** — додавання журналювання дій компонентів. 1565 | 1566 | #### Обмеження HOC: 1567 | 1568 | - Може створювати глибокі вкладення (component tree), якщо використовувати забагато HOC. 1569 | 1570 | - Ускладнює читабельність через обгортання компонентів. 1571 | 1572 | HOC — потужний інструмент для повторного використання логіки, але в сучасних додатках їх часто замінюють React Hooks. 1573 | 1574 |
1575 | 1576 |
1577 | 32. Що таке children prop? 1578 | 1579 | #### React 1580 | 1581 | #### Що таке `children` prop? 1582 | 1583 | - `children` — це спеціальний пропс у React, який використовується для передачі вкладених елементів або компонентів у компонент-обгортку. 1584 | 1585 | #### Як це працює? 1586 | 1587 | - Коли ви передаєте дочірній вміст між відкриваючим і закриваючим тегами компонента, цей вміст автоматично передається як значення `props.children`. 1588 | 1589 | #### Приклад: 1590 | 1591 | - **Компонент-обгортка:** 1592 | 1593 | ```jsx 1594 | function Wrapper({ children }) { 1595 | return
{children}
; 1596 | } 1597 | ``` 1598 | 1599 | - **Використання:** 1600 | 1601 | ```jsx 1602 | function App() { 1603 | return ( 1604 | 1605 |

Hello, World!

1606 |

This is a paragraph inside the wrapper.

1607 |
1608 | ); 1609 | } 1610 | ``` 1611 | 1612 | - **Результат:** 1613 | 1614 | ```html 1615 |
1616 |

Hello, World!

1617 |

This is a paragraph inside the wrapper.

1618 |
1619 | ``` 1620 | 1621 | #### Ключові особливості `children`: 1622 | 1623 | 1. **Гнучкість:** Можна передавати будь-який тип даних: текст, JSX, компоненти, масиви елементів. 1624 | 1625 | 2. **Повторне використання:** Компонент-обгортка може динамічно відображати різний вміст. 1626 | 1627 | 3. **Структурованість:** Допомагає створювати компоненти з вкладеною структурою. 1628 | 1629 | #### Використання `children` з функціональними пропсами: 1630 | 1631 | Іноді `children` використовується як функція для динамічної передачі даних: 1632 | 1633 | ```jsx 1634 | function List({ items, children }) { 1635 | return ; 1636 | } 1637 | 1638 | function App() { 1639 | return ( 1640 | 1641 | {(item) =>
  • {item}
  • } 1642 |
    1643 | ); 1644 | } 1645 | ``` 1646 | 1647 | - **Результат:** 1648 | 1649 | ```html 1650 |
  • Apple
  • 1651 |
  • Banana
  • 1652 |
  • Cherry
  • 1653 | 1654 | ``` 1655 | 1656 | - `children` — це потужний інструмент для створення універсальних і багаторазових компонентів у React. 1657 | 1658 |
    1659 | 1660 |
    1661 | 33. Що таке портал (Portal)? 1662 | 1663 | #### React 1664 | 1665 | - **Портал (Portal)** у React — це спосіб рендерити дочірні елементи в DOM-вузол, який знаходиться за межами DOM-ієрархії батьківського компонента. 1666 | 1667 | #### Як працює: 1668 | 1669 | - React забезпечує портали через метод `ReactDOM.createPortal`, який приймає два аргументи: 1670 | 1671 | 1. **React-елемент**, що потрібно рендерити. 1672 | 1673 | 2. **Цільовий DOM-вузол**, у який слід вставити елемент. 1674 | 1675 | #### Синтаксис: 1676 | 1677 | ```jsx 1678 | ReactDOM.createPortal(child, container); 1679 | ``` 1680 | 1681 | - **child** — React-елемент, який потрібно рендерити. 1682 | 1683 | - **container** — DOM-вузол, де елемент буде вставлено. 1684 | 1685 | #### Приклад використання: 1686 | 1687 | ```jsx 1688 | import React from "react"; 1689 | import ReactDOM from "react-dom"; 1690 | 1691 | function Modal({ children }) { 1692 | return ReactDOM.createPortal( 1693 |
    {children}
    , 1694 | document.getElementById("modal-root") // Цільовий вузол 1695 | ); 1696 | } 1697 | 1698 | function App() { 1699 | return ( 1700 |
    1701 |

    Основний контент

    1702 | 1703 |

    Це контент модального вікна

    1704 |
    1705 |
    1706 | ); 1707 | } 1708 | ``` 1709 | 1710 | #### Де використовують портали: 1711 | 1712 | - Модальні вікна. 1713 | 1714 | - Спливаючі підказки (tooltips). 1715 | 1716 | - Контекстні меню. 1717 | 1718 | #### Особливості: 1719 | 1720 | 1. **Ієрархія подій:** 1721 | 1722 | - Хоча елемент рендериться поза ієрархією DOM, обробка подій відбувається відповідно до React-ієрархії компонентів. Наприклад, події onClick підніматимуться до батьківських компонентів React. 1723 | 1724 | 2. Гнучкість: Портали дозволяють вставляти елементи в місця, які не вписуються в поточну структуру DOM. 1725 | 1726 | #### Переваги: 1727 | 1728 | - Легке управління "плаваючими" елементами. 1729 | - Збереження контексту React навіть за межами основної DOM-ієрархії. 1730 | 1731 |
    1732 | 1733 |
    1734 | 34. Як працюють портали (Portals) в React, і які їх переваги та основні застосування в UI-розробці? 1735 | 1736 | #### React 1737 | 1738 | - **Портали (Portals)** в React дозволяють рендерити дочірні елементи в іншу частину DOM, а не в стандартне місце рендерингу компонента. Це корисно для розміщення елементів, які повинні знаходитися поза звичною ієрархією DOM, наприклад, модальні вікна, тултіп або спливаючі елементи. 1739 | 1740 | #### Основні переваги порталів: 1741 | 1742 | - Вони дають можливість рендерити елементи в інше місце DOM, не порушуючи структуру React-компонентів. 1743 | 1744 | - Порти можуть бути корисні, коли потрібно рендерити елементи поверх іншого вмісту (наприклад, модальні вікна, спливаючі меню). 1745 | 1746 | #### Як працюють портали: 1747 | 1748 | - Портал дозволяє відправити вміст в будь-яке місце DOM, навіть поза межами кореневого контейнера React. 1749 | 1750 | #### Приклад використання порталу: 1751 | 1752 | ```jsx 1753 | import ReactDOM from "react-dom"; 1754 | 1755 | const Modal = () => { 1756 | return ReactDOM.createPortal( 1757 |
    1758 |

    Це модальне вікно

    1759 |
    , 1760 | document.getElementById("modal-root") // Місце в DOM, куди рендеримо портал 1761 | ); 1762 | }; 1763 | 1764 | const App = () => { 1765 | return ( 1766 |
    1767 |

    Головна сторінка

    1768 | 1769 |
    1770 | ); 1771 | }; 1772 | ``` 1773 | 1774 | #### Ключові моменти: 1775 | 1776 | - `ReactDOM.createPortal()`: використовується для створення порталу. Перший аргумент — це вміст, який рендериться, а другий аргумент — це DOM-елемент, в який цей вміст вставляється. 1777 | 1778 | - Портали можуть бути використані для модальних вікон, тултіпів, спливаючих меню та інших елементів, які мають бути відображені поза межами основного дерева компонентів. 1779 | 1780 | #### Особливості: 1781 | 1782 | - Хоча елементи, що рендеряться через портали, знаходяться поза межами основної ієрархії React-компонентів, вони все одно мають доступ до контексту, стану і пропсів своїх батьків. 1783 | 1784 | - Порти можуть бути корисні, якщо потрібно обробити випадки, коли елементи повинні бути розташовані "поверх" іншого контенту або на іншому рівні ієрархії DOM (наприклад, модальне вікно, яке не має бути обмежене батьківським контейнером). 1785 | 1786 | Порти дозволяють зберігати логіку компонента і структуру, не порушуючи правила DOM, що дозволяє створювати зручні й чисті UI-компоненти. 1787 | 1788 |
    1789 | 1790 | ### Життєвий цикл компонента 1791 | 1792 |
    1793 | 35. Методи життєвого циклу компонента у React? 1794 | 1795 | #### React 1796 | 1797 | - Методи життєвого циклу компонента в React використовуються для управління різними етапами життя компонентів: створення, оновлення та видалення. 1798 | 1799 | #### Основні фази життєвого циклу: 1800 | 1801 | 1. **Монтування (Mounting):** Коли компонент додається в DOM. 1802 | 1803 | - **_constructor():_** Ініціалізація стану та прив'язка методів. 1804 | 1805 | - **_static getDerivedStateFromProps(props, state):_** Оновлення стану перед рендером (рідко використовується). 1806 | 1807 | - **_render():_** Рендерить JSX у віртуальний DOM. 1808 | 1809 | - **_componentDidMount():_** Викликається одразу після додавання компонента в DOM. Використовується для запитів API, ініціалізації бібліотек. 1810 | 1811 | 2. **Оновлення (Updating):** Коли змінюються пропси або стан. 1812 | 1813 | - **_static getDerivedStateFromProps(props, state):_** Викликається перед кожним рендером. 1814 | 1815 | - **_shouldComponentUpdate(nextProps, nextState):_** Контролює, чи потрібно повторно рендерити компонент. За замовчуванням повертає true. 1816 | 1817 | - **_render():_** Виконується для оновлення віртуального DOM. 1818 | 1819 | - **_getSnapshotBeforeUpdate(prevProps, prevState):_** Отримує знімок перед змінами (наприклад, положення скролу). 1820 | 1821 | - **_componentDidUpdate(prevProps, prevState, snapshot):_** Викликається після оновлення. Використовується для повторних запитів або роботи з DOM. 1822 | 1823 | 3. **Розмонтування (Unmounting):** Коли компонент видаляється з DOM. 1824 | 1825 | - **_componentWillUnmount():_** Використовується для очищення ресурсів (наприклад, таймерів, підписок). 1826 | 1827 | 4. **Обробка помилок (Error Handling):** Коли компонент викликає помилку. 1828 | 1829 | - **_static getDerivedStateFromError(error):_** Дозволяє оновити стан після помилки. 1830 | 1831 | - **_componentDidCatch(error, info):_** Логування помилок. 1832 | 1833 | #### Таблиця методів: 1834 | 1835 | | Фаза | Метод | Опис | 1836 | | ------------------- | ---------------------------- | --------------------------------------- | 1837 | | **Монтування** | `constructor()` | Ініціалізація стану та налаштування. | 1838 | | | `getDerivedStateFromProps()` | Оновлення стану перед рендером. | 1839 | | | `render()` | Рендеринг JSX у віртуальний DOM. | 1840 | | | `componentDidMount()` | Виконується після додавання в DOM. | 1841 | | **Оновлення** | `getDerivedStateFromProps()` | Оновлення стану перед рендером. | 1842 | | | `shouldComponentUpdate()` | Визначає, чи потрібен повторний рендер. | 1843 | | | `render()` | Оновлює віртуальний DOM. | 1844 | | | `getSnapshotBeforeUpdate()` | Отримує знімок стану перед оновленням. | 1845 | | | `componentDidUpdate()` | Виконується після оновлення. | 1846 | | **Розмонтування** | `componentWillUnmount()` | Очищення ресурсів перед видаленням. | 1847 | | **Обробка помилок** | `getDerivedStateFromError()` | Оновлює стан у разі помилки. | 1848 | | | `componentDidCatch()` | Логування помилок. | 1849 | 1850 | #### Сучасний підхід: 1851 | 1852 | У функціональних компонентах замість методів життєвого циклу використовують **хуки**: 1853 | 1854 | - `useEffect` замінює `componentDidMount`, `componentDidUpdate`, `componentWillUnmount`. 1855 | 1856 | - `useState` для управління станом. 1857 | 1858 |
    1859 | 1860 |
    1861 | 36. Що робить метод shouldComponentUpdate? 1862 | 1863 | #### React 1864 | 1865 | - `shouldComponentUpdate` – це метод життєвого циклу у класових компонентах, який визначає, чи потрібно повторно рендерити компонент. 1866 | 1867 | #### Як працює: 1868 | 1869 | - За замовчуванням повертає `true`, що означає ререндер при будь-якій зміні `state` або `props`. 1870 | 1871 | - Якщо повертає `false`, React не буде ререндерити компонент, навіть якщо props або `state` змінилися. 1872 | 1873 | #### Приклад використання: 1874 | 1875 | ```jsx 1876 | class MyComponent extends React.Component { 1877 | shouldComponentUpdate(nextProps, nextState) { 1878 | return nextProps.value !== this.props.value; // Ререндер тільки при зміні value 1879 | } 1880 | 1881 | render() { 1882 | return
    {this.props.value}
    ; 1883 | } 1884 | } 1885 | ``` 1886 | 1887 | #### Альтернатива у функціональних компонентах: 1888 | 1889 | - Використовуй `React.memo()` для мемоізації. 1890 | 1891 | - `useMemo()` і `useCallback()` допомагають оптимізувати ререндери. 1892 | 1893 |
    1894 | 1895 |
    1896 | 37. Як виконати код перед видаленням компонента з дерева? 1897 | 1898 | #### React 1899 | 1900 | - Щоб виконати код перед видаленням компонента з дерева в React, використовують такі підходи: 1901 | 1902 | 1. Класові компоненти: componentWillUnmount 1903 | 1904 | - Для класових компонентів є метод життєвого циклу componentWillUnmount, який викликається перед видаленням компонента. 1905 | 1906 | ```jsx 1907 | class MyComponent extends React.Component { 1908 | componentWillUnmount() { 1909 | console.log("Компонент буде видалено"); 1910 | } 1911 | 1912 | render() { 1913 | return
    Мій компонент
    ; 1914 | } 1915 | } 1916 | ``` 1917 | 1918 | 2. Функціональні компоненти: useEffect з очищенням 1919 | 1920 | - У функціональних компонентах очищення можна зробити в useEffect, повернувши функцію, яка виконається перед видаленням компонента. 1921 | 1922 | ```jsx 1923 | import { useEffect } from "react"; 1924 | 1925 | function MyComponent() { 1926 | useEffect(() => { 1927 | return () => { 1928 | console.log("Компонент буде видалено"); 1929 | }; 1930 | }, []); 1931 | 1932 | return
    Мій компонент
    ; 1933 | } 1934 | ``` 1935 | 1936 | 3. Обробка перед закриттям сторінки (beforeunload) 1937 | 1938 | - Якщо потрібно виконати код перед закриттям вкладки або перезавантаженням сторінки: 1939 | 1940 | ```jsx 1941 | useEffect(() => { 1942 | const handleUnload = () => { 1943 | console.log("Сторінка закривається"); 1944 | }; 1945 | 1946 | window.addEventListener("beforeunload", handleUnload); 1947 | return () => window.removeEventListener("beforeunload", handleUnload); 1948 | }, []); 1949 | ``` 1950 | 1951 | #### Висновок 1952 | 1953 | - `componentWillUnmount` – для класових компонентів. 1954 | 1955 | - `useEffect` із `return` – для функціональних. 1956 | 1957 | - `beforeunload` – для випадків, коли потрібно реагувати на вихід із сторінки. 1958 | 1959 |
    1960 | 1961 |
    1962 | 38. Чому фрагменти (Fragment) кращі за контейнерні div? 1963 | 1964 | #### React 1965 | 1966 | - Фрагменти (`` або `<>...`) кращі за контейнерні `
    ` у React з кількох причин: 1967 | 1968 | 1. **Зменшення зайвого HTML** 1969 | 1970 | - Фрагменти не додають додатковий елемент у DOM, що зменшує кількість вкладених тегів і покращує продуктивність. 1971 | 1972 | ```jsx 1973 | <> 1974 |

    Title

    1975 |

    Text

    1976 | 1977 | ``` 1978 | 1979 | - Результат у DOM: 1980 | 1981 | ```html 1982 |

    Title

    1983 |

    Text

    1984 | ``` 1985 | 1986 | - На відміну від `
    `, який би додавав зайву вкладеність: 1987 | 1988 | ```html 1989 |
    1990 |

    Title

    1991 |

    Text

    1992 |
    1993 | ``` 1994 | 1995 | 2. **Відсутність стилістичних побічних ефектів** 1996 | 1997 | - Додатковий `
    ` може впливати на CSS-стилі, спричиняючи небажані зміни у верстці. Фрагменти цього уникають. 1998 | 1999 | 3. **Краща сумісність з таблицями** 2000 | 2001 | - У `` не можна безпосередньо вкладати `
    `, але можна використовувати фрагменти: 2002 | 2003 | ```jsx 2004 | <> 2005 |
    2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | ``` 2013 | 2014 | - Це працює правильно, тоді як `
    ` спричинив би помилку. 2015 | 2016 | 4. **Оптимізація продуктивності** 2017 | 2018 | - Менше зайвих вузлів у DOM → швидший рендеринг та менше споживання пам’яті. 2019 | 2020 | 2021 | 2022 | ### Хуки 2023 | 2024 |
    2025 | 39. Що таке Хуки (Hooks) в React? 2026 | 2027 | #### React 2028 | 2029 | - **React Хуки (Hooks)** — це функції, які дозволяють вам використовувати стан та інші можливості React без написання класів. 2030 | 2031 | #### Основні типи хуків: 2032 | 2033 | 1. **useState** — дозволяє додавати стан в функціональні компоненти. 2034 | 2035 | ```jsx 2036 | const [state, setState] = useState(initialState); 2037 | ``` 2038 | 2039 | 2. **useEffect** — дозволяє виконувати побічні ефекти (наприклад, запити до API або підписки) у функціональних компонентах. 2040 | 2041 | ```jsx 2042 | useEffect(() => { 2043 | // код для ефекту 2044 | }, [dependencies]); // залежності 2045 | ``` 2046 | 2047 | 3. **useContext** — доступ до значень контексту без необхідності використовувати компонент Consumer. 2048 | 2049 | ```jsx 2050 | const value = useContext(MyContext); 2051 | ``` 2052 | 2053 | 4. **useRef** — дозволяє створювати посилання на DOM-елементи або зберігати значення між рендерами без змін стану. 2054 | 2055 | ```jsx 2056 | const myRef = useRef(initialValue); 2057 | ``` 2058 | 2059 | 5. **useReducer** — альтернатива useState, зручна для управління складнішими станами через редуктори, подібно до Redux. 2060 | 2061 | ```jsx 2062 | const [state, dispatch] = useReducer(reducer, initialState); 2063 | ``` 2064 | 2065 | 6. **useMemo** — оптимізує обчислення значень, щоб уникнути непотрібних повторних обчислень. 2066 | 2067 | ```jsx 2068 | const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]); 2069 | ``` 2070 | 2071 | 7. **useCallback** — повертає мемоізовану версію функції, щоб вона не створювалась знову при кожному рендері. 2072 | 2073 | ```jsx 2074 | const memoizedCallback = useCallback(() => { 2075 | // функція; 2076 | }, [dependencies]); 2077 | ``` 2078 | 2079 | #### Основні переваги: 2080 | 2081 | - **Функціональні компоненти:** Замість класових компонентів ви можете використовувати функціональні компоненти з хуками. 2082 | 2083 | - **Покращена читабельність:** Логіка можна розділити на декілька хуків, що зменшує кількість коду та підвищує модульність. 2084 | 2085 | - **Перерозподіл логіки:** Хуки дозволяють повторно використовувати логіку в різних компонентах без створення складних ієрархій. 2086 | 2087 |
    2088 | 2089 |
    2090 | 40. Переваги Хуків (Hooks) в React? 2091 | 2092 | #### React 2093 | 2094 | | **Перевага** | **Опис** | 2095 | | ------------------------------------ | ---------------------------------------------------------------------------------------------- | 2096 | | **Менше коду** | Хуки дозволяють уникнути класів і скоротити обсяг коду. | 2097 | | **Краща читабельність** | Код з хуками легший для розуміння та підтримки. | 2098 | | **Повторне використання логіки** | Custom Hooks дозволяють повторно використовувати логіку між компонентами. | 2099 | | **Спрощене управління станом** | Використання `useState` і `useReducer` робить стейт-менеджмент простішим. | 2100 | | **Гнучкість у використанні ефектів** | `useEffect` дозволяє виконувати побічні ефекти без потреби в класових методах життєвого циклу. | 2101 | | **Легша міграція** | Полегшує перехід від класових компонентів до функціональних. | 2102 | 2103 |
    2104 | 2105 |
    2106 | 41. Недоліки Хуків (Hooks) в React? 2107 | 2108 | #### React 2109 | 2110 | | **Недолік** | **Опис** | 2111 | | -------------------------------------- | ------------------------------------------------------------------------------------------- | 2112 | | **Збільшена кількість ререндерів** | Неправильне використання хуків, особливо `useEffect`, може викликати зайві ререндери. | 2113 | | **Ускладнене розуміння логіки** | Логіка компонента може бути розпорошена між кількома `useEffect`, що ускладнює дебаг. | 2114 | | **Відсутність явного життєвого циклу** | На відміну від класових компонентів, хуки не мають чітко виражених методів життєвого циклу. | 2115 | | **Можливі проблеми з оптимізацією** | Неправильне використання `useCallback` і `useMemo` може призвести до неефективної роботи. | 2116 | | **Складність у великих проєктах** | У масштабних додатках хуки можуть ускладнювати управління станом і побічними ефектами. | 2117 | 2118 |
    2119 | 2120 |
    2121 | 42. Правила (обмеження) використання Хуків (Hooks) в React? 2122 | 2123 | #### React 2124 | 2125 | | **Правило** | **Опис** | 2126 | | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | 2127 | | **Використання тільки у функціях** | Хуки можна викликати лише у функціональних компонентах або в кастомних хуках. | 2128 | | **Збереження порядку виклику** | Хуки не можна викликати умовно (`if`, `for`, `while`), інакше порушиться порядок виклику. | 2129 | | **Виклик тільки на верхньому рівні** | Хуки не можна викликати всередині вкладених функцій або обробників подій. | 2130 | | **Іменування кастомних хуків** | Кастомні хуки мають починатися з `use` (наприклад, `useAuth`). | 2131 | | **Дотримання правил залежностей** | У `useEffect`, `useMemo` та `useCallback` залежності (`[]`) потрібно вказувати правильно, щоб уникнути непередбачуваної поведінки. | 2132 | 2133 |
    2134 | 2135 |
    2136 | 43. Що таке useReducer()? 2137 | 2138 | #### React 2139 | 2140 | - `useReducer()` — це хук у React, який використовується для управління станом у функціональних компонентах. Це альтернатива `useState()`, яка підходить для складних логік оновлення стану, особливо якщо зміни залежать від попереднього стану. 2141 | 2142 | #### Синтаксис: 2143 | 2144 | ```jsx 2145 | const [state, dispatch] = useReducer(reducer, initialState); 2146 | ``` 2147 | 2148 | - `reducer` — функція, яка приймає `state` і `action`, повертаючи новий стан. 2149 | 2150 | - `initialState` — початковий стан. 2151 | 2152 | - `dispatch` — функція для виклику редюсера з певною `action`. 2153 | 2154 | #### Приклад: 2155 | 2156 | ```jsx 2157 | import { useReducer } from "react"; 2158 | 2159 | const initialState = { count: 0 }; 2160 | 2161 | function reducer(state, action) { 2162 | switch (action.type) { 2163 | case "increment": 2164 | return { count: state.count + 1 }; 2165 | case "decrement": 2166 | return { count: state.count - 1 }; 2167 | default: 2168 | return state; 2169 | } 2170 | } 2171 | 2172 | function Counter() { 2173 | const [state, dispatch] = useReducer(reducer, initialState); 2174 | 2175 | return ( 2176 |
    2177 |

    Count: {state.count}

    2178 | 2179 | 2180 |
    2181 | ); 2182 | } 2183 | ``` 2184 | 2185 | #### Коли використовувати: 2186 | 2187 | - Коли стан має складну логіку або залежності. 2188 | 2189 | - Коли необхідно уніфікувати оновлення стану через dispatch. 2190 | 2191 | - Для масштабованості, наприклад, при використанні в глобальному стані. 2192 | 2193 |
    2194 | 2195 |
    2196 | 44. Розкажіть про хуки useCallback(), useMemo(), useImperativeHandle(), useLayoutEffect()? 2197 | 2198 | #### React 2199 | 2200 | #### useCallback() 2201 | 2202 | - Мемоізує функцію, щоб вона не створювалася заново при кожному рендері. Корисно для передачі колбеків у дочірні компоненти. 2203 | 2204 | - **Приклад:** 2205 | 2206 | ```jsx 2207 | import { useCallback } from "react"; 2208 | 2209 | function MyComponent({ onClick }) { 2210 | return ; 2211 | } 2212 | 2213 | function Parent() { 2214 | const handleClick = useCallback(() => { 2215 | console.log("Клік"); 2216 | }, []); // Функція створюється один раз 2217 | 2218 | return ; 2219 | } 2220 | ``` 2221 | 2222 | #### useMemo() 2223 | 2224 | - Мемоізує обчислення, щоб не виконувати їх повторно при кожному рендері, якщо залежності не змінилися. 2225 | 2226 | - **Приклад:** 2227 | 2228 | ```jsx 2229 | import { useMemo } from "react"; 2230 | 2231 | function ExpensiveCalculation({ num }) { 2232 | const result = useMemo(() => { 2233 | console.log("Обчислення..."); 2234 | return num \* 2; 2235 | }, [num]); // Виконується лише при зміні num 2236 | 2237 | return
    Результат: {result}
    ; 2238 | } 2239 | ``` 2240 | 2241 | #### useImperativeHandle() 2242 | 2243 | - Дозволяє керувати поведінкою ref у дочірньому компоненті. Використовується разом із forwardRef(). 2244 | 2245 | - **Приклад:** 2246 | 2247 | ```jsx 2248 | import { useRef, useImperativeHandle, forwardRef } from "react"; 2249 | 2250 | const CustomInput = forwardRef((props, ref) => { 2251 | const inputRef = useRef(); 2252 | 2253 | useImperativeHandle(ref, () => ({ 2254 | focus: () => inputRef.current.focus(), 2255 | clear: () => (inputRef.current.value = ""), 2256 | })); 2257 | 2258 | return ; 2259 | }); 2260 | 2261 | function Parent() { 2262 | const inputRef = useRef(); 2263 | 2264 | return ( 2265 |
    2266 | 2267 | 2268 | 2269 |
    2270 | ); 2271 | } 2272 | ``` 2273 | 2274 | #### useLayoutEffect() 2275 | 2276 | - Працює як `useEffect()`, але виконується синхронно після змін в DOM. Корисно для вимірювання або маніпуляцій з DOM перед тим, як браузер малює сторінку. 2277 | 2278 | - **Приклад:** 2279 | 2280 | ```jsx 2281 | import { useLayoutEffect, useRef } from "react"; 2282 | 2283 | function LayoutEffectExample() { 2284 | const divRef = useRef(); 2285 | 2286 | useLayoutEffect(() => { 2287 | console.log("Ширина елемента:", divRef.current.offsetWidth); 2288 | }, []); 2289 | 2290 | return ( 2291 |
    2292 | Елемент 2293 |
    2294 | ); 2295 | } 2296 | ``` 2297 | 2298 | #### Коли який хук використовувати? 2299 | 2300 | - `useCallback()` — для запам’ятовування функцій. 2301 | 2302 | - `useMemo()` — для запам’ятовування обчислень. 2303 | 2304 | - `useImperativeHandle()` — для керування ref дочірнього компонента. 2305 | 2306 | - `useLayoutEffect()` — коли треба щось зробити перед відображенням змін в DOM (наприклад, вимірювання). 2307 | 2308 |
    2309 | 2310 |
    2311 | 45. Як реалізувати одноразове виконання операції під час початкового рендерингу? 2312 | 2313 | #### React 2314 | 2315 | - Для виконання операції лише один раз під час початкового рендерингу у функціональних компонентах використовуй `useEffect` з порожнім масивом залежностей (`[]`): 2316 | 2317 | #### Приклад: 2318 | 2319 | ```jsx 2320 | import { useEffect } from "react"; 2321 | 2322 | function MyComponent() { 2323 | useEffect(() => { 2324 | console.log("Це виконається лише один раз після монтування компонента"); 2325 | }, []); 2326 | 2327 | return
    Компонент
    ; 2328 | } 2329 | ``` 2330 | 2331 | #### Пояснення: 2332 | 2333 | - `useEffect(() => { /_ код _/ }, [])` — пустий масив залежностей означає, що ефект запуститься тільки один раз після першого рендерингу (аналог `componentDidMount` у класових компонентах). 2334 | 2335 | #### Додатково (наприклад, підписка/відписка): 2336 | 2337 | ```jsx 2338 | useEffect(() => { 2339 | const interval = setInterval(() => { 2340 | console.log("Працює одноразовий ефект"); 2341 | }, 1000); 2342 | 2343 | return () => clearInterval(interval); // Очистка при розмонтуванні 2344 | }, []); 2345 | ``` 2346 | 2347 | - Цей підхід корисний для ініціалізації API-запитів, підписок, таймерів тощо. 2348 | 2349 |
    2350 | 2351 | ### Контекст та управління станом 2352 | 2353 |
    2354 | 46. Що таке контекст (Context)? 2355 | 2356 | #### React 2357 | 2358 | - **Контекст (Context)** в React — це механізм для передачі даних через дерево компонентів без необхідності передавати ці дані через пропси на кожному рівні. 2359 | 2360 | #### Як працює контекст: 2361 | 2362 | 1. **React.createContext()** — використовується для створення контексту. 2363 | 2364 | ```jsx 2365 | const MyContext = React.createContext(defaultValue); 2366 | ``` 2367 | 2368 | 2. **Provider** — компонент, який надає значення контексту. Він обгортає частину дерева компонентів і передає значення вниз через value. 2369 | 2370 | ```jsx 2371 | 2372 | 2373 | 2374 | ``` 2375 | 2376 | 3. **Consumer** — компонент, який споживає значення контексту. Зазвичай використовує функцію як дочірній елемент, що отримує значення контексту. 2377 | 2378 | ```jsx 2379 | 2380 | {value => } 2381 | 2382 | ``` 2383 | 2384 | 4. **useContext** — хук, який дозволяє доступити значення контексту без необхідності використовувати Consumer. 2385 | 2386 | ```jsx 2387 | const value = useContext(MyContext); 2388 | ``` 2389 | 2390 | #### Коли використовувати: 2391 | 2392 | - Коли є потреба передавати дані між компонентами на різних рівнях ієрархії (наприклад, тема, мова або користувач). 2393 | 2394 | - Коли вам не хочеться передавати пропси через кілька рівнів компонентів, що може ускладнити код. 2395 | 2396 | #### Приклад використання: 2397 | 2398 | ```jsx 2399 | // Створення контексту 2400 | const ThemeContext = React.createContext("light"); 2401 | 2402 | // Компонент, який надає значення контексту 2403 | function App() { 2404 | return ( 2405 | 2406 | 2407 | 2408 | ); 2409 | } 2410 | 2411 | // Компонент, який споживає значення контексту 2412 | function ThemedComponent() { 2413 | const theme = useContext(ThemeContext); 2414 | return
    The current theme is {theme}
    ; 2415 | } 2416 | ``` 2417 | 2418 | #### Переваги: 2419 | 2420 | - Зручність в передачі глобальних значень. 2421 | 2422 | - Покращує масштабованість програми, зменшуючи кількість переданих пропсів. 2423 | 2424 |
    2425 | 2426 |
    2427 | 47. Як в React працює механізм контексту (Context) для спільної передачі даних між компонентами? 2428 | 2429 | #### React 2430 | 2431 | - Механізм **React Context** дозволяє передавати дані між компонентами без необхідності передавати їх через пропси на кожному рівні компонентів. Це корисно для глобальних даних, таких як налаштування теми, аутентифікація користувача чи мова. 2432 | 2433 | #### Основні етапи роботи з контекстом: 2434 | 2435 | 1. **Створення контексту:** Для створення контексту використовується React.createContext(). Це повертає два компоненти: 2436 | 2437 | - Provider — компонент, який передає значення контексту. 2438 | 2439 | - Consumer — компонент, який отримує значення контексту. 2440 | 2441 | ```jsx 2442 | const MyContext = React.createContext(); 2443 | ``` 2444 | 2445 | 2. **Надання контексту:** Використовуємо Provider, щоб огорнути компоненти, яким потрібно передавати контекст. В Provider передається значення через пропс value. 2446 | 2447 | ```jsx 2448 | const App = () => { 2449 | const [user, setUser] = useState("John Doe"); 2450 | 2451 | return ( 2452 | 2453 | 2454 | 2455 | ); 2456 | }; 2457 | ``` 2458 | 2459 | 3. **Отримання контексту:** Використовуємо Consumer або хук useContext для доступу до значення контексту. 2460 | 2461 | - **Consumer:** 2462 | 2463 | ```jsx 2464 | const Child = () => ( 2465 | {(user) =>
    {user}
    }
    2466 | ); 2467 | ``` 2468 | 2469 | - **useContext хук (рекомендовано в функціональних компонентах):** 2470 | 2471 | ```jsx 2472 | const Child = () => { 2473 | const user = useContext(MyContext); 2474 | return
    {user}
    ; 2475 | }; 2476 | ``` 2477 | 2478 | - **Зміна контексту:** Для зміни значення контексту можна використовувати функції, передані через `useState` або інші методи управління станом. 2479 | 2480 | ```jsx 2481 | const App = () => { 2482 | const [user, setUser] = useState("John Doe"); 2483 | 2484 | return ( 2485 | 2486 | 2487 | 2488 | 2489 | ); 2490 | }; 2491 | ``` 2492 | 2493 | #### Ключові моменти: 2494 | 2495 | - Контекст дозволяє уникати "prop drilling" (передавання пропсів через багато компонентів). 2496 | 2497 | - Якщо значення контексту змінюється, всі компоненти, які споживають цей контекст, будуть перерендерені. 2498 | 2499 | - **_useContext_** — зручніший і сучасніший спосіб отримати значення контексту в порівнянні з `Consumer`. 2500 | 2501 | Контекст — це потужний інструмент, але використовувати його варто тільки для глобальних даних. Для локального стану краще використовувати звичайний state. 2502 | 2503 |
    2504 | 2505 |
    2506 | 48. Що таке буріння пропсів (Prop Drilling)? Як його уникнути? 2507 | 2508 | #### React 2509 | 2510 | - **Prop Drilling** — це передача пропсів через кілька рівнів вкладених компонентів, навіть якщо вони потрібні лише в дочірньому компоненті глибше в ієрархії. Це ускладнює підтримку коду та робить його менш читабельним. 2511 | 2512 | - **Приклад Prop Drilling:** 2513 | 2514 | ```jsx 2515 | const Parent = () => { 2516 | const user = { name: "John" }; 2517 | return ; 2518 | }; 2519 | 2520 | const Child = ({ user }) => { 2521 | return ; 2522 | }; 2523 | 2524 | const GrandChild = ({ user }) => { 2525 | return

    Ім'я: {user.name}

    ; 2526 | }; 2527 | ``` 2528 | 2529 | - Тут `user` передається через `Child`, хоча він йому не потрібен — це і є **_буріння пропсів_**. 2530 | 2531 | #### Як уникнути Prop Drilling? 2532 | 2533 | | **Метод** | **Опис** | 2534 | | --------------------------------------------------- | ----------------------------------------------------------------------- | 2535 | | **Context API** | Дозволяє передавати дані безпосередньо потрібним компонентам. | 2536 | | **Зовнішні стейти (Redux, Zustand, Jotai, Recoil)** | Використовуються для управління глобальним станом без передачі пропсів. | 2537 | | **Компоненти з рендер-пропсами (Render Props)** | Дозволяють передавати функції замість пропсів. | 2538 | | **Custom Hooks** | Виносять логіку в окремі функції для доступу до загальних даних. | 2539 | 2540 | #### Приклад використання Context API замість Prop Drilling 2541 | 2542 | ```jsx 2543 | import { createContext, useContext } from "react"; 2544 | 2545 | const UserContext = createContext(); 2546 | 2547 | const Parent = () => { 2548 | const user = { name: "John" }; 2549 | return ( 2550 | 2551 | 2552 | 2553 | ); 2554 | }; 2555 | 2556 | const GrandChild = () => { 2557 | const user = useContext(UserContext); 2558 | return

    Ім'я: {user.name}

    ; 2559 | }; 2560 | ``` 2561 | 2562 | - Тут `user` доступний напряму у `GrandChild`, без зайвої передачі через `Child`. 2563 | 2564 |
    2565 | 2566 |
    2567 | 49. Що таке Redux? 2568 | 2569 | #### React 2570 | 2571 | - Redux — це бібліотека для керування станом у JavaScript-додатках, особливо популярна у React. Вона ґрунтується на концепції глобального сховища (store), де зберігається весь стан додатка, і дозволяє керувати ним через передбачувані зміни. 2572 | 2573 | #### Основні принципи Redux: 2574 | 2575 | 1. **Єдине джерело правди** — весь стан зберігається в одному глобальному `store`, що спрощує відстеження змін. 2576 | 2. **Стан є лише для читання** — змінювати стан напряму не можна, тільки через `action`. 2577 | 3. **Зміни відбуваються через чисті функції** — стан змінюється за допомогою функцій-ред’юсерів (reducers), які приймають поточний стан і `action`, повертаючи новий стан. 2578 | 2579 | #### Основні елементи Redux: 2580 | 2581 | - **Store** — єдине сховище стану. 2582 | - **Actions** — об'єкти, що описують намір змінити стан. 2583 | - **Reducers** — чисті функції, що визначають, як змінюється стан. 2584 | - **Dispatch** — метод для відправки `action`. 2585 | - **Selectors** — функції для отримання потрібних даних зі `store`. 2586 | 2587 | Redux підходить для великих додатків з ускладненими потоками даних, але для простих проєктів часто є зайвим. 2588 | 2589 |
    2590 | 2591 |
    2592 | 50. Які ти ще знаш бібліотеки керуванням стану в React крім Redux? 2593 | 2594 | #### React 2595 | 2596 | - Окрім Redux, є багато бібліотек для керування станом у React: 2597 | 2598 | 1. **React Context API** — вбудований механізм React для передачі стану без пробросу пропсів. Добре підходить для малих і середніх додатків. 2599 | 2600 | 2. **Zustand** — простіший і легший за Redux, не потребує reducers та actions. Використовує імперативний підхід і працює через хуки. 2601 | 2602 | 3. **Recoil** — бібліотека від Facebook, що працює з атомами (atoms) та селекторами (selectors), дозволяючи створювати гнучку систему глобального стану. 2603 | 2604 | 4. **Jotai** — схожа на Recoil, але простіша. Використовує атоми для збереження стану та дозволяє декларативно керувати ним. 2605 | 2606 | 5. **MobX** — реактивний підхід до керування станом, працює через спостереження (observables). Зручний для роботи з об’єктами та складними структурами. 2607 | 2608 | 6. **Effector** — більш декларативний та ефективний за Redux. Побудований на реактивному підході та дозволяє легко керувати потоками даних. 2609 | 2610 | 7. **XState** — бібліотека для роботи з машинами станів (state machines), добре підходить для складної бізнес-логіки. 2611 | 2612 | - Кожна з них має свої переваги, і вибір залежить від складності проєкту та вимог до продуктивності. 2613 | 2614 |
    2615 | 2616 |
    2617 | 51. Що таке Redux Thunk? 2618 | 2619 | #### React 2620 | 2621 | - **Redux Thunk** — це middleware для Redux, який дозволяє виконувати асинхронні операції (наприклад, запити до API) перед відправкою змін у `store`. 2622 | 2623 | #### Як працює: 2624 | 2625 | - Звичайно, Redux дозволяє передавати в `dispatch` тільки об'єкти (actions). Redux Thunk розширює цю можливість, дозволяючи передавати функції. Це дає змогу: 2626 | 2627 | 1. Виконувати асинхронні дії перед зміною стану. 2628 | 2629 | 2. Отримувати доступ до `dispatch` і `getState` усередині `thunk`. 2630 | 2631 | #### Приклад використання: 2632 | 2633 | ```jsx 2634 | const fetchData = () => { 2635 | return async (dispatch) => { 2636 | dispatch({ type: "FETCH_START" }); 2637 | 2638 | try { 2639 | const response = await fetch("https://api.example.com/data"); 2640 | const data = await response.json(); 2641 | dispatch({ type: "FETCH_SUCCESS", payload: data }); 2642 | } catch (error) { 2643 | dispatch({ type: "FETCH_ERROR", error }); 2644 | } 2645 | }; 2646 | }; 2647 | ``` 2648 | 2649 | - Далі викликаємо цей `thunk`: 2650 | 2651 | ```jsx 2652 | dispatch(fetchData()); 2653 | ``` 2654 | 2655 | #### Коли використовувати: 2656 | 2657 | - Для запитів до API. 2658 | - Для затримок або складної логіки перед оновленням store. 2659 | - Коли потрібно виконати кілька dispatch у рамках однієї дії. 2660 | 2661 | Якщо додаток має складну асинхронну логіку, краще розглянути **Redux Saga** або **RTK Query** як альтернативи. 2662 | 2663 |
    2664 | 2665 |
    2666 | 52. Як працює Redux Saga? 2667 | 2668 | #### React 2669 | 2670 | - **Redux Saga** — це middleware для Redux, яке використовує генератори (function\*) для керування асинхронними запитами в додатку. 2671 | 2672 | #### Як працює: 2673 | 2674 | 1. **Слухає екшени** (`takeEvery`, `takeLatest`) і реагує на них. 2675 | 2676 | 2. **Виконує побічні ефекти** (запити до API, таймери тощо). 2677 | 2678 | 3. **Диспатчить нові екшени** (`put`) у store. 2679 | 2680 | #### Приклад: 2681 | 2682 | 1. **Сага для отримання даних з API:** 2683 | 2684 | ```jsx 2685 | import { call, put, takeEvery } from "redux-saga/effects"; 2686 | 2687 | function* fetchData() { 2688 | try { 2689 | const response = yield call(fetch, "https://api.example.com/data"); 2690 | const data = yield response.json(); 2691 | yield put({ type: "FETCH_SUCCESS", payload: data }); 2692 | } catch (error) { 2693 | yield put({ type: "FETCH_ERROR", error }); 2694 | } 2695 | } 2696 | ``` 2697 | 2698 | 2. **Слухач екшенів:** 2699 | 2700 | ```jsx 2701 | function* watchFetchData() { 2702 | yield takeEvery("FETCH_REQUEST", fetchData); 2703 | } 2704 | ``` 2705 | 2706 | 3. **Запуск саги в `store`:** 2707 | 2708 | ```jsx 2709 | import createSagaMiddleware from "redux-saga"; 2710 | const sagaMiddleware = createSagaMiddleware(); 2711 | const store = createStore(reducer, applyMiddleware(sagaMiddleware)); 2712 | sagaMiddleware.run(watchFetchData); 2713 | ``` 2714 | 2715 | #### Переваги Redux Saga: 2716 | 2717 | ✅ Керує складною асинхронною логікою. 2718 | ✅ Вбудоване оброблення скасувань (`takeLatest`). 2719 | ✅ Потужні оператори (`call`, `put`, `select`, `delay`). 2720 | 2721 | - Redux Thunk простіший, але для складних сценаріїв **Saga краще підходить**. 2722 | 2723 |
    2724 | 2725 |
    2726 | 53. Що таке React Fiber? 2727 | 2728 | #### React 2729 | 2730 | - **React Fiber** — це нова архітектура рендерингу в React, представлена з версії 16. Вона була розроблена для покращення продуктивності, підтримки асинхронного рендерингу та забезпечення більш гнучкого управління оновленнями UI. 2731 | 2732 | #### Ключові особливості React Fiber: 2733 | 2734 | 1. **Покращена продуктивність:** 2735 | 2736 | - Fiber дозволяє React зберігати стан виконання рендеру, що дає можливість переривати і продовжувати рендеринг за потреби. Це важливо для великих додатків, де складні обчислення можуть уповільнювати рендеринг. 2737 | 2738 | 2. **Асинхронний рендеринг:** 2739 | 2740 | - React Fiber підтримує асинхронний рендеринг, що дозволяє виконувати рендеринг по частинах, покращуючи відгук додатку, особливо в складних інтерфейсах. Завдяки цьому можна виконувати рендеринг без блокування головного потоку. 2741 | 2742 | 3. **Пріоритет оновлень:** 2743 | 2744 | - Fiber дозволяє надавати пріоритет різним типам оновлень (наприклад, рендеринг анімацій може бути високим пріоритетом, а рендеринг змін стану — низьким). Це дозволяє React управляти складними оновленнями більш ефективно. 2745 | 2746 | 4. **Розбиття рендерингу на підзадачі:** 2747 | 2748 | - У старих версіях React всі зміни оброблялись в одному кроці. Fiber розбиває рендеринг на дрібніші підзадачі, що дозволяє React виконувати роботу поетапно і дає змогу обробляти інші важливі операції (наприклад, обробку подій) між етапами. 2749 | 2750 | 5. **Покращена підтримка анімацій та переходів:** 2751 | 2752 | - Завдяки асинхронному рендерингу, React може більш ефективно керувати анімаціями, що робить переходи між станами плавними та без затримок. 2753 | 2754 | #### Як працює React Fiber? 2755 | 2756 | - У старих версіях React весь процес рендерингу був синхронним: від початку до кінця. Це означало, що важкі обчислення блокували рендеринг інтерфейсу. У React Fiber рендеринг розділений на маленькі задачі, які можуть бути виконані асинхронно. Якщо необхідно, React може перервати одну задачу і продовжити виконання пізніше, не блокуючи інші операції (наприклад, оновлення UI або обробку подій). 2757 | 2758 | - **_Fiber дозволяє React:_** 2759 | 2760 | - Розподіляти виконання рендерингу для покращення продуктивності. 2761 | 2762 | - Реалізувати асинхронні оновлення UI. 2763 | 2764 | - Краще керувати пріоритетами та обробкою важких обчислень, що особливо важливо для складних інтерфейсів і додатків. 2765 | 2766 | #### Переваги: 2767 | 2768 | - Покращення відгуку додатків. 2769 | 2770 | - Можливість обробляти важкі операції без затримок для користувача. 2771 | 2772 | - Краще управління анімаціями та переходами. 2773 | 2774 | **_React Fiber_** — це внутрішнє оновлення, яке змінило спосіб, яким React працює з рендерингом, покращуючи загальну продуктивність додатків. 2775 | 2776 |
    2777 | 2778 |
    2779 | 54. Що таке Lifting State Up у React? 2780 | 2781 | #### React 2782 | 2783 | **Lifting State Up** — це підхід у React, коли стан (state) піднімається до найближчого спільного предка компонентів, яким потрібно спільно використовувати цей стан. Це дозволяє організувати єдине джерело правди для управління даними між компонентами. 2784 | 2785 | #### Основна ідея: 2786 | 2787 | 1. Компоненти, які мають спільно використовувати дані, не повинні кожен мати власний стан. 2788 | 2789 | 2. Стан піднімається до батьківського компонента, який передає дані через props дочірнім компонентам. 2790 | 2791 | #### Як це працює: 2792 | 2793 | 1. Батьківський компонент зберігає стан. 2794 | 2795 | 2. Він передає стан та функції для оновлення стану своїм дочірнім компонентам через props. 2796 | 2797 | 3. Дочірні компоненти повідомляють батька про зміни, використовуючи передані функції. 2798 | 2799 | #### Приклад: 2800 | 2801 | ```jsx 2802 | import React, { useState } from "react"; 2803 | 2804 | function TemperatureInput({ temperature, onTemperatureChange }) { 2805 | return ( 2806 |
    2807 | Enter temperature in Celsius: 2808 | onTemperatureChange(e.target.value)} 2812 | /> 2813 |
    2814 | ); 2815 | } 2816 | 2817 | function BoilingVerdict({ celsius }) { 2818 | return celsius >= 100 ? ( 2819 |

    The water will boil.

    2820 | ) : ( 2821 |

    The water won't boil.

    2822 | ); 2823 | } 2824 | 2825 | function Calculator() { 2826 | const [temperature, setTemperature] = useState(""); 2827 | 2828 | return ( 2829 |
    2830 | 2834 | 2835 |
    2836 | ); 2837 | } 2838 | 2839 | export default Calculator; 2840 | ``` 2841 | 2842 | #### Переваги: 2843 | 2844 | 1. Забезпечує єдине джерело правди для стану. 2845 | 2846 | 2. Полегшує синхронізацію даних між компонентами. 2847 | 2848 | 3. Робить компоненти більш передбачуваними та повторно використовуваними. 2849 | 2850 |
    2851 | 2852 | ### Форми в React 2853 | 2854 |
    2855 | 55. Що таке контрольовані компоненти (Controlled Components)? 2856 | 2857 | #### React 2858 | 2859 | #### Контрольовані компоненти (Controlled Components) в React 2860 | 2861 | - Контрольовані компоненти — це компоненти, в яких **React контролює стан форми** через `state`. Значення полів форми (наприклад, ``, `
    Row 1
    Row 2