Skip to content

Вопросы на собеседовании: React-разработчик

100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior.

Смотреть пример резюме: React-разработчик

Тренировка флешкарточками

Интервальное повторение · Hunter Pass

Вопросы

react

React представляет собой JavaScript-библиотеку для создания пользовательских интерфейсов из переиспользуемых компонентов.

  • Разработчик описывает вид интерфейса для текущих данных вместо ручного изменения DOM-узлов.
  • Компоненты делят интерфейс на самостоятельные части со своими входными данными и поведением.
  • React обновляет DOM браузера при изменении данных компонентов.

Зачем это спрашивают: Интервьюер проверяет понимание React как декларативной UI-библиотеки, а не полноценного фреймворка приложения.

reactcomponents

React-компонент представляет собой переиспользуемую единицу, которая возвращает описание интерфейса для React.

  • Компонент может получать пропсы от родителя.
  • Он может хранить локальное состояние, если его результат должен меняться со временем.
  • Компоненты могут рендерить браузерные элементы и другие компоненты.

Зачем это спрашивают: Сильный ответ описывает компонент через его роль, входные данные, локальное состояние и способность составлять интерфейс из других частей.

components

Функциональный компонент является JavaScript-функцией, которую React вызывает для вычисления части интерфейса.

  • Её параметры обычно содержат пропсы, переданные родителем.
  • Она обычно возвращает JSX, React-элемент или null.
  • Хуки позволяют функциональным компонентам использовать состояние и поведение, связанное с жизненным циклом.

Зачем это спрашивают: Интервьюер оценивает, связывает ли кандидат форму обычной функции с рендерингом React и хуками.

reactcomponents

Тег JSX с заглавной буквы сообщает React, что он ссылается на пользовательский компонент.

  • Теги в нижнем регистре, например div и button, считаются встроенными браузерными элементами.
  • Имя с заглавной буквы, например Profile, разрешается как JavaScript-переменная в текущей области видимости.
  • Из-за имени компонента в нижнем регистре React может принять его за неизвестный HTML-тег.

Зачем это спрашивают: Вопрос проверяет понимание того, как JSX отличает пользовательские компоненты от DOM-элементов.

JSX является расширением синтаксиса, которое позволяет описывать дерево React-элементов в JavaScript с помощью разметки, похожей на HTML.

  • Перед выполнением JSX преобразуется в вызовы JavaScript или равнозначные инструкции среды выполнения.
  • Он может представлять как браузерные элементы, так и пользовательские React-компоненты.
  • JSX необязателен, но упрощает чтение и написание вложенных структур интерфейса.

Зачем это спрашивают: Интервьюер проверяет, не принимает ли кандидат JSX за HTML или за код, который браузер выполняет напрямую.

javascript

JavaScript-выражения помещают в фигурные скобки внутри JSX.

  • Выражения могут задавать текст, значения пропсов, атрибуты или дочерние элементы.
  • Внутри скобок значение могут создавать вызовы, обращения к свойствам, вычисления и условные выражения.
  • Инструкции if, for и объявления переменных нужно выполнять вне JSX или выражать другим способом.

Зачем это спрашивают: Сильный ответ отличает выражения, создающие значение, от инструкций, которые нельзя напрямую вставить в JSX.

html

Для некоторых браузерных атрибутов JSX использует имена свойств в стиле JavaScript.

  • Вместо class используется className, потому что class является ключевым словом JavaScript.
  • Большинство составных DOM-свойств записываются в camelCase, например tabIndex и onClick.
  • Строковые литералы можно передавать в кавычках, а JavaScript-значения помещают в фигурные скобки.

Зачем это спрашивают: Интервьюер проверяет базовый синтаксис JSX и умение передавать типизированные JavaScript-значения, а не только строки.

components

Компонент возвращает одно значение с деревом элементов, а Fragment группирует несколько соседних элементов без добавления DOM-узла.

  • Обёртка вроде div тоже создаёт один корень, но меняет итоговую разметку.
  • Краткий синтаксис Fragment записывается как пустые открывающий и закрывающий теги.
  • Явной форме Fragment можно передать key при использовании в списке.

Зачем это спрашивают: Сильный ответ объясняет и единое возвращаемое значение, и преимущество Fragment перед лишней обёрткой.

reactcomponents

Компонентом называют функцию или класс, а React-элемент описывает то, что должно появиться в интерфейсе.

  • JSX вида <Button /> создаёт элемент, который ссылается на компонент Button.
  • React вызывает компонент, чтобы получить возвращаемые им элементы.
  • Элементы служат неизменяемыми описаниями, а компоненты содержат логику их создания.

Зачем это спрашивают: Интервьюер ждёт разделения переиспользуемого создателя интерфейса и создаваемого им описания элемента.

reactcomponents

Чистый компонент создаёт одинаковый JSX при одинаковых пропсах и состоянии и не изменяет внешние значения во время рендеринга.

  • Рендеринг должен вычислять интерфейс, а не выполнять побочные эффекты.
  • Компонент не должен изменять пропсы или состояние во время рендеринга.
  • Работу, вызванную взаимодействием или синхронизацией, размещают в обработчиках событий и эффектах.

Зачем это спрашивают: Интервьюер проверяет понимание правила предсказуемого рендеринга React-компонентов.

react

Пропсы являются входными данными, которые родительский компонент передаёт дочернему.

  • Они могут содержать строки, числа, объекты, функции или React-элементы.
  • Дочерний компонент читает пропсы, чтобы настроить свой вид или поведение.
  • Данные обычно передаются вниз по дереву компонентов через пропсы.

Зачем это спрашивают: Сильный ответ представляет пропсы как общие входные данные компонента, а не только подобие HTML-атрибутов.

components

Компонент должен считать пропсы доступными только для чтения, потому что их значениями владеет родитель.

  • Изменение пропса может поменять общие данные без явного запроса на обновление для React.
  • Если дочернему компоненту нужно изменение, он должен вызвать переданный колбэк.
  • Вместо изменения полученных через пропсы объектов или массивов нужно создавать новые значения.

Зачем это спрашивают: Интервьюер оценивает соблюдение однонаправленного потока данных и отсутствие скрытых мутаций.

componentsdestructuring

Функциональный компонент может деструктурировать именованные пропсы в списке параметров и там же задать значения по умолчанию.

  • Деструктуризация даёт прямые локальные имена вместо повторных обращений к объекту props.
  • Значение параметра по умолчанию используется, когда пропс равен undefined.
  • Переданное значение null не включает значение по умолчанию, предназначенное только для undefined.

Зачем это спрашивают: Вопрос проверяет практическое знание JavaScript применительно к понятным интерфейсам React-компонентов.

Пропс children содержит контент, размещённый между открывающим и закрывающим JSX-тегами компонента.

  • Дочерним контентом могут быть текст, элементы, компоненты, выражения или несколько значений.
  • Компоненты-обёртки могут рендерить children внутри общего макета или оформления.
  • Родитель управляет вложенным контентом, а обёртка определяет место его вывода.

Зачем это спрашивают: Интервьюер проверяет понимание стандартного механизма вложенного контента компонентов в React.

reactcomponentsoop

Композиция компонентов создаёт крупные интерфейсы путём вложения и объединения небольших компонентов.

  • Родители могут настраивать дочерние компоненты через пропсы.
  • Компоненты-обёртки могут принимать произвольный контент через children.
  • Композиция сохраняет узкую задачу каждого компонента и позволяет использовать одни части на разных экранах.

Зачем это спрашивают: Сильный ответ объясняет переиспользование через объединение без ухода в наследование или архитектуру приложения.

react

Состоянием называют данные компонента, которые React сохраняет между рендерами и использует для обновления интерфейса.

  • Состояние представляет меняющуюся со временем информацию, например значение поля или выбранный элемент.
  • Обновление состояния запрашивает новый рендер компонента.
  • Каждый смонтированный экземпляр компонента имеет собственное локальное состояние.

Зачем это спрашивают: Интервьюер проверяет связь состояния с сохраняемыми данными компонента и рендерингом.

Пропсы приходят от родителя, а состоянием владеет и управляет тот экземпляр компонента, который его объявил.

  • И пропсы, и состояние могут влиять на результат рендеринга.
  • Компонент не должен напрямую изменять свои пропсы.
  • Состояние меняется через сеттер, а родитель меняет передаваемые пропсы во время собственного рендера.

Зачем это спрашивают: Сильный ответ разделяет владение и ответственность за обновление и признаёт влияние обоих видов данных на рендеринг.

reactcomponents

Локальная переменная создаётся заново при каждом рендере, а её изменение не просит React выполнить новый рендер.

  • React не сохраняет обычные локальные переменные как состояние компонента между рендерами.
  • Сеттер состояния записывает значение для следующего рендера и планирует обновление.
  • Значения, которые должны сохраняться и влиять на интерфейс, обычно относятся к состоянию.

Зачем это спрашивают: Интервьюер проверяет понимание сохранения значений между рендерами и необходимости уведомлять React.

hooks

useState возвращает пару из текущего значения состояния и функции для его обновления.

  • Деструктуризация массива обычно даёт этой паре имена вроде count и setCount.
  • Текущее значение относится к тому рендеру, в котором был вызван компонент.
  • Вызов сеттера ставит в очередь будущий рендер с запрошенным состоянием.

Зачем это спрашивают: Интервьюер оценивает знание базового контракта useState и его связи с рендерингом.

hooks

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