React

100 питань

Що таке React і які проблеми він вирішує?

React — бібліотека для UI.
Вирішує проблему декларативного опису інтерфейсу.
UI = функція від стану.
Спрощує композицію компонентів.
Добре працює з екосистемою (Router, стан, збірка).

Чим React відрізняється від фреймворка?

React — тільки шар UI.
Роутинг/дані/архітектура вибираються окремо.
Framework (Next/Remix) задає більше правил.
React гнучкіший, але вимагає рішень.
На великих проектах частіше беруть фреймворк.

Що таке JSX і як він працює?

JSX — синтаксис, схожий на HTML у JS.
Компілюється у виклики React.createElement.
Всередині можна писати вирази {expr}.
Атрибути — props.
Обов’язково один кореневий елемент (або Fragment).

Навіщо потрібен ключ key у списках?

key допомагає React зіставляти елементи між рендерами.
Прискорює diff і зменшує баги.
key має бути стабільним, не індексом (якщо список змінюється).
Краще використовувати id з даних.
Неправильний key призводить до 'стрибаючого' стану.

Що таке компонент і які види компонентів бувають?

Компонент — функція/клас, що повертає UI.
Функціональні компоненти — стандарт сьогодні.
Класові зустрічаються в legacy.
Компоненти бувають 'контейнери' і 'презентаційні'.
Композиція важливіша за наслідування.

Що таке props і як їх правильно використовувати?

props — вхідні дані компонента.
props незмінні (read-only).
Для зміни поведінки передавай колбэки.
Зроби props мінімальними і зрозумілими.
Використовуй default значення через параметри функції.

Що таке state і коли він потрібен?

state — внутрішній стан компонента.
Використовуй для даних, що змінюються з часом.
Тримай state якомога ближче до місця використання.
Не дублюй обчислювані дані в state.
Для спільного стану — піднімай вгору або використовуй store.

Як працює useState і чому setState асинхронний?

useState повертає значення і сеттер.
setState планує оновлення і повторний рендер.
Оновлення можуть батчитися.
Для залежності від попереднього значення використовуй функцію: setX(prev => ...).
Не розраховуй на миттєву зміну після setState.

Як оновлювати об'єкти і масиви в state без мутацій?

Не мутуй state напряму.
Об'єкт: setS(prev => ({ ...prev, a: 1 })).
Масив: setA(prev => [...prev, item]).
Для видалення: filter.
Для складних структур можна використовувати immer.

Що таке derived state і чому він шкідливий?

Derived state — коли state дублює обчислюване значення.
Це призводить до розсинхронізації.
Краще обчислювати через useMemo або прямо у рендері.
Тримай джерело істини один раз.
Виняток — коли потрібно 'зафіксувати' значення у часі.

Що таке lifting state up і коли його робити?

Це перенесення state у спільного батька.
Потрібно, коли кільком компонентам потрібен один джерело істини.
Батько тримає state і передає props вниз.
Дочірні викликають колбэки для змін.
Альтернатива — context/store, якщо дерево велике.

Як працює useEffect і для чого він потрібен?

useEffect виконує side effects після рендеру.
Підходить для підписок, запитів, роботи з DOM.
Залежності задаються масивом deps.
Повернення функції — cleanup.
Не використовуйте useEffect для обчислення derived state.

Як правильно задавати залежності useEffect?

Вказуй усі значення, що використовуються всередині ефекту.
Не відключай eslint правило без причини.
Для функцій використовуй useCallback.
Для об'єктів — useMemo.
Якщо ефект занадто 'шумний' — переглянь архітектуру.

Чим відрізняється useEffect від useLayoutEffect?

useEffect запускається після відрисовки браузером.
useLayoutEffect — синхронно після мутацій DOM, до фарбування.
useLayoutEffect може блокувати рендер.
Використовуй його для вимірювань/мигання UI.
У більшості випадків достатньо useEffect.

Чому не можна викликати хуки умовно?

React покладається на порядок виклику хуків.
Умовний виклик порушує порядок.
Це призводить до багів і неправильного стану.
Правило: хуки тільки на верхньому рівні компонента.
Винось умову всередину хука/ефекту.

Що таке useMemo і коли він корисний?

useMemo кешує результат обчислення.
Потрібен для дорогих обчислень або стабільних посилань.
Не замінює оптимізацію рендерингу скрізь.
Слідкуй за deps, інакше буде застарілим.
Часто корисний перед передачею в memo/ефекти.

Що таке useCallback і чим він відрізняється від useMemo?

useCallback кешує функцію.
useMemo кешує значення.
useCallback(fn, deps) ~= useMemo(() => fn, deps).
Корисно для передачі колбеків у memo-компоненти.
Не застосовуй без потреби: це теж накладні витрати.

Коли memo дійсно допомагає, а коли ні?

memo корисний, якщо компонент часто ререндериться з тими ж props.
Якщо props змінюються завжди (нові об'єкти) — користі мало.
Оптимізація вимагає вимірювань (профілюй).
memo збільшує складність.
Спершу оптимізуй архітектуру і стан.

Що таке React.memo і як він працює?

Обгортає компонент і пропускає ререндер, якщо props не змінилися (shallow).
Порівняння поверхневе.
Можна передати кастомну функцію порівняння.
Стабілізуй props (useMemo/useCallback).
Не забувай про контекст: він все одно викличе ререндер.

Чому небезпечно оптимізувати React 'на око'?

Часто проблема не там, де здається.
useMemo/useCallback можуть погіршити.
Потрібен профайлер React DevTools.
Вимірюй до/після.
Оптимізація має бути обґрунтованою.

Що таке reconciliation (узгодження) в React?

Це алгоритм порівняння старого і нового дерева.
React намагається мінімізувати зміни DOM.
key у списках впливає на reconciliation.
Зміна типу компонента => демонтаж/монтування.
Структура дерева важлива для продуктивності.

Що таке virtual DOM і чому це не 'магія'?

Virtual DOM — об'єктне представлення UI.
React порівнює дерева і застосовує патчі.
Перемога не в швидкості, а в зручності декларативного UI.
Реальна вартість — рендер і порівняння.
Правильне управління станом важливіше.

Чому компонент ререндериться і як це зрозуміти?

Ререндер через зміну state/props/context.
Батьківський ререндер не завжди = оновлення DOM.
Використовуй React DevTools Profiler.
Для відлагодження можна тимчасово додати лог.
Перевіряй стабільність props і селектори стану.

Що таке controlled components (контрольовані форми)?

Поле вводу керується станом.
value і onChange зв'язують UI і дані.
Дає валідацію і контроль.
Може бути повільніше на великих формах.
Альтернатива — uncontrolled + refs/форми і бібліотеки.

Як зробити uncontrolled input і коли це виправдано?

Використовуй defaultValue замість value.
Читай значення через ref при submit.
Підходить для великих форм, де важлива продуктивність.
Валідацію роби на submit/blur.
React Hook Form часто використовує цей підхід.

Як правильно обробляти події в React?

Події — SyntheticEvent (у більшості випадків).
Використовуй onClick/onChange і т.п.
Не викликай обробник одразу: onClick={() => ...}.
Для продуктивності винеси обробник у функцію.
Пам’ятай про вспливання і stopPropagation.

Чим SyntheticEvent відрізняється від нативних подій?

Це обгортка над нативною подією.
Забезпечує єдине API у різних браузерах.
У старих версіях був pooling, зараз менше проблем.
event.nativeEvent дає нативну подію.
Зазвичай достатньо SyntheticEvent.

Як правильно працювати з refs і коли вони потрібні?

refs дають доступ до DOM/інстансу.
Потрібні для фокусу, вимірів, інтеграції з бібліотеками.
Не використовуй refs для даних замість state.
useRef зберігає mutable значення без рендеру.
Для прокидання ref використовуй forwardRef.

Що таке forwardRef і коли він потрібен?

forwardRef дозволяє передати ref всередину компонента.
Потрібен для компонентних бібліотек.
Спрощує фокусування і інтеграції.
Намагайся не протікати DOM-деталями без потреби.
Типізуй ref у TS явно.

Що таке useImperativeHandle і чи варто його використовувати?

Дозволяє кастомізувати API ref.
Корисно для контролів (focus, reset).
Це імперативний шлях, використовуй рідко.
Надавай перевагу декларативним props.
Якщо використовуєш — документуй методи.

Що таке Context API і які у нього обмеження?

Context передає дані крізь дерево без props.
Добре для теми, локалі, auth.
Часті зміни context можуть ререндерити багато компонентів.
Використовуй розділення контекстів і memo.
Для складних кейсів краще store з селекторами.

Як уникнути зайвих ререндерів через Context?

Робіть кілька контекстів замість одного великого.
Передавайте примітиви або мемоізовані об’єкти.
Обгорніть провайдери ближче до споживачів.
Винось логіку у store/селекції.
Перевіряй профайлером.

Що таке custom hooks і навіщо вони потрібні?

Це функції, які використовують хуки і переиспользують логіку.
Спрощують композицію поведінки.
Роблять компоненти тонкими.
Назва має починатися з use.
Внутрішньо дотримуйся правил хуків.

Як проектувати custom hooks, щоб вони були переиспользовуваними?

Тримай API мінімальним: входи і виходи.
Не прив’язуй хук до конкретного UI.
Повертай дані і колбеки.
Не приховуй побічні ефекти.
Документуй очікування і edge cases.

Що таке React Router і які є альтернативи?

React Router — популярний роутер для SPA.
Альтернатива: Next.js routing, Remix routing.
Для мобільних: React Navigation.
Вибір залежить від SSR/SPA та вимог.
У великих проектах важливі data APIs та loaders.

Що таке SSR, CSR і SSG (у контексті React)?

CSR — рендеринг у браузері.
SSR — HTML рендериться на сервері.
SSG — HTML генерується на етапі збірки.
SSR покращує SEO і FCP, але складніше.
SSG хороший для контенту, але вимагає регенерації даних.

Що таке hydration і які проблеми виникають?

Hydration — 'оживлення' SSR HTML у браузері.
React порівнює розмітку і навішує обробники.
Несумісність даних => hydration mismatch.
Уникай випадкових значень при першому рендері (Date.now).
Розділяй server/client компоненти (у Next).

Чому виникає hydration mismatch і як його виправити?

Різний HTML на сервері і клієнті.
Причини: час, випадкові значення, доступ до window, умовні гілки.
Використовуй client-only рендер через useEffect або dynamic import.
Тримай дані послідовними (prefetch).
Перевіряй оточення (typeof window).

Як безпечно використовувати window/document у React?

У SSR window недоступний.
Доступ через useEffect або перевіряй typeof window !== 'undefined'.
Для розмірів вікна використовуй підписки і cleanup.
Для cookies/localStorage враховуй SSR.
У Next 13+ використовуй client components.

Як працювати з data fetching у React?

Базово: fetch у effect + state.
Важливо: скасування запитів (AbortController).
Обробка loading/error.
Для кешу/рефетчу краще TanStack Query.
У SSR фреймворках використовуй серверні loaders.

Як правильно обробляти стан loading/error/empty?

Показуй skeleton/spinner для loading.
Для error — зрозуміле повідомлення + retry.
Для empty — окремий UI і CTA.
Не змішуй логіку отримання даних і відображення.
Тримай стан явним (discriminated union).

Як скасовувати запити і уникати race conditions?

Використовуй AbortController і signal у fetch.
У cleanup ефекту викликай abort.
Зберігай requestId і ігноруй застарілі відповіді.
Використовуй бібліотеки з дедуплікацією запитів.
Не викликай setState після unmount.

Що таке Suspense і для чого він використовується?

Suspense дозволяє показувати fallback, поки ресурс не готовий.
В основному використовується для lazy і даних у фреймворках.
Suspense boundary локалізує завантаження.
Не замінює обробку помилок — потрібен Error Boundary.
В екосистемі data fetching підтримка залежить від стеку.

Як працює React.lazy і code splitting?

React.lazy завантажує компонент динамічно.
Використовуй разом із <Suspense fallback>.
Розділяй за роутами/важкими віджетами.
Не дроби занадто дрібно — багато чанків шкідливо.
У збірнику увімкни аналіз (bundle analyzer).

Що таке Error Boundary і навіщо він потрібен?

Виявляє помилки під час рендерингу/життєвого циклу.
Не ловить помилки в async/handlers.
Показує fallback UI.
Реалізується через класовий компонент або бібліотеку.
Додай логування (Sentry) у componentDidCatch.

Як робити форми та валідацію у React?

Маленькі форми можна на useState.
Великі — краще React Hook Form.
Валідацію роби схемою (zod/yup).
Для UX: validate onBlur або debounce.
Показуй помилки поруч із полем і в цілому.

Що таке React Hook Form і чому його люблять?

Він мінімізує перерендери.
Використовує uncontrolled inputs за замовчуванням.
Зручна інтеграція зі схемами.
Добре масштабується на великі форми.
Менше boilerplate, ніж ручні рішення.

Як зробити debounce для пошуку/інпута?

Використовуй setTimeout/clearTimeout у useEffect.
Або бібліотеку lodash.debounce.
Зберігай сире значення окремо від застосованого.
Враховуй скасування запитів.
Не забудь cleanup.

Як керувати фокусом і доступністю (a11y) у React?

Використовуй семантичні елементи (button, label).
Керуй фокусом через ref.
У модалках роби focus trap.
Додавай aria-* тільки коли потрібно.
Тестуй клавіатурою і скрінрідером.

Як правильно реалізувати модальне вікно?

Рендери через portal (в кінець body).
Закриття по Esc і по кліку на overlay.
Блокує прокрутку підложки.
Тримай focus trap і повертає фокус.
Обробляй accessibility (role='dialog').

Що таке Portal і коли він потрібен?

Portal рендерить дітей у інший DOM-елемент.
Потрібен для модалок, тултіпів, випадаючих меню.
Уникає проблем з overflow/z-index.
Події все одно спливають по React-дереву.
Слідкуй за доступністю.

Як працює batch updates у React?

React може об’єднувати кілька setState у один рендер.
Це зменшує перерисовки.
У React 18 батчинг працює і в async контекстах.
Не покладайся на порядок сеттерів без функціональної форми.
Для синхронного читання використовуй useEffect після рендеру.

Що таке concurrent rendering у React 18?

Це можливість переривати і продовжувати рендер.
Покращує відгук UI.
Не означає автоматичне прискорення.
Потрібні правильні пріоритети (transitions).
При несумісних бібліотеках можливі баги.

Що таке useTransition і коли він корисний?

Дозволяє позначити оновлення як низькоприоритетні.
UI залишається відгукливим при важких оновленнях.
Повертає isPending для стану UI.
Корисно для фільтрів/переключень списку.
Не замінює оптимізацію даних.

Що таке useDeferredValue і чим він відрізняється від debounce?

Це відкладене значення для низького пріоритету.
Не затримує події, а дозволяє намалювати пізніше.
Добре для пошуку по великому списку.
Debounce затримує виклик, а deferred — пріоритет рендерингу.
Комбінуй усвідомлено.

Як правильно писати ключі та ідентифікатори для компонентів?

key потрібен лише для списків.
Використовуй стабільний id з даних.
Не використовуй random/Date.now для key.
Не використовуй індекс, якщо елементи можуть переставлятися/видалятися.
Поганий key зламує збереження локального стану.

Як працювати з підняттям обробників подій?

Обробник зберігається вище, де є state.
Дочірній компонент викликає props.onAction(data).
Це спрощує тестування.
Не передавай занадто багато колбеків — групуй actions.
Для складних сценаріїв використовуйте reducer.

Що таке useReducer і коли його обирати замість useState?

useReducer зручний для складного стану.
Коли є багато дій і переходів.
Спрощує тестування (reducer як чиста функція).
Добре поєднується з discriminated unions.
Можна використовувати для форм і комплексних UI.

Як проектувати reducer: дії та типи?

Дії як union: { type: 'add', payload: ... } | ....
Робіть exhaustive check у switch.
Тримайте reducer чистим без side effects.
Side effects винесіть у ефекти або middleware (у store).
Пишіть тести на кожну дію.

Як уникнути prop drilling?

Піднімайте компоненти ближче один до одного.
Використовуйте composition (children) і render props.
Використовуйте Context для дійсно глобального.
Використовуйте store для складного спільного стану.
Не перетворюйте Context у смітник.

Що таке children і як використовувати композицію?

children — це вкладений контент компонента.
Дозволяє створювати композицію (Layout, Card).
Робить API гнучким.
Можна комбінувати з render props.
Уникайте занадто складних абстракцій.

Що таке render props і коли це корисно?

Це патерн: пропс — функція, що повертає UI.
Дозволяє ділитися логікою.
Зараз частіше замінюється хуками.
Корисно для компонентів-бібліотек.
Слідкуйте за продуктивністю (нова функція кожен рендер).

Що таке compound components і де вони застосовуються?

Це набір зв’язаних компонентів (Tabs, Menu).
Загальний стан зберігається у батьківському компоненті.
Дочірні читають стан через context.
Дає зручний API і композицію.
Вимагає уважної типізації і документації.

Як типізувати props у React + TypeScript?

Опишіть type/interface Props.
function C(props: Props) {}.
Для children: React.ReactNode.
Для onClick: (e: React.MouseEvent) => void.
Не зловживайте React.FC, якщо не потрібно.

Як типізувати компоненти, які приймають компонент/іконку?

Принимайте React.ComponentType<Props>.
Для иконок часто: React.ComponentType<React.SVGProps<SVGSVGElement>>.
Или конкретный тип библиотеки (LucideIcon).
Держите пропсы минимальными.
Не используйте any для компонентов.

Як тестувати React компоненти?

Основний підхід: React Testing Library.
Тестуйте поведінку, а не деталі реалізації.
Використовуйте user-event для реальних сценаріїв.
Мокуйте мережу та зовнішні залежності.
E2E (Playwright/Cypress) для ключових потоків.

Що тестувати: юніт, інтеграцію чи e2e?

Юніт — чисті функції/редьюсери.
Інтеграція — компоненти з взаємодією.
E2E — критичні сценарії користувача.
Не намагайтеся покрити все e2e.
Баланс залежить від ризику та вартості тестів.

Як мокати fetch/HTTP запити у тестах?

Для fetch можна використовувати MSW.
MSW мокає на рівні мережі (реалістично).
Для юніт-тестів можна мокати клієнт (axios).
Стежте за скиданням моків між тестами.
Перевіряйте стан loading/error.

Що таке StrictMode і чому ефекти можуть викликатися двічі у dev?

StrictMode включає додаткові перевірки у dev.
Може подвійно запускати ефекти для пошуку помилок.
У production цього немає.
Пишіть ефекти ідемпотентними і з cleanup.
Не використовуйте StrictMode як баг у продакшені.

Як правильно логувати та відлагоджувати React?

Використовуйте React DevTools.
Profiler для продуктивності.
Встановлюйте брейкпоінти в обробниках та ефектах.
Для складних багів — мінімальний репродьюс.
Не залишайте console.log у продакшені.

Як працювати з станом URL (query params) у React?

URL — теж стан додатку.
Синхронізуйте фільтри/пагінацію з query.
Використовуйте API роутера (React Router/Next).
Обробляйте відсутність параметрів дефолтами.
Не виконуйте setState у useEffect без потреби.

Як зберігати авторизацію (tokens) у React додатку?

Не зберігайте токени у localStorage, якщо високий ризик XSS.
Віддавайте перевагу httpOnly cookies (якщо можливо).
Розділяйте стан авторизації та профіль користувача.
Додавайте refresh токени згідно з протоколом бекенду.
Логуйте вихід та обробку 401/403.

Як захиститися від XSS у React?

React екранує рядки за замовчуванням.
Опасно використовувати dangerouslySetInnerHTML.
Санітизуйте HTML через DOMPurify.
Не вставляйте сирий користувацький ввід у HTML.
CSP та безпечні заголовки також важливі.

Коли використовувати dangerouslySetInnerHTML і як робити це безпечніше?

Використовуйте тільки якщо потрібно рендерити HTML (markdown).
Санітизуйте контент.
Обмежте підтримувані теги.
Уникайте inline скриптів та обробників подій.
Думайте про CSP.

Як правильно працювати зі стилями у React?

Варіанти: CSS Modules, Tailwind, styled-components, простий CSS.
Обирай за командою і проектом.
Тримай стилі поруч із компонентом, але не змішуй логіку.
Слідкуй за специфікою і переозначеннями.
Для дизайн-системи зручно мати компоненти і токени.

Як організувати папки і архітектуру React-проекту?

Орієнтована на фічі структура зазвичай краще.
Розділяй UI, hooks, services, types.
Тримай бізнес-логіку поза компонентами.
Уникай дуже великих компонентів.
Встановлюй правила імпорту і межі модулів.

Що таке container/presentational pattern і чи актуальний він?

Container відповідає за дані і логіку, presentational — за UI.
Допомагає розділяти відповідальність.
Зараз часто реалізується через hooks.
Корисний у великих командах.
Не роби жорстку структуру, якщо проект маленький.

Як уникнути витоків пам’яті у React?

Очищай підписки в cleanup ефекту.
Скасовуй запити при unmount.
Не зберігай великі об’єкти у глобальному стані без потреби.
Слідкуй за listeners на window/document.
Використовуй профілювання і DevTools.

Чому не можна викликати setState після unmount і як цього уникнути?

Компонент вже демонтований, оновлення не потрібно.
Це викликає попередження і потенційні витоки.
Скасовуй async операції в cleanup.
Використовуй AbortController або ігноруй застарілі відповіді.
Бібліотеки даних вирішують це автоматично.

Як правильно працювати з таймерами setTimeout/setInterval?

Встановлюй таймер у useEffect.
Очищай його в cleanup (clearTimeout/clearInterval).
Для interval враховуй stale closures (useRef).
Не створюй таймер на кожен рендер.
Для складної логіки зроби custom hook.

Що таке stale closures у хуках і як їх уникнути?

Замикання може утримувати старі значення.
Часто зустрічається у setInterval/handlers.
Додавай залежності або використовуй функціональний setState.
Зберігай актуальне значення у useRef.
Не ігноруй deps ради тиші лінтера.

Чому setState у циклі/кілька разів підряд може вести себе несподівано?

Оновлення батчаться.
Значення може бути застарілим.
Використовуй функціональні оновлення.
Для послідовних змін об’єднуй у один setState.
Для складних сценаріїв краще reducer.

Як правильно передавати функції вниз по дереву?

Стабілізуй колбэки через useCallback, якщо це важливо.
Не зловживай useCallback без профілю.
Групуй колбэки в об’єкт actions (мемоізований).
Використовуй context/store для глобальних дій.
Слідкуй за тим, щоб UI-компоненти залишалися простими.

Що таке dependency inversion у React UI?

Компонент залежить від абстракції (props), а не від сервісу напряму.
Передавай функції завантаження/збереження як залежності.
Спрощує тестування.
Спрощує заміну реалізації API.
Особливо корисно у великих проектах.

Коли використовувати глобальний менеджер стану (Redux/Zustand/Jotai)?

Коли багато екранів використовують одні дані.
Коли потрібне кешування, селектори, devtools.
Коли prop drilling стає проблемою.
Не використовуйте store для локального UI стану.
Оцініть вартість впровадження та навчання команди.

Redux vs Zustand: що обрати?

Redux хороший для великих команд і строгих патернів.
Redux Toolkit зменшує boilerplate.
Zustand простіше і менше коду.
Zustand добре підходить для UI та невеликих сторов.
Вибір залежить від вимог до middleware/екосистеми.

Що таке selector і чому він важливий для продуктивності?

Selector вибирає частину стану.
Зменшує перерендери, якщо компонент підписаний лише на потрібне.
В Redux — reselect/memoized selectors.
В Zustand — selector у useStore.
Селектори допомагають тримати компонент вузьким.

Як уникнути перерисовок великого списку (1000+ елементів)?

Використовуй віртуалізацію (react-window/react-virtual).
Тримай елементи простими.
Стабілізуй key.
Не роби важкі обчислення у рендері.
Розділяй список на мемоізовані елементи.

Що таке virtualization і як вона працює?

Рендериться лише видима частина списку.
Інші елементи замінюються порожнім простором.
Значно знижує навантаження на DOM.
Вимагає фіксованих/вимірюваних розмірів елементів.
Добре для таблиць і логів.

Як оптимізувати рендер таблиць у React?

Віртуалізація рядків/стовпців.
Мемоізація клітинок і стовпців.
Стабільні колбеки і дані.
Розділяй стан сортування/фільтрації.
Розглянь готові бібліотеки (TanStack Table).

Як правильно обробляти помилки в асинхронних обробниках?

try/catch всередині async handler.
Показуй дружнє повідомлення користувачу.
Логуй деталі у моніторинг.
Не залишай помилки мовчазними.
Для запитів використовуй централізований клієнт.

Що таке react-query (TanStack Query) і коли він потрібен?

Керує серверним станом: кеш, рефетч, дедуп.
Спрощує loading/error.
Має invalidation і optimistic updates.
Позбавляє від багато ручного коду.
Не замінює клієнтський стан для UI.

Що таке optimistic update і які ризики?

UI оновлюється до відповіді сервера.
Покращує UX.
Потрібно вміти відкочувати при помилці.
Слідкуй за конкуренційними запитами.
Бібліотеки даних допомагають реалізувати правильно.

Як реалізувати пагінацію та infinite scroll?

Пагінація: page/pageSize у URL і запитах.
Infinite scroll: підвантаження по scroll/IntersectionObserver.
Слідкуй за повторними запитами і дедупом.
Показуй loader і кінець списку.
Віртуалізація часто потрібна разом із infinite.

Як використовувати IntersectionObserver у React?

Створіть ref на елемент sentinel.
У effect створіть observer і підпишіться.
У callback тригерте завантаження наступної сторінки.
Не забудьте cleanup: disconnect.
Враховуйте залежності та застарілі closures.

Як правильно працювати з локалізацією (i18n) у React?

Використовуйте бібліотеку (react-i18next).
Зберігайте ключі, а не рядки у коді.
Стежте за форматуванням дат/чисел (Intl).
Не склеюйте рядки вручну.
Плануйте правила множинності та контекст.

Як зробити темізацію (dark/light) у React?

Зберігайте тему у context/store.
Зберігайте вибір у localStorage/cookie.
Враховуйте prefers-color-scheme.
Для CSS використовуйте змінні або Tailwind.
Не ламайте SSR: початкова тема має бути узгодженою.

Як впровадити моніторинг помилок і продуктивності?

Підключіть Sentry або аналог.
Логуйте помилки з Error Boundary.
Додайте трасування продуктивності.
Позначайте релізи та sourcemaps.
Не надсилайте PII без необхідності.

Які типові помилки новачків у React?

Мутувати state.
Створювати derived state і синхронізувати через useEffect.
Забувати key і deps.
Зберігати занадто багато у глобальному стані.
Оптимізувати без вимірювань.

Практичні правила для підтримуваного React-коду?

Тримай компоненти маленькими і відповідальними за одне.
Стан тримай близько до місця використання.
Розділяй server-state і UI-state.
Пиши тести на критичні сценарії.
Оптимізуй за профілем, а не за відчуттями.