Как обнаружить клавишу Esc Нажмите кнопку "Реакция" и как ее обрабатывать
Как я могу обнаружить нажатие клавиши Esc на контактах? Аналогичная вещь для jquery
$(document).keyup(function(e) {
if (e.keyCode == 27) { // escape key maps to keycode `27`
// <DO YOUR WORK HERE>
}
});
После обнаружения я хочу передать информацию вниз компонентов. У меня есть 3 компонента, из которых последний активный компонент должен реагировать на нажатие клавиши Escape.
Я думал о какой-то регистрации, когда компонент становится активным
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)}/>
)
}
}
Я считаю, что это сработает, но я думаю, что это будет больше похоже на обратный вызов. Есть ли лучший способ справиться с этим?
Ответы
Ответ 1
Если вы ищете обработку события ключа на уровне документа, то лучше всего связать его во время componentDidMount
(как показано в примере с кодовым фрагментом Брэда Колтурста):
class ActionPanel extends React.Component {
constructor(props){
super(props);
this.escFunction = this.escFunction.bind(this);
}
escFunction(event){
if(event.keyCode === 27) {
//Do whatever when esc is pressed
}
}
componentDidMount(){
document.addEventListener("keydown", this.escFunction, false);
}
componentWillUnmount(){
document.removeEventListener("keydown", this.escFunction, false);
}
render(){
return (
<input/>
)
}
}
Обратите внимание, что обязательно отключите прослушиватель ключевых событий при размонтировании, чтобы предотвратить возможные ошибки и утечки памяти.
ОБНОВЛЕНИЕ: Если вы используете хуки, вы можете использовать эту структуру useEffect
для получения аналогичного эффекта:
const ActionPanel = (props) => {
const escFunction = (event) => {
if(event.keyCode === 27) {
//Do whatever when esc is pressed
}
};
useEffect(() => {
document.addEventListener("keydown", escFunction, false);
return () => {
document.removeEventListener("keydown", escFunction, false);
};
}, []);
return (
<input />
)
};
Ответ 2
Вы захотите прослушать побег keyCode
(27) из Реакции SyntheticKeyBoardEvent
onKeyDown
:
const EscapeListen = React.createClass({
handleKeyDown: function(e) {
if (e.keyCode === 27) {
console.log('You pressed the escape key!')
}
},
render: function() {
return (
<input type='text'
onKeyDown={this.handleKeyDown} />
)
}
})
Codeden Брэда Колертста, размещенный в комментариях к вопросу, полезен для поиска кодов клавиш для других ключей.
Ответ 3
React использует SyntheticKeyboardEvent для переноса родного события браузера, и это событие Synthetic предоставляет атрибут именованного ключа,
который вы можете использовать так:
handleOnKeyDown = (e) => {
if (['Enter', 'ArrowRight', 'Tab'].includes(e.key)) {
// select item
e.preventDefault();
} else if (e.key === 'ArrowUp') {
// go to top item
e.preventDefault();
} else if (e.key === 'ArrowDown') {
// go to bottom item
e.preventDefault();
} else if (e.key === 'Escape') {
// escape
e.preventDefault();
}
};
Ответ 4
Еще один способ сделать это в функциональном компоненте - использовать useEffect
и useFunction
, например:
import React, { useEffect } from 'react';
const App = () => {
useEffect(() => {
const handleEsc = (event) => {
if (event.keyCode === 27) {
console.log('Close')
}
};
window.addEventListener('keydown', handleEsc);
return () => {
window.removeEventListener('keydown', handleEsc);
};
}, []);
return(<p>Press ESC to console log "Close"</p>);
}
Вместо console.log вы можете использовать useState
для запуска чего-либо.