#reactjs #events #keydown
#reactjs #Мероприятия #нажатие клавиши
Вопрос:
У меня есть компонент, который показывает модальное значение при нажатии 'Enter'
. Это работает круто.
Я хотел бы добавить взаимодействия с клавиатурой к модальному. И все шло круто, ПОКА я не выбрал 'Enter'
в качестве кнопки подтверждения в модальном.
В чем моя проблема? Клавиша enter используется для отображения модальности, когда вы находитесь в компоненте. Но, кроме того, это ключ подтверждения, когда вы находитесь в модальном режиме.
Звучит неплохо. НО проблема в том, что нажатие «enter» из компонента также перехватывается моим модальным (в window.addEventListener('keydown', this.onKeyPress);
) в его первом цикле.
Итак, он запустился и скрылся в один и тот же момент, и я не могу с ним взаимодействовать. Предложение или обходной путь для этого?
Подсказка:
Я попытался добавить timeOut
500 миллисекунд в свой modal.componentDidMount.addEventListener
. НО проблема в том, что это связано с компьютером, а не с детерминированным поведением. Я бы в любом случае хотел обеспечить правильное поведение.
Кроме того, мой код выглядит следующим образом:
0. modal.jsx
class Modal extends React.Component {
//...
onKeyPress (event) {
if (event.key === 'Enter') {
this.props.hideScroll();
}
}
// MY PROBLEM (I think so)
componentDidMount () {
window.addEventListener('keydown', this.onKeyPress);
}
componentWillUnmount () {
window.removeEventListener('keydown', this.onKeyPress);
}
render () {
return <div>Cool Modal</div>;
}
}
1. component.jsx
class Component extends React.Component {
//...
onKeyPress (event) {
if (event.key === 'Enter') {
this.setState({
showModal: true
});
}
}
render () {
let modal = this.state.showModal amp;amp; <Modal hideScroll={this.hideScroll} />
return (
{modal}
<input onKeyDown={this.onKeyPress}>
)
}
}
Ответ №1:
event.stopPropagation должен выполнить всю работу.? Кажется, что react работает чертовски быстро (захват события в компоненте изменяет состояние), что делает его модальным. и после рендеринга он получает то же событие, которое было зафиксировано в компоненте (в основном). На самом деле это синтетическое событие на уровне компонента (оболочка в верхней части собственного события)
Комментарии:
1. Это было быстро. Я все еще писал код в sandbox, чтобы иметь возможность делиться и тестировать для других пользователей! Но это решило мою проблему! (спасибо)