Как использовать Tab вместо Enter в Downshift для выбора текущего пункта меню?

Это касается:

https://github.com/paypal/downshift

Я установил обработчик onKeyDown для распознавания нажатия клавиши Tab, и я могу правильно получить значение highlightedIndex, но как использовать это, чтобы изменить inputValue?

import React from 'react'
import Downshift from 'downshift'
import {
  Label,
  Menu,
  ControllerButton,
  Input,
  Item,
  ArrowIcon,
  XIcon,
  css,
  itemToString,
  getItems,
} from '../shared'

class App extends React.Component {
  render() {
    return (
      <div
        {...css({
          display: 'flex',
          flexDirection: 'column',
          marginTop: 50,
        })}
      >
        <Downshift
          onChange = {selection =>
            alert(
              selection
                ? `You selected ${itemToString(selection)}`
                : 'selection cleared',
            )
          }
          itemToString = {itemToString}
        >
          {({
            getLabelProps,
            getInputProps,
            getToggleButtonProps,
            getMenuProps,
            getItemProps,
            isOpen,
            clearSelection,
            selectedItem,
            inputValue,
            highlightedIndex,
          }) => (
            <div {...css({width: 250, margin: 'auto'})}>
              <Label {...getLabelProps()}>Find a Star Wars character</Label>
              <div {...css({position: 'relative'})}>
                <Input
                  {...getInputProps({
                    isOpen,
                    placeholder: 'Enter a name',
                    **onKeyDown: event => {
                      console.info(event.key)
                      if (event.key === 'Tab') {
                        console.info(highlightedIndex)
                      }
                    },**
                  })}
                />
                {selectedItem ? (
                  <ControllerButton
                    onClick = {clearSelection}
                    aria-label = "clear selection"
                  >
                    <XIcon />
                  </ControllerButton>
                ) : (
                  <ControllerButton {...getToggleButtonProps()}>
                    <ArrowIcon isOpen = {isOpen} />
                  </ControllerButton>
                )}
              </div>
              <div {...css({position: 'relative'})}>
                <Menu {...getMenuProps({isOpen})}>
                  {isOpen
                    ? getItems(inputValue).map((item, index) => (
                        <Item
                          key = {item.id}
                          {...getItemProps({
                            item,
                            index,
                            isActive: highlightedIndex === index,
                            isSelected: selectedItem === item,
                          })}
                        >
                          {itemToString(item)}
                        </Item>
                      ))
                    : null}
                </Menu>
              </div>
            </div>
          )}
        </Downshift>
      </div>
    )
  }
}

export default App
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
1 454
1

Ответы 1

Я обнаружил, что в этой ситуации помогает состояние.

stateReducer = {(_, changes) => {
    if (changes.type === Downshift.stateChangeTypes.blurInput) {
        return {
            ...changes,
            inputValue: your value,
            isOpen: false
        }
    }

    return changes
}}

в паре с входами getInputProps.onKeyDown event

<Input {...getInputProps({
    onKeyDown: event => {
        switch (event.key) {
            case 'Tab': {
                // use the highlighted or first value
                // update the state
                break;
            }
            default:
                break;
        }
    }
})} />

Другие вопросы по теме