Навигация с клавиатуры в списках подсказок
Обрабатывайте клавиши ArrowUp, ArrowDown, Enter и Escape для навигации и выбора подсказок без мыши
«Навигация с клавиатуры в списках подсказок» — бесплатный урок React Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Обработка onKeyDown в поле ввода
Привяжите обработчик клавиатуры к событию onKeyDown на элементе ввода, а не к onKeyPress (устарело) или onKeyUp. Событие keyDown срабатывает до появления символа в поле ввода, что позволяет перехватить ArrowDown, ArrowUp, клавишу ввода и клавишу выхода до того, как браузер применит их стандартное действие.
Поведение клавиши ArrowDown
Когда пользователь нажимает ArrowDown, увеличивайте selectedIndex на 1, ограничивая его максимальным значением suggestions.length - 1: setSelectedIndex(prev => Math.min(prev + 1, suggestions.length - 1)). Также вызывайте e.preventDefault(), чтобы курсор не перемещался в конец текста поля ввода — таково стандартное поведение браузера для ArrowDown в текстовых полях.
Поведение клавиши ArrowUp
Когда пользователь нажимает ArrowUp, уменьшайте selectedIndex на 1, ограничивая его минимальным значением 0: setSelectedIndex(prev => Math.max(prev - 1, 0)). Также можно ограничивать значение до -1 (нет выбора) при попытке подняться выше индекса 0, позволяя пользователю снять выбор и свободно вернуться к вводу текста.
Поведение клавиши ввода
Если нажата клавиша ввода и selectedIndex >= 0, выберите выделенную подсказку: установите inputValue в значение suggestions[selectedIndex], закройте раскрывающийся список и сбросьте selectedIndex в -1. Если ни одна подсказка не выделена (selectedIndex равен -1), разрешите обычную отправку формы или выполнение поиска.
Поведение клавиши выхода
При нажатии клавиши выхода закройте раскрывающийся список, установив isOpen в false, и сбросьте selectedIndex в -1. Не очищайте значение поля ввода — пользователь хочет лишь скрыть подсказки без выбора, сохранив введенный текст для дальнейшего редактирования.
Поведение клавиши табуляции
При нажатии клавиши табуляции закройте раскрывающийся список, поскольку браузер в любом случае переведет фокус на следующий доступный для фокуса элемент. Установка isOpen в false при нажатии клавиши табуляции гарантирует, что список не останется открытым после ухода фокуса из поля ввода. Вызывать preventDefault() не нужно — позвольте браузеру управлять естественным порядком перехода по элементам.
Визуальное выделение выбранной строки
Выделенная подсказка должна заметно отличаться визуально. Применяйте активный стиль к подсказке с индексом selectedIndex: className={index === selectedIndex ? 'suggestion suggestion--active' : 'suggestion'}. Активное состояние обычно меняет цвет фона, благодаря чему понятно, какой элемент будет выбран при нажатии клавиши ввода.
Прокрутка выбранного элемента в область видимости
Если для списка подсказок задана максимальная высота и он прокручивается, выделенный элемент может выйти за пределы экрана при навигации с клавиатуры. Используйте массив ссылок для хранения элементов подсказок DOM и вызывайте listItemRefs.current[selectedIndex]?.scrollIntoView({ block: 'nearest' }) при каждом изменении selectedIndex. Значение nearest для блока минимизирует объем прокрутки.
Синхронизация selectedIndex при изменении подсказок
Когда поле ввода изменяется и появляется новый отфильтрованный список, сбрасывайте selectedIndex в -1 в том же обновлении состояния или в useEffect, зависящем от списка подсказок. Устаревшие индексы, указывающие на удаленные элементы, приведут к тому, что пользователь выберет неправильную подсказку.
Полный процесс навигации с клавиатурой
Полный сценарий взаимодействия: пользователь вводит текст для фильтрации, ArrowDown выделяет первый элемент, повторные нажатия ArrowDown перемещают выделение по списку, ArrowUp перемещает его вверх, клавиша ввода выбирает выделенный элемент, а клавиша выхода закрывает список без выбора. Это охватывает все стандартные способы взаимодействия с клавиатурой, которых пользователи ожидают от поля автодополнения.
Предотвращение стандартного поведения клавиш со стрелками
Всегда вызывайте e.preventDefault() при обработке ArrowDown и ArrowUp внутри текстового поля ввода. Без этого ArrowDown перемещает курсор в конец текста, а ArrowUp — в его начало. Такое перемещение курсора конфликтовало бы с навигацией по индексу выбранного элемента и создавало бы непонятное поведение.
Сопоставление клавиш для навигации с клавиатурой
Что должно произойти, когда пользователь нажимает клавишу ввода, если на позиции selectedIndex = 2 выделена подсказка?
Повторение урока: навигация с клавиатуры
Обрабатывайте onKeyDown у поля ввода. ArrowDown увеличивает значение selectedIndex, не превышая максимум, ArrowUp уменьшает его, не опускаясь ниже 0 или -1, Enter выбирает выделенный элемент, Escape закрывает список без выбора, а Tab закрывает его и позволяет браузеру переместить фокус. Всегда вызывайте preventDefault для клавиш со стрелками и прокручивайте выделенный элемент так, чтобы он оказался в области просмотра.
Часто задаваемые вопросы
Урок «Навигация с клавиатуры в списках подсказок» бесплатный?
Да — полный текст урока «Навигация с клавиатуры в списках подсказок» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Навигация с клавиатуры в списках подсказок»?
Обрабатывайте клавиши ArrowUp, ArrowDown, Enter и Escape для навигации и выбора подсказок без мыши Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Навигация с клавиатуры в списках подсказок»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Управляемый ввод со списком подсказок
- Навигация с клавиатуры в списках подсказок
- Асинхронные подсказки с debounce
- Доступность виджетов автодополнения