Вопросы на собеседовании: React-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior.
Смотреть пример резюме: React-разработчик →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
React представляет собой JavaScript-библиотеку для создания пользовательских интерфейсов из переиспользуемых компонентов.
- Разработчик описывает вид интерфейса для текущих данных вместо ручного изменения DOM-узлов.
- Компоненты делят интерфейс на самостоятельные части со своими входными данными и поведением.
- React обновляет DOM браузера при изменении данных компонентов.
Зачем это спрашивают: Интервьюер проверяет понимание React как декларативной UI-библиотеки, а не полноценного фреймворка приложения.
React-компонент представляет собой переиспользуемую единицу, которая возвращает описание интерфейса для React.
- Компонент может получать пропсы от родителя.
- Он может хранить локальное состояние, если его результат должен меняться со временем.
- Компоненты могут рендерить браузерные элементы и другие компоненты.
Зачем это спрашивают: Сильный ответ описывает компонент через его роль, входные данные, локальное состояние и способность составлять интерфейс из других частей.
Функциональный компонент является JavaScript-функцией, которую React вызывает для вычисления части интерфейса.
- Её параметры обычно содержат пропсы, переданные родителем.
- Она обычно возвращает JSX, React-элемент или null.
- Хуки позволяют функциональным компонентам использовать состояние и поведение, связанное с жизненным циклом.
Зачем это спрашивают: Интервьюер оценивает, связывает ли кандидат форму обычной функции с рендерингом React и хуками.
Тег JSX с заглавной буквы сообщает React, что он ссылается на пользовательский компонент.
- Теги в нижнем регистре, например div и button, считаются встроенными браузерными элементами.
- Имя с заглавной буквы, например Profile, разрешается как JavaScript-переменная в текущей области видимости.
- Из-за имени компонента в нижнем регистре React может принять его за неизвестный HTML-тег.
Зачем это спрашивают: Вопрос проверяет понимание того, как JSX отличает пользовательские компоненты от DOM-элементов.
JSX является расширением синтаксиса, которое позволяет описывать дерево React-элементов в JavaScript с помощью разметки, похожей на HTML.
- Перед выполнением JSX преобразуется в вызовы JavaScript или равнозначные инструкции среды выполнения.
- Он может представлять как браузерные элементы, так и пользовательские React-компоненты.
- JSX необязателен, но упрощает чтение и написание вложенных структур интерфейса.
Зачем это спрашивают: Интервьюер проверяет, не принимает ли кандидат JSX за HTML или за код, который браузер выполняет напрямую.
JavaScript-выражения помещают в фигурные скобки внутри JSX.
- Выражения могут задавать текст, значения пропсов, атрибуты или дочерние элементы.
- Внутри скобок значение могут создавать вызовы, обращения к свойствам, вычисления и условные выражения.
- Инструкции if, for и объявления переменных нужно выполнять вне JSX или выражать другим способом.
Зачем это спрашивают: Сильный ответ отличает выражения, создающие значение, от инструкций, которые нельзя напрямую вставить в JSX.
Для некоторых браузерных атрибутов JSX использует имена свойств в стиле JavaScript.
- Вместо class используется className, потому что class является ключевым словом JavaScript.
- Большинство составных DOM-свойств записываются в camelCase, например tabIndex и onClick.
- Строковые литералы можно передавать в кавычках, а JavaScript-значения помещают в фигурные скобки.
Зачем это спрашивают: Интервьюер проверяет базовый синтаксис JSX и умение передавать типизированные JavaScript-значения, а не только строки.
Компонент возвращает одно значение с деревом элементов, а Fragment группирует несколько соседних элементов без добавления DOM-узла.
- Обёртка вроде div тоже создаёт один корень, но меняет итоговую разметку.
- Краткий синтаксис Fragment записывается как пустые открывающий и закрывающий теги.
- Явной форме Fragment можно передать key при использовании в списке.
Зачем это спрашивают: Сильный ответ объясняет и единое возвращаемое значение, и преимущество Fragment перед лишней обёрткой.
Компонентом называют функцию или класс, а React-элемент описывает то, что должно появиться в интерфейсе.
- JSX вида <Button /> создаёт элемент, который ссылается на компонент Button.
- React вызывает компонент, чтобы получить возвращаемые им элементы.
- Элементы служат неизменяемыми описаниями, а компоненты содержат логику их создания.
Зачем это спрашивают: Интервьюер ждёт разделения переиспользуемого создателя интерфейса и создаваемого им описания элемента.
Чистый компонент создаёт одинаковый JSX при одинаковых пропсах и состоянии и не изменяет внешние значения во время рендеринга.
- Рендеринг должен вычислять интерфейс, а не выполнять побочные эффекты.
- Компонент не должен изменять пропсы или состояние во время рендеринга.
- Работу, вызванную взаимодействием или синхронизацией, размещают в обработчиках событий и эффектах.
Зачем это спрашивают: Интервьюер проверяет понимание правила предсказуемого рендеринга React-компонентов.
Пропсы являются входными данными, которые родительский компонент передаёт дочернему.
- Они могут содержать строки, числа, объекты, функции или React-элементы.
- Дочерний компонент читает пропсы, чтобы настроить свой вид или поведение.
- Данные обычно передаются вниз по дереву компонентов через пропсы.
Зачем это спрашивают: Сильный ответ представляет пропсы как общие входные данные компонента, а не только подобие HTML-атрибутов.
Компонент должен считать пропсы доступными только для чтения, потому что их значениями владеет родитель.
- Изменение пропса может поменять общие данные без явного запроса на обновление для React.
- Если дочернему компоненту нужно изменение, он должен вызвать переданный колбэк.
- Вместо изменения полученных через пропсы объектов или массивов нужно создавать новые значения.
Зачем это спрашивают: Интервьюер оценивает соблюдение однонаправленного потока данных и отсутствие скрытых мутаций.
Функциональный компонент может деструктурировать именованные пропсы в списке параметров и там же задать значения по умолчанию.
- Деструктуризация даёт прямые локальные имена вместо повторных обращений к объекту props.
- Значение параметра по умолчанию используется, когда пропс равен undefined.
- Переданное значение null не включает значение по умолчанию, предназначенное только для undefined.
Зачем это спрашивают: Вопрос проверяет практическое знание JavaScript применительно к понятным интерфейсам React-компонентов.
Пропс children содержит контент, размещённый между открывающим и закрывающим JSX-тегами компонента.
- Дочерним контентом могут быть текст, элементы, компоненты, выражения или несколько значений.
- Компоненты-обёртки могут рендерить children внутри общего макета или оформления.
- Родитель управляет вложенным контентом, а обёртка определяет место его вывода.
Зачем это спрашивают: Интервьюер проверяет понимание стандартного механизма вложенного контента компонентов в React.
Композиция компонентов создаёт крупные интерфейсы путём вложения и объединения небольших компонентов.
- Родители могут настраивать дочерние компоненты через пропсы.
- Компоненты-обёртки могут принимать произвольный контент через children.
- Композиция сохраняет узкую задачу каждого компонента и позволяет использовать одни части на разных экранах.
Зачем это спрашивают: Сильный ответ объясняет переиспользование через объединение без ухода в наследование или архитектуру приложения.
Состоянием называют данные компонента, которые React сохраняет между рендерами и использует для обновления интерфейса.
- Состояние представляет меняющуюся со временем информацию, например значение поля или выбранный элемент.
- Обновление состояния запрашивает новый рендер компонента.
- Каждый смонтированный экземпляр компонента имеет собственное локальное состояние.
Зачем это спрашивают: Интервьюер проверяет связь состояния с сохраняемыми данными компонента и рендерингом.
Пропсы приходят от родителя, а состоянием владеет и управляет тот экземпляр компонента, который его объявил.
- И пропсы, и состояние могут влиять на результат рендеринга.
- Компонент не должен напрямую изменять свои пропсы.
- Состояние меняется через сеттер, а родитель меняет передаваемые пропсы во время собственного рендера.
Зачем это спрашивают: Сильный ответ разделяет владение и ответственность за обновление и признаёт влияние обоих видов данных на рендеринг.
Локальная переменная создаётся заново при каждом рендере, а её изменение не просит React выполнить новый рендер.
- React не сохраняет обычные локальные переменные как состояние компонента между рендерами.
- Сеттер состояния записывает значение для следующего рендера и планирует обновление.
- Значения, которые должны сохраняться и влиять на интерфейс, обычно относятся к состоянию.
Зачем это спрашивают: Интервьюер проверяет понимание сохранения значений между рендерами и необходимости уведомлять React.
useState возвращает пару из текущего значения состояния и функции для его обновления.
- Деструктуризация массива обычно даёт этой паре имена вроде count и setCount.
- Текущее значение относится к тому рендеру, в котором был вызван компонент.
- Вызов сеттера ставит в очередь будущий рендер с запрошенным состоянием.
Зачем это спрашивают: Интервьюер оценивает знание базового контракта useState и его связи с рендерингом.
React использует начальное значение useState при первом создании состояния этого компонента.
- Последующие рендеры читают сохранённое состояние, а не сбрасывают его до начального аргумента.
- Если передать функцию, React вызовет её как инициализатор при начальном рендере.
- Инициализатор должен быть чистым, потому что при проверках в режиме разработки React может вызвать его больше одного раза.
Зачем это спрашивают: Сильный ответ отличает инициализацию состояния от значения, читаемого при каждом следующем рендере.
Закрытые вопросы
- 21
Что происходит при вызове сеттера состояния?
- 22
Когда следует использовать функциональную форму обновления состояния?
forms - 23
Как следует обновлять объекты и массивы в состоянии?
- 24
Что означает поведение состояния как снимка?
snapshot - 25
Когда связанные значения стоит хранить в одном объекте состояния, а когда в отдельных переменных?
- 26
Что такое хук React?
reacthooks - 27
Каковы правила хуков?
hooks - 28
Для чего нужен useEffect?
hooks - 29
Чем управляет массив зависимостей useEffect?
hooksdependencies - 30
Что делает пустой массив зависимостей в useEffect?
hooksdependencies - 31
Что происходит, если у useEffect нет массива зависимостей?
hooksdependencies - 32
Что такое функция очистки эффекта?
- 33
Как на базовом уровне связаны useEffect и методы жизненного цикла классовых компонентов?
hooks - 34
Что может вызвать рендер React-компонента?
reactcomponents - 35
Чем фаза рендеринга React отличается от фазы фиксации?
react - 36
Что такое согласование в React?
react - 37
Когда React сохраняет состояние компонента?
reactcomponents - 38
Как ключ может сбросить состояние компонента?
components - 39
Всегда ли рендер родителя означает изменение DOM браузера для каждого дочернего компонента?
dom - 40
Как обрабатываются события в React?
react - 41
Почему в JSX обработчик события передают, а не вызывают?
- 42
Что представляет собой объект события в обработчике React?
react - 43
Что делают preventDefault и stopPropagation в обработчике события React?
react - 44
Как отрендерить список элементов в React?
react - 45
Зачем React нужны ключи при рендеринге списков?
react - 46
Почему индекс массива может быть плохим ключом React?
reactindexes - 47
Может ли дочерний компонент прочитать назначенный ему key?
components - 48
Какими основными способами можно условно рендерить контент в React?
react - 49
Что такое управляемое поле ввода в React?
reactforms - 50
Чем управляемые поля формы отличаются от неуправляемых?
forms - 51
Как бы вы создали переиспользуемую карточку товара для разных товаров и необязательной кнопки действия?
- 52
Компонент получает массив задач из API. Как правильно его отрисовать?
componentsapi - 53
Как бы вы реализовали состояния загрузки, ошибки, пустого результата и успеха для списка пользователей?
- 54
Как сделать компонент модального окна управляемым из родителя?
components - 55
Нужны основная, вторичная и отключённая версии кнопки. Как бы вы спроектировали компонент?
componentsdesign - 56
Как реализовать список карточек, в котором активной может быть только одна?
- 57
Обработчик клика дважды вызывает setCount(count + 1), но счётчик увеличивается только на один. Как это исправить?
- 58
Форма хранит firstName, lastName и fullName в состоянии. Как её упростить?
forms - 59
Поле поиска и отфильтрованный список находятся в соседних компонентах. Где должно храниться состояние запроса?
componentsqueries - 60
Как связать форму редактирования с живым предпросмотром профиля рядом с ней?
forms - 61
Функция кнопки выполняется во время рендера, а не после клика. В чём вероятная ошибка и как её исправить?
- 62
Отправка React-формы перезагружает всю страницу. Как это исправить и правильно построить обработку?
reactforms - 63
Клик по кнопке удаления внутри кликабельной карточки также открывает карточку. Как это исправить?
- 64
Как реализовать управляемое поле электронной почты в React?
reactforms - 65
Как обрабатывать несколько текстовых полей, не создавая отдельный обработчик для каждого?
- 66
Чекбокс всегда сохраняет строку "on" вместо true или false. Что нужно изменить?
- 67
Как добавить клиентскую валидацию в форму регистрации, не показывая ошибки слишком рано?
formsvalidation - 68
Когда нужно сбрасывать форму после отправки и как это реализовать?
forms - 69
Как предотвратить повторную отправку формы, пока выполняется асинхронный запрос?
formsasync - 70
Как создать поле выбора файла, которое показывает имя и ограничивает размер?
- 71
Как загрузить список постов при первом монтировании компонента через useEffect?
componentshooks - 72
Fetch получает ответ 404, но блок catch не выполняется. Как это исправить?
- 73
Компонент размонтировался до завершения fetch. Как не дать устаревшему запросу повлиять на интерфейс?
components - 74
Fetch внутри useEffect запускается после каждого рендера и создаёт цикл. Как найти причину?
hooks - 75
Профиль должен перезагружаться при изменении userId. Как построить эффект?
- 76
Пользователь быстро переключается между двумя профилями, и медленный первый ответ перезаписывает второй. Как это исправить?
- 77
Как не отправлять запрос к API после каждого символа в поле поиска?
api - 78
Компонент добавляет обработчик resize окна внутри useEffect. Что должна делать функция очистки?
componentshooks - 79
Дочерний компонент рендерится при изменении несвязанного счётчика в родителе. Как это исследовать?
components - 80
Медленный элемент списка обёрнут в React.memo, но продолжает рендериться из-за изменения колбэка. Что делать?
reactcallbacks - 81
Мемоизированный дочерний компонент получает style={{ color: 'red' }} и продолжает рендериться. Почему и что изменить?
memoization - 82
Счётчик на странице Next.js App Router не работает, потому что компонент использует useState на сервере. Как это исправить?
componentshooksnextjs - 83
Текстовое поле теряет значение при каждом изменении переключателя в родителе. Какую проблему идентичности React нужно проверить?
react - 84
Имя в объекте user мутируют и передают тот же объект в setUser, но экран обновляется нестабильно. Как исправить?
- 85
Отложенное предупреждение всегда показывает старое значение счётчика. Как понять, является ли это ошибкой, и исправить её?
alerting - 86
Почему лог сразу после setName показывает старое имя и как проверить обновление?
logging - 87
Эффект вычисляет filteredItems и сохраняет их в состоянии, создавая лишние рендеры. Как это улучшить?
- 88
Когда стоит использовать useMemo для сортированной таблицы и какие зависимости ему нужны?
dependencies - 89
Два компонента повторяют одинаковую логику fetch, загрузки, ошибки и отмены. Как её переиспользовать?
componentsresilience - 90
Стоит ли хранить открытое состояние выпадающего меню в Zustand или локальном состоянии компонента?
componentsstate - 91
Страница вручную загружает одинаковые серверные данные в нескольких компонентах. Когда поможет React Query?
reactcomponentsqueries - 92
Как реализовать оптимистичный переключатель, если запрос к серверу может завершиться ошибкой?
locking - 93
Как типизировать React-компонент, принимающий заголовок, необязательное описание и колбэк сохранения?
reactcomponentscallbacks - 94
TypeScript не принимает один обработчик change для input и select. Как безопасно его типизировать?
typescript - 95
Класс Tailwind, собранный как bg-${color}-500, отсутствует в production CSS. Как это исправить?
csstailwind - 96
В дизайне показана кликабельная карточка на div. Как реализовать её доступно?
design - 97
Как протестировать форму входа через React Testing Library?
reactformsrtl - 98
Тест сразу ожидает загруженные данные и периодически падает. Как его исправить?
- 99
Как Storybook поможет завершить переиспользуемый компонент уведомления?
componentsstorybook - 100
Вы получили дизайн адаптивной карточки дашборда в Figma. Как превратить его в React-компонент?
reactcomponentsresponsive