Фокус-менеджмент является важной частью взаимодействия пользователя с интерфейсом на веб-приложениях, особенно когда речь идет о доступности и удобстве навигации. Vuetify предоставляет встроенные механизмы для контроля фокуса, что позволяет управлять перемещением пользователя по компонентам, улучшать UX и обеспечивать совместимость с экранными читалками.
ref и методы компонентовКаждый компонент Vuetify, поддерживающий интерактивность
(v-btn, v-text-field, v-select и
другие), имеет методы для установки и снятия фокуса.
Пример установки фокуса на текстовое поле:
<template>
<v-text-field
label="Имя"
ref="nameInput"
></v-text-field>
<v-btn @click="focusInput">Фокус на поле</v-btn>
</template>
<script>
export default {
methods: {
focusInput() {
this.$refs.nameInput.focus();
}
}
}
</script>
Ключевые моменты:
ref для получения ссылки на
компонент.focus() доступен для большинства интерактивных
компонентов Vuetify.tabindextabindex управляет порядком перемещения фокуса по
элементам при нажатии клавиши Tab. Vuetify позволяет
задавать tabindex через пропсы для некоторых
компонентов.
<v-btn :tabindex="1">Первый</v-btn>
<v-btn :tabindex="3">Третий</v-btn>
<v-btn :tabindex="2">Второй</v-btn>
Особенности:
tabindex получают фокус раньше.0 позволяет элементу участвовать в
естественном порядке табуляции.-1 исключает элемент из последовательности
табуляции, но позволяет программно устанавливать фокус.Компоненты v-dialog, v-menu и
v-tooltip автоматически управляют фокусом при открытии. По
умолчанию первый интерактивный элемент внутри диалога получает фокус,
что улучшает навигацию с клавиатуры.
<v-dialog v-model="dialog" persistent>
<template #activator="{ props }">
<v-btn v-bind="props">Открыть диалог</v-btn>
</template>
<v-card>
<v-card-title>Форма входа</v-card-title>
<v-card-text>
<v-text-field label="Email"></v-text-field>
<v-text-field label="Пароль" type="password"></v-text-field>
</v-card-text>
<v-card-actions>
<v-btn @click="dialog = false">Закрыть</v-btn>
<v-btn color="primary">Войти</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
Примечания:
persistent предотвращает закрытие диалога при
нажатии вне него, сохраняя фокус внутри.v-text-field.v-focus
директиву или методы focus().v-focusVuetify позволяет создавать кастомные директивы для управления фокусом. Например, можно сделать автоматический фокус при рендере элемента:
Vue.directive('focus', {
mounted(el) {
el.focus();
}
});
Использование:
<v-text-field v-focus label="Автофокус"></v-text-field>
Преимущества:
Компоненты v-data-table и v-list
поддерживают программное управление фокусом для элементов внутри. Это
важно при навигации с клавиатуры и для доступности.
<v-list>
<v-list-item
v-for="item in items"
:key="item.id"
:tabindex="0"
@keydown.enter="selectItem(item)"
>
{{ item.name }}
</v-list-item>
</v-list>
Особенности:
tabindex="0" делает элемент доступным для
табуляции.@keydown) для
имитации выбора.Для сложных форм и интерфейсов с множеством интерактивных компонентов рекомендуется использовать стратегию управления фокусом:
tabindex для управления
последовательностью.@focus и @blur для
отслеживания состояния фокуса.Пример: пошаговая форма
<v-stepper v-model="step">
<v-stepper-step :complete="step > 1" step="1">
<v-text-field ref="field1" label="Имя"></v-text-field>
</v-stepper-step>
<v-stepper-step :complete="step > 2" step="2">
<v-text-field ref="field2" label="Email"></v-text-field>
</v-stepper-step>
<v-btn @click="nextStep">Следующий шаг</v-btn>
</v-stepper>
methods: {
nextStep() {
this.step++;
this.$nextTick(() => {
if (this.step === 2) this.$refs.field2.focus();
});
}
}
ref и методы focus() для программного
управления фокусом.tabindex для контроля порядка навигации.v-focus для автофокуса при монтировании.Эти техники обеспечивают удобство и доступность интерфейсов на Vuetify, позволяют создавать интуитивно понятные приложения с полной поддержкой навигации с клавиатуры и экранных читалок.