Питання на співбесіді з React з відповідями
Компоненти, хуки, рендеринг, Context, lazy loading, Redux Toolkit і TanStack Query.
225 запитань для співбесіди з теми React з відповідями й поясненнями - рівні Junior, Middle і Senior. Приклади запитань, онлайн-тести й задачі на код.
- Hooks
- Context
- Redux Toolkit
- TanStack Query
- Lazy
Запитання за рівнями
Junior
Базові поняття та синтаксис · 50 запитань
Middle
Практика, нюанси й оптимізація · 50 запитань
Senior
Архітектура, внутрішня будова, edge cases · 50 запитань
Приклади запитань
Кілька запитань із кожного рівня з правильною відповіддю й поясненням.
React · Junior
- Що таке React?
Правильна відповідь: Бібліотека для побудови інтерфейсів із компонентів
React відповідає лише за UI: описує інтерфейс як функцію від стану й ефективно оновлює DOM. Роутинг, завантаження даних тощо додають бібліотеками (React Router, TanStack Query) або фреймворками поверх React (Next.js). JSX - це розширення синтаксису JavaScript, а не окрема мова.
- Що таке віртуальний DOM у React?
Правильна відповідь: JS-опис UI: React порівнює його з попереднім і змінює в DOM лише різницю
Під час рендеру компоненти повертають дерево React-елементів - звичайних JS-об'єктів. React порівнює нове дерево з попереднім (reconciliation) і вносить у справжній DOM мінімальні зміни. Це не браузерний API і не копія браузера.
- На що перетворюється JSX під час збирання?
Правильна відповідь: На виклики функцій, що створюють React-елементи (
jsx())<h1 className="t">Hi</h1>компілюється (Babel, SWC, TypeScript) у виклик на кшталтjsx("h1", { className: "t", children: "Hi" }), який повертає об'єкт-опис. Браузер JSX не розуміє, аinnerHTMLReact не використовує - тому рядки в JSX автоматично екрануються. - Як правильно задати CSS-клас елементу в JSX?
Правильна відповідь:
<div className="box">JSX ближчий до JavaScript, а
class- зарезервоване слово, тому атрибути називаються як DOM-властивості:className,htmlForзамістьfor,tabIndex,onClick. Атрибутиdata-*іaria-*пишуться як у HTML.
React · Middle
- Коли React зберігає стан компонента між рендерами?
Правильна відповідь: Доки той самий тип компонента стоїть на тій самій позиції
Стан прив'язаний до позиції в дереві UI, а не до змінної. Якщо на тому самому місці рендериться інший тип (
<input>замість<textarea>, інший компонент) - піддерево перестворюється, і стан втрачається. Тому не можна оголошувати компоненти всередині інших компонентів: кожен рендер створює новий тип. - Як скинути стан форми
<EditForm />під час перемикання на іншого користувача?Правильна відповідь: Передати
key={userId}- React перестворить компонентНовий
keyкаже React, що це інший компонент: старий розмонтується разом зі станом, і змонтується новий. Скидання через ефект працює, але спершу відмалює застарілі дані, а потім виправить їх - зайвий рендер і мерехтіння.forceUpdateє лише в класів і стан не скидає. - Що робить
React.memo(Component)?Правильна відповідь: Пропускає рендер, якщо props поверхнево рівні попереднім
memoпорівнює кожен prop черезObject.is. Якщо всі рівні - використовується попередній результат рендеру. Зміни власного стану й контексту однаково спричиняють рендер. Другим аргументом можна передати власну функцію порівняння. - Чому
memoне допомагає компоненту<List items={data} onSelect={() => select(id)} style={{ gap: 8 }} />?Правильна відповідь: Колбек і об'єкт стилю створюються заново за кожного рендеру
Інлайн-функція й об'єктний літерал - нові посилання на кожному рендері, і поверхневе порівняння їх не пропустить. Їх стабілізують через
useCallback/useMemoабо виносять константи за межі компонента. React Compiler робить це автоматично.
React · Senior
- Чим
cache()з React корисний у Server Components?Правильна відповідь: Дедуплікує виклики функції з тими самими аргументами в межах одного запиту
const getUser = cache(async (id) => db.user.find(id))- кілька компонентів в одному серверному рендері можуть викликатиgetUser(1), а запит до БД виконається один раз. Кеш живе лише в межах запиту, тому дані різних користувачів не змішуються. Міжзапитне кешування в Next.js робиться через'use cache'. - Що таке Fiber у React?
Правильна відповідь: Архітектура реконсилера: рендер розбито на одиниці роботи, які можна переривати
Fiber (React 16+) подає кожен вузол дерева як об'єкт-«волокно» з інформацією про роботу. Це дає змогу призупиняти, переривати й пріоритизувати рендер, перевикористовувати роботу - основа concurrent-можливостей (transitions, Suspense). Раніше стековий реконсилер обходив дерево рекурсивно й без зупинок.
- Чим фаза рендеру відрізняється від фази коміту?
Правильна відповідь: Рендер переривний і може повторюватися; коміт синхронно застосовує зміни до DOM
У фазі рендеру React викликає компоненти й обчислює різницю - її можна перервати, відкинути й почати знову, тому рендер мусить бути чистим. У фазі коміту зміни застосовуються до DOM цілком і без переривань, потім викликаються layout-ефекти, а після відмальовування - звичайні ефекти.
- Що дає concurrent-рендеринг користувачеві?
Правильна відповідь: Термінові оновлення (введення) можуть перервати важкий нетерміновий рендер
Concurrent - це не багатопотоковість: JS і далі виконується в одному потоці. React уміє готувати кілька версій UI, поступатися керуванням браузеру й переривати менш пріоритетну роботу (transitions) заради термінової. Вмикається під час використання
startTransition,useDeferredValueі Suspense.
Збірні тести з цією темою
Запитання з кількох тем одразу - як на співбесіді на конкретну вакансію.
Задачі на код
Напишіть рішення просто в браузері - тести перевірять його одразу. Класика співбесід: debounce, throttle, deepClone, Promise.all, EventEmitter, LRU-кеш та інші.
Відкрити задачі →