Skip to content

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

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

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

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

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

Вопросы

vue

Vue является JavaScript-фреймворком, который строит пользовательский интерфейс из реактивного состояния и шаблонов компонентов.

  • Декларативный код описывает вид UI для текущих данных вместо ручного изменения DOM-узлов.
  • Когда отслеживаемое состояние меняется, Vue обновляет затронутые части отрисованного результата.
  • Компоненты делят интерфейс на переиспользуемые части со своими входами, поведением и шаблоном.

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

componentsvue

Vue Single-File Component обычно хранит логику, разметку и стили в одном файле .vue.

  • Секция script или script setup определяет состояние, импорты, props, события и логику компонента.
  • Секция template задаёт HTML-структуру и привязки Vue.
  • Секция style содержит CSS и может использовать scoped, чтобы ограничить селекторы этим компонентом.

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

vue

createApp создаёт экземпляр Vue-приложения, а mount рендерит его корневой компонент в DOM-контейнер.

  • Корневой компонент начинает дерево компонентов приложения.
  • Плагины, глобальные компоненты и provide-значения уровня приложения обычно регистрируют до mount.
  • Селектор или элемент, переданный в mount, указывает существующий контейнер страницы под управлением Vue.

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

domvirtual-dominternals

Vue представляет результат виртуальными узлами и сравнивает новое дерево с предыдущим перед обновлением реального DOM.

  • Рендер компонента создаёт лёгкое JavaScript-описание UI.
  • Реактивные изменения повторно рендерят затронутый компонент, после чего Vue выполняет только необходимые DOM-операции.
  • Стабильные keys и предсказуемые шаблоны помогают правильно сопоставить старые и новые дочерние узлы.

Зачем это спрашивают: Сильный ответ объясняет модель render-and-patch и не утверждает, что Vue перестраивает весь DOM страницы.

reactreactivityvue

Vue записывает реактивные значения, прочитанные активным эффектом, и повторяет эффект при их изменении.

  • Шаблоны, computed values и watchers могут выступать реактивными эффектами.
  • ref использует объект с реактивным свойством value, а reactive перехватывает доступ к объекту через Proxy.
  • Зависимости создают только отслеживаемые чтения, поэтому несвязанное состояние не обновляет каждый компонент.

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

composition-apivueapi

ref создаёт реактивный контейнер, текущее значение которого читается и меняется через свойство value в JavaScript.

  • Он работает и с примитивами вроде чисел и строк, и с объектами.
  • Присваивание count.value уведомляет зависящие шаблоны, computed values и watchers.
  • Шаблоны обычно автоматически разворачивают refs, поэтому используют count вместо count.value.

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

reactreactivityvue

reactive возвращает глубоко реактивный Proxy для объекта, массива, Map или Set.

  • Чтения и записи свойств отслеживаются через Proxy без обёртки value.
  • Исходный простой объект не равен по идентичности Proxy, поэтому прикладной код должен использовать Proxy.
  • reactive не предназначен для примитивов, поскольку у них нет свойств для перехвата.

Зачем это спрашивают: Интервьюер проверяет понимание Proxy-реактивности объектов и её ограничений.

reactreactivity

Используйте ref для отдельных и заменяемых значений, а reactive для группы свойств объекта, изменяемых на месте.

  • ref напрямую поддерживает примитивы и сохраняет реактивность при замене всего значения.
  • reactive даёт удобный доступ к свойствам объекта, но их деструктуризация может потерять реактивность.
  • Последовательная локальная договорённость важнее попытки поместить всё состояние в один примитив.

Зачем это спрашивают: Сильный ответ делает практический выбор и понимает компромиссы реактивности каждого API.

reactreactivityvue

Vue убирает часть синтаксиса value в шаблонах, но правила разворачивания зависят от положения ref.

  • Верхнеуровневый ref, доступный шаблону, обычно читается и изменяется без .value.
  • Ref, хранящийся свойством reactive-объекта, разворачивается при доступе к свойству.
  • Refs внутри массивов или нативных коллекций автоматически не разворачиваются, поэтому там нужно свойство value.

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

reactreactivity

toRefs превращает каждое реактивное свойство в связанный ref, чтобы деструктуризация не ломала реактивность.

  • Обычная деструктуризация копирует текущие значения свойств и отключает примитивные переменные от Proxy.
  • Каждый возвращённый ref читает и записывает соответствующее исходное свойство.
  • Это полезно, когда composable возвращает reactive-объект, поля которого вызывающий код хочет деструктурировать.

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

componentscomposition-apioptions-api

Options API группирует код по типам опций, а Composition API собирает связанное состояние и поведение вместе.

  • Options-компоненты используют секции data, computed, methods, watch и lifecycle hooks.
  • Composition-компоненты создают refs, computed values, watchers и hooks внутри setup или script setup.
  • Оба API используют одну реактивность Vue и создают полноценные компоненты, поэтому выбор в основном касается организации и переиспользования.

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

componentscomposition-apivue

script setup является compile-time синтаксисом, который делает объявления Composition API напрямую доступными шаблону.

  • Импортированные компоненты используются в шаблоне без отдельного объекта регистрации components.
  • Верхнеуровневые переменные, функции, refs и computed values видны шаблону.
  • Compiler macros вроде defineProps и defineEmits объявляют интерфейс компонента без runtime-импортов.

Зачем это спрашивают: Сильный ответ определяет script setup как синтаксис компилятора SFC, а не функцию вне setup.

components

Локальная регистрация делает компонент доступным только там, где он импортирован, а глобальная раскрывает его всему приложению.

  • Локальные импорты показывают зависимости и упрощают удаление неиспользуемых компонентов из сборки.
  • Глобальная регистрация подходит небольшому набору действительно универсальных UI-примитивов.
  • Глобальная регистрация множества feature-компонентов скрывает зависимости и повышает риск конфликтов имён.

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

componentsvue

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

  • Дочерний компонент объявляет принимаемые имена и может задать их типы, обязательность и defaults.
  • Родитель привязывает динамические значения через v-bind или сокращение с двоеточием.
  • Props следуют однонаправленному потоку данных и считаются readonly внутри дочернего компонента.

Зачем это спрашивают: Сильный ответ представляет props как явный readonly-интерфейс компонента.

validation

Опции props документируют и проверяют значения, ожидаемые от родителя.

  • type выполняет runtime-проверку в режиме разработки по конструкторам вроде String или Number.
  • required сообщает о пропущенном prop, а validator задаёт дополнительное правило.
  • Defaults объектов и массивов возвращают из factory function, чтобы экземпляры компонентов не разделяли одно изменяемое значение.

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

communicationcomponents

Дочерний компонент объявляет и испускает пользовательские события, а родитель слушает их на дочернем компоненте.

  • В script setup defineEmits объявляет имена событий и возвращает функцию emit.
  • Дочерний компонент может передать payload, например emit('save', formData).
  • События компонентов не всплывают по дереву компонентов как нативные DOM-события.

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

components

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

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

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

componentsformsvue

Компонентный v-model объединяет prop значения и соответствующее update-событие в синтаксис двусторонней привязки для родителя.

  • Контракт Vue 3 по умолчанию использует prop modelValue и событие update:modelValue.
  • Дочерний компонент не изменяет prop напрямую, а испускает новое значение.
  • Именованные v-model позволяют компоненту раскрывать несколько независимо связанных значений.

Зачем это спрашивают: Сильный ответ объясняет контракт prop и event, скрытый синтаксисом компонентного v-model.

vue

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