Я бы хотел, чтобы пользователь мог вводить слова и нажимать ввод / вкладку, чтобы отправить несколько вариантов. Эта функциональность явно возможна, как показано в последнем примере на этой странице (под названием «Многократный ввод текста»). Тем не менее, когда я нажимаю Enter / Tab значения не отображаются. Если я включаю меню и использую опцию «Создать новый», то все работает нормально. Кроме того, если я дам компоненту опору prop, это прекрасно работает.
import CreatableSelect from 'react-select/creatable';
export type OptionType = {
value: string;
label: string;
__isNew__?: boolean;
};
export type Value = ValueType<OptionType>;
export type Values = Array<Value>;
export const createOption = (value: string, label?: string): OptionType => ({
value,
label: label ? label : value
});
interface ListTextFieldProps extends WithStyles<typeof styles>, WithTheme {
values: Values;
setValues: (values: Values) => void;
label?: string;
}
const ListTextField: React.FC<ListTextFieldProps> = props => {
const [inputValue, setInputValue] = useState('');
const selectStyles = {
input: (base: any) => ({
...base,
color: props.theme.palette.text.primary,
'& input': {
font: 'inherit'
}
})
};
const handleInputChange = (value: string, meta: InputActionMeta) => {
if (meta.action === 'input-change') {
setInputValue(value);
}
}
const handleKeyDown = (event: any) => {
if (!inputValue) return;
if (['Enter', 'Tab'].includes(event.key)) {
console.log(inputValue)
handleValueChange([...props.values, createOption(inputValue.trim())])
setInputValue('');
}
}
const handleValueChange = (values?: Value | Values | null) => {
console.log(values)
if (Array.isArray(values)) {
props.setValues(values);
} else {
throw new Error('Unexpected type passed to ReactSelect onChange handler')
}
}
return (
<div className={props.classes.root}>
<CreatableSelect
classes={props.classes}
inputValue={inputValue}
onInputChange={handleInputChange}
onKeyDown={handleKeyDown}
styles={selectStyles}
textFieldProps={{
label: props.label ? props.label : undefined,
InputLabelProps: {
shrink: true
}
}}
menuIsOpen={false}
values={props.values}
onChange={handleValueChange}
isMulti
/>
</div>
);
};