Вопросы на собеседовании: Vue-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior Vue-разработчик.
Смотреть пример резюме: Vue-разработчик →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Vue является JavaScript-фреймворком, который строит пользовательский интерфейс из реактивного состояния и шаблонов компонентов.
- Декларативный код описывает вид UI для текущих данных вместо ручного изменения DOM-узлов.
- Когда отслеживаемое состояние меняется, Vue обновляет затронутые части отрисованного результата.
- Компоненты делят интерфейс на переиспользуемые части со своими входами, поведением и шаблоном.
Зачем это спрашивают: Интервьюер проверяет понимание базовой модели Vue, а не только знание синтаксиса.
Vue Single-File Component обычно хранит логику, разметку и стили в одном файле .vue.
- Секция script или script setup определяет состояние, импорты, props, события и логику компонента.
- Секция template задаёт HTML-структуру и привязки Vue.
- Секция style содержит CSS и может использовать scoped, чтобы ограничить селекторы этим компонентом.
Зачем это спрашивают: Сильный ответ разделяет ответственность секций SFC и не смешивает представление с поведением.
createApp создаёт экземпляр Vue-приложения, а mount рендерит его корневой компонент в DOM-контейнер.
- Корневой компонент начинает дерево компонентов приложения.
- Плагины, глобальные компоненты и provide-значения уровня приложения обычно регистрируют до mount.
- Селектор или элемент, переданный в mount, указывает существующий контейнер страницы под управлением Vue.
Зачем это спрашивают: Интервьюер проверяет понимание запуска дерева Vue-компонентов.
Vue представляет результат виртуальными узлами и сравнивает новое дерево с предыдущим перед обновлением реального DOM.
- Рендер компонента создаёт лёгкое JavaScript-описание UI.
- Реактивные изменения повторно рендерят затронутый компонент, после чего Vue выполняет только необходимые DOM-операции.
- Стабильные keys и предсказуемые шаблоны помогают правильно сопоставить старые и новые дочерние узлы.
Зачем это спрашивают: Сильный ответ объясняет модель render-and-patch и не утверждает, что Vue перестраивает весь DOM страницы.
Vue записывает реактивные значения, прочитанные активным эффектом, и повторяет эффект при их изменении.
- Шаблоны, computed values и watchers могут выступать реактивными эффектами.
- ref использует объект с реактивным свойством value, а reactive перехватывает доступ к объекту через Proxy.
- Зависимости создают только отслеживаемые чтения, поэтому несвязанное состояние не обновляет каждый компонент.
Зачем это спрашивают: Интервьюер проверяет базовую связь между реактивными чтениями, зависимостями и обновлениями.
ref создаёт реактивный контейнер, текущее значение которого читается и меняется через свойство value в JavaScript.
- Он работает и с примитивами вроде чисел и строк, и с объектами.
- Присваивание count.value уведомляет зависящие шаблоны, computed values и watchers.
- Шаблоны обычно автоматически разворачивают refs, поэтому используют count вместо count.value.
Зачем это спрашивают: Сильный ответ знает правила доступа к refs и в JavaScript, и в шаблоне.
reactive возвращает глубоко реактивный Proxy для объекта, массива, Map или Set.
- Чтения и записи свойств отслеживаются через Proxy без обёртки value.
- Исходный простой объект не равен по идентичности Proxy, поэтому прикладной код должен использовать Proxy.
- reactive не предназначен для примитивов, поскольку у них нет свойств для перехвата.
Зачем это спрашивают: Интервьюер проверяет понимание Proxy-реактивности объектов и её ограничений.
Используйте ref для отдельных и заменяемых значений, а reactive для группы свойств объекта, изменяемых на месте.
- ref напрямую поддерживает примитивы и сохраняет реактивность при замене всего значения.
- reactive даёт удобный доступ к свойствам объекта, но их деструктуризация может потерять реактивность.
- Последовательная локальная договорённость важнее попытки поместить всё состояние в один примитив.
Зачем это спрашивают: Сильный ответ делает практический выбор и понимает компромиссы реактивности каждого API.
Vue убирает часть синтаксиса value в шаблонах, но правила разворачивания зависят от положения ref.
- Верхнеуровневый ref, доступный шаблону, обычно читается и изменяется без .value.
- Ref, хранящийся свойством reactive-объекта, разворачивается при доступе к свойству.
- Refs внутри массивов или нативных коллекций автоматически не разворачиваются, поэтому там нужно свойство value.
Зачем это спрашивают: Интервьюер проверяет умение различать доступ к ref в script и template.
toRefs превращает каждое реактивное свойство в связанный ref, чтобы деструктуризация не ломала реактивность.
- Обычная деструктуризация копирует текущие значения свойств и отключает примитивные переменные от Proxy.
- Каждый возвращённый ref читает и записывает соответствующее исходное свойство.
- Это полезно, когда composable возвращает reactive-объект, поля которого вызывающий код хочет деструктурировать.
Зачем это спрашивают: Сильный ответ понимает разницу между деструктуризацией свойства Proxy и сохранением реактивной связи.
Options API группирует код по типам опций, а Composition API собирает связанное состояние и поведение вместе.
- Options-компоненты используют секции data, computed, methods, watch и lifecycle hooks.
- Composition-компоненты создают refs, computed values, watchers и hooks внутри setup или script setup.
- Оба API используют одну реактивность Vue и создают полноценные компоненты, поэтому выбор в основном касается организации и переиспользования.
Зачем это спрашивают: Интервьюер проверяет сравнение API без ошибочного представления о разных системах рендеринга.
script setup является compile-time синтаксисом, который делает объявления Composition API напрямую доступными шаблону.
- Импортированные компоненты используются в шаблоне без отдельного объекта регистрации components.
- Верхнеуровневые переменные, функции, refs и computed values видны шаблону.
- Compiler macros вроде defineProps и defineEmits объявляют интерфейс компонента без runtime-импортов.
Зачем это спрашивают: Сильный ответ определяет script setup как синтаксис компилятора SFC, а не функцию вне setup.
Локальная регистрация делает компонент доступным только там, где он импортирован, а глобальная раскрывает его всему приложению.
- Локальные импорты показывают зависимости и упрощают удаление неиспользуемых компонентов из сборки.
- Глобальная регистрация подходит небольшому набору действительно универсальных UI-примитивов.
- Глобальная регистрация множества feature-компонентов скрывает зависимости и повышает риск конфликтов имён.
Зачем это спрашивают: Интервьюер проверяет осознанный выбор области доступности компонентов.
Props являются объявленными входами, которые родительский компонент передаёт дочернему.
- Дочерний компонент объявляет принимаемые имена и может задать их типы, обязательность и defaults.
- Родитель привязывает динамические значения через v-bind или сокращение с двоеточием.
- Props следуют однонаправленному потоку данных и считаются readonly внутри дочернего компонента.
Зачем это спрашивают: Сильный ответ представляет props как явный readonly-интерфейс компонента.
Опции props документируют и проверяют значения, ожидаемые от родителя.
- type выполняет runtime-проверку в режиме разработки по конструкторам вроде String или Number.
- required сообщает о пропущенном prop, а validator задаёт дополнительное правило.
- Defaults объектов и массивов возвращают из factory function, чтобы экземпляры компонентов не разделяли одно изменяемое значение.
Зачем это спрашивают: Интервьюер проверяет умение задавать полезные контракты props и безопасные defaults.
Дочерний компонент объявляет и испускает пользовательские события, а родитель слушает их на дочернем компоненте.
- В script setup defineEmits объявляет имена событий и возвращает функцию emit.
- Дочерний компонент может передать payload, например emit('save', formData).
- События компонентов не всплывают по дереву компонентов как нативные DOM-события.
Зачем это спрашивают: Сильный ответ понимает явную передачу вверх и отсутствие bubbling у событий компонентов.
Прямое изменение prop нарушает однонаправленный поток данных, поскольку исходным значением владеет родитель.
- Обновление родителя может перезаписать изменение дочернего компонента на следующем рендере.
- Дочерний компонент должен испустить событие, когда хочет изменить общее состояние через родителя.
- Для временно редактируемого состояния можно создать локальную копию и определить синхронизацию с новыми props.
Зачем это спрашивают: Интервьюер проверяет предсказуемое владение компонентами без двух авторов одного значения.
Компонентный v-model объединяет prop значения и соответствующее update-событие в синтаксис двусторонней привязки для родителя.
- Контракт Vue 3 по умолчанию использует prop modelValue и событие update:modelValue.
- Дочерний компонент не изменяет prop напрямую, а испускает новое значение.
- Именованные v-model позволяют компоненту раскрывать несколько независимо связанных значений.
Зачем это спрашивают: Сильный ответ объясняет контракт prop и event, скрытый синтаксисом компонентного v-model.
Fallthrough attributes являются необъявленными атрибутами и listeners, которые Vue применяет к корневому элементу компонента.
- Распространённые примеры: class, style, id и listeners нативных событий.
- Компонент с несколькими корневыми узлами должен выбрать место для атрибутов, поскольку Vue не может определить единственную цель.
- inheritAttrs и объект attrs позволяют отключить или перенаправить автоматическое наследование.
Зачем это спрашивают: Интервьюер проверяет, сохраняют ли компоненты-обёртки обычные HTML-атрибуты.
v-bind вычисляет JavaScript-выражение и назначает результат HTML-атрибуту или prop компонента.
- Сокращение :href эквивалентно v-bind:href.
- Binding class и style поддерживает строки, массивы и объекты для условного оформления.
- v-bind без аргумента применяет все свойства объекта как атрибуты или props.
Зачем это спрашивают: Сильный ответ отличает динамическую привязку от литерального HTML-атрибута.
Закрытые вопросы
- 21
Что делает v-on в шаблоне Vue?
vue - 22
Для чего нужны модификаторы событий Vue?
vue - 23
Чем отличаются v-if и v-show?
- 24
Как v-for рендерит список?
- 25
Зачем Vue нужен key для элементов списка?
vue - 26
Почему v-if и v-for обычно не следует размещать на одном элементе?
- 27
Как v-model работает с нативными элементами формы?
forms - 28
Что меняют модификаторы .lazy, .number и .trim у v-model?
forms - 29
Что такое computed property во Vue?
reactivityvue - 30
Когда использовать computed property вместо метода в шаблоне?
reactivity - 31
Что такое writable computed property?
reactivity - 32
Что делает watch в Composition API?
composition-apiapioop - 33
Чем watchEffect отличается от watch?
reactivity - 34
Что делают опции immediate и deep у watch?
- 35
Каковы основные этапы жизненного цикла Vue-компонента?
componentsvue - 36
Для чего следует использовать onMounted?
- 37
Для чего следует использовать onUpdated?
- 38
Почему cleanup часто размещают в onUnmounted?
- 39
Что такое default и named slots?
- 40
Что такое scoped slot во Vue?
componentsvue - 41
Что такое template ref и когда он доступен?
components - 42
Почему родителю не следует управлять дочерним компонентом в основном через component template refs?
components - 43
Как работают динамические компоненты во Vue?
componentsvue - 44
Что делают RouterLink и RouterView во Vue Router?
routingvue - 45
Чем route params отличаются от query parameters?
queries - 46
Как выполнять программную навигацию через Vue Router?
routingvue - 47
Как работают nested routes и catch-all routes во Vue Router?
routingvue - 48
Что такое state, getters и actions в Pinia store?
state-management - 49
Как компонентам использовать Pinia store без потери реактивности?
reactcomponentsreactivity - 50
Когда состояние следует оставить локальным, а когда перенести в Pinia или Vuex?
state-management - 51
Как построить переиспользуемый Vue-компонент кнопки с несколькими визуальными вариантами?
componentsvue - 52
Как спроектировать переиспользуемый компонент карточки товара?
componentsdesign - 53
Как разделить большую Vue-страницу на компоненты?
componentsvue - 54
Как реализовать переиспользуемую фичу Composition API в виде composable?
composition-apicomposablesapi - 55
Как реализовать доступный компонент показа и скрытия подробностей?
components - 56
Как реализовать клиентскую фильтрацию списка во Vue?
vue - 57
Как реализовать модальное окно, которым управляет родительский компонент?
componentsforms - 58
Как реализовать добавление и удаление элементов через дочерний компонент списка?
components - 59
Как построить базовую Vue-форму с текстовым полем, select и checkbox?
formsvue - 60
Как связать группу checkbox или radio buttons через v-model?
forms - 61
Как добавить клиентскую валидацию в Vue-форму?
formsvuevalidation - 62
Как предотвратить повторную отправку Vue-формы?
formsvue - 63
Как сделать пользовательское текстовое поле совместимым с v-model?
forms - 64
Как сбросить Vue-форму после успешной отправки?
formsvue - 65
Где загружать начальные API-данные в компоненте Vue Composition API?
componentscomposition-apivue - 66
Как показать loading, error, empty и success состояния загружаемых данных?
- 67
Как перезагружать данные при изменении реактивного фильтра?
reactreactivity - 68
При быстром изменении поиска API-ответы приходят не по порядку; как исправить отображаемый результат?
api - 69
Как подготовить данные API-ответа для использования Vue-компонентами?
componentsvueapi - 70
Как связать родительскую страницу и редактируемый дочерний компонент?
components - 71
Двум sibling-компонентам Vue нужен общий выбранный элемент; как их связать?
componentsvue - 72
Как использовать provide и inject для темы общего поддерева компонентов?
components - 73
Injected reactive object изменяют многие потомки; как улучшить дизайн?
reactreactivitydesign - 74
Данные передаются через пять уровней компонентов, но использует их только последний; что изменить?
components - 75
Как позволить переиспользуемому panel component принимать пользовательский header и body content?
components - 76
Как построить переиспользуемый список с настраиваемой родителем строкой?
- 77
Route component должен загрузить другого пользователя при изменении route ID; как это реализовать?
components - 78
Как выполнить навигацию после создания новой записи через Vue-форму?
formsvue - 79
Как разделять данные авторизованного пользователя между несколькими Vue routes?
vue - 80
Как реализовать асинхронный Pinia action для загрузки товаров?
state-managementasync - 81
Деструктурированное свойство reactive перестало обновлять шаблон; как это исправить?
reactreactivitydestructuring - 82
Ref меняется в script, но ожидаемое значение не обновляется; что проверить?
probability - 83
Замена reactive-объекта не обновляет потребителей; как исправить модель состояния?
reactreactivity - 84
Watcher для state.search не запускается при изменении поля; как его исправить?
reactivity - 85
Watcher реагирует на замену объекта, но не на изменение вложенного поля; что сделать?
reactreactivity - 86
watchEffect перестал реагировать на значение, прочитанное после await; как это исправить?
reactreactivityasync - 87
Computed value не обновляется после изменения обычной переменной модуля; как исправить?
reactivity - 88
После перестановки списка значения inputs появились в неправильных строках; как это исправить?
- 89
Vue предупреждает о readonly prop при его изменении ребёнком; как переработать компонент?
componentsvuerefactoring - 90
Родитель не получает пользовательское событие ребёнка; что проверить?
- 91
Template ref равен null при попытке сфокусировать input; как исправить?
componentsfundamentals - 92
Как прочитать обновлённый DOM сразу после изменения состояния Vue?
domvue - 93
После нескольких открытий компонент добавляет дублирующиеся window listeners; как исправить?
components - 94
Часто открываемый dropdown теряет локальное состояние из-за v-if; что изменить?
components - 95
Как построить переиспользуемое поле формы с собственным сообщением валидации?
formsvalidation - 96
Как добавить debounce к поиску Vue без утечки timers?
debouncevue - 97
Как лениво загрузить крупный Vue route или необязательный компонент?
componentsvue - 98
Как защитить страницу Vue Router, требующую авторизации?
routingvueauth - 99
Как упростить тестирование Vue-компонента с загрузкой данных?
componentsvue - 100
Как структурировать небольшой Vue-dashboard с routes, общим user state и переиспользуемыми widgets?
vue