Как определить нажатие клавиши Esc на reactjs? То же, что и jquery
$(document).keyup(function(e) {
if (e.keyCode == 27) { // escape key maps to keycode `27`
// <DO YOUR WORK HERE>
}
});
После обнаружения я хочу передать информацию компонентам. У меня есть 3 компонента, из которых последний активный компонент должен реагировать на нажатие клавиши выхода.
Я думал о некой регистрации, когда компонент становится активным
class Layout extends React.Component {
onActive(escFunction){
this.escFunction = escFunction;
}
onEscPress(){
if(_.isFunction(this.escFunction)){
this.escFunction()
}
}
render(){
return (
<div class="root">
<ActionPanel onActive={this.onActive.bind(this)}/>
<DataPanel onActive={this.onActive.bind(this)}/>
<ResultPanel onActive={this.onActive.bind(this)}/>
</div>
)
}
}
и по всем компонентам
class ActionPanel extends React.Component {
escFunction(){
//Do whatever when esc is pressed
}
onActive(){
this.props.onActive(this.escFunction.bind(this));
}
render(){
return (
<input onKeyDown={this.onActive.bind(this)}/>
)
}
}
Я верю, что это сработает, но я думаю, что это будет больше похоже на обратный вызов. Есть ли лучший способ справиться с этим?
Ответы:
Если вы ищете обработку ключевых событий на уровне документа, то
componentDidMount
лучшим способом будет привязка ее во время (как показано в примере кода Брэда Колтерста ):Обратите внимание, что вы должны обязательно удалить прослушиватель ключевых событий при размонтировании, чтобы предотвратить возможные ошибки и утечки памяти.
РЕДАКТИРОВАТЬ: если вы используете хуки, вы можете использовать эту
useEffect
структуру для получения аналогичного эффекта:источник
addEventListener
иremoveEventListener
?focus
. Это не актуально дляkeydown
, но раньше не было необязательным, поэтому обычно указывается для совместимости с IE <9.this.escFunction
функцию вродеfunction() { this.escFunction(event) }
, иначе она выполнялась при загрузке страницы без каких-либо «нажатий».Вы захотите послушать escape
keyCode
(27) из ReactSyntheticKeyBoardEvent
onKeyDown
:CodePen Брэда Колтерста, размещенный в комментариях к вопросу, полезен для поиска ключевых кодов для других ключей.
источник
onKeyPress
событие, когда нажата клавиша ESC, а фокус находится внутри<input type="text" />
. В этом сценарии вы можете использоватьonKeyDown
иonKeyUp
, оба срабатывают, и в правильном порядке.Другой способ сделать это в функциональном компоненте - использовать
useEffect
иuseFunction
, например:Вместо console.log вы можете использовать
useState
для запуска чего-либо.источник
React использует SyntheticKeyboardEvent для обертывания собственного события браузера, и это синтетическое событие предоставляет именованный ключевой атрибут ,
который вы можете использовать следующим образом:
источник
e.key
ибоEscape
возвращается какEsc
#triggeredДля многоразового решения с крючком React
Использование:
источник