MENU
Multiple Selection
RESETRUNFULL
import {useState} from 'react';import {useCombobox, useMultipleSelection} from 'downshift';const items = ['apple','apricot','pear','orange','grape','banana'];export default function App() { const [inputValue, setInputValue] = useState('');const {getSelectedItemProps,
getDropdownProps,
addSelectedItem,
removeSelectedItem,
selectedItems} =
useMultipleSelection({initialSelectedItems: [items[0], items[1]]});const getFilteredItems = items => items.filter( item => selectedItems.indexOf(item)<0
&& item.toLowerCase().startsWith(inputValue.toLowerCase()));
const {isOpen, getToggleButtonProps, getLabelProps, getMenuProps, getInputProps,
getComboboxProps, highlightedIndex, getItemProps, selectItem} = useCombobox({
inputValue,
items: getFilteredItems(items),
onStateChange: ({inputValue, type, selectedItem}) => {
switch (type) {
case useCombobox.stateChangeTypes.InputChange:
setInputValue(inputValue)
break;
case useCombobox.stateChangeTypes.InputKeyDownEnter:
case useCombobox.stateChangeTypes.ItemClick:
case useCombobox.stateChangeTypes.InputBlur:
if (selectedItem) {
setInputValue('');
addSelectedItem(selectedItem);
selectItem(null);
}
break;
default: break;
}
}});
return (<div><label {...getLabelProps()}>Choose some elements:</label>
<div>{selectedItems.map((selectedItem, index) => (
<span key={`selected-item-${index}`}
{...getSelectedItemProps({selectedItem, index})}>
{selectedItem}
<span onClick={() => removeSelectedItem(selectedItem)}>
✕</span></span>))}
<div {...getComboboxProps()}>
<input {...getInputProps(getDropdownProps(
{preventKeyAction: isOpen}))} />
<button {...getToggleButtonProps()} aria-label={'toggle menu'}>
↓</button></div></div>
<ul {...getMenuProps()} >{isOpen &&
getFilteredItems(items).map((item, index) => (
<li
style={highlightedIndex===index?{backgroundColor: '#bde4ff'}:{}}
key={`${item}${index}`}
{...getItemProps({item, index})}>
{item}
</li>))}
</ul>
</div>);}