Я боюсь, что он жалуется на эту строку
const { inputValue } = this.selector;
, которая равна
const inputValue = this.selector.inputValue;
Доступ к дочернему свойству (или метод) обычно (кроме особых случаев, например focus()
) признак плохой структуры - состояние должно быть поднято .Передача обработчиков помогает поднять состояние.К сожалению, как вы писали, событие onBlur
не передает значение обработчику, но мы можем получить входное значение раньше (и сохранить его в состоянии).Пример обработчика onKeyDown
( последний ) показывает, что его просто расширить с помощью обработчика onBlur
:
handleKeyDown = (event: SyntheticKeyboardEvent<HTMLElement>) => {
const { inputValue, value } = this.state;
if (!inputValue) return;
switch (event.key) {
case 'Enter':
case 'Tab':
console.group('Value Added');
console.log(value);
console.groupEnd();
this.setState({
inputValue: '',
value: [...value, createOption(inputValue)],
});
event.preventDefault();
}
};
handleOnBlur = () => {
const { inputValue, value } = this.state;
if (!inputValue) return;
console.group('Value Added');
console.log(value);
console.groupEnd();
this.setState({
inputValue: '',
value: [...value, createOption(inputValue)],
});
};
IMHO Tab
и Enter
довольно хорошиoptions (UX).
Есть еще несколько возможностей / реквизитов: isValidNewOption
, getNewOptionData
- второй вариант кажется более подходящим («проверенный»), чем использование ref и доступ к вводу raw
значение.
Вам не нужно использовать метод createNewOption
, так как все options
передаются как проп - вы можете изменить переданный массив.