0Pricing
React Academy · Урок

Навигация с клавиатуры в списках подсказок

Обрабатывайте клавиши 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 — локальная установка не требуется.

Все уроки этого курса

  1. Управляемый ввод со списком подсказок
  2. Навигация с клавиатуры в списках подсказок
  3. Асинхронные подсказки с debounce
  4. Доступность виджетов автодополнения
← Назад к React Academy