¿Cómo detecto la pulsación de la tecla Esc en reactjs? Lo similar a jquery
$(document).keyup(function(e) {
if (e.keyCode == 27) { // escape key maps to keycode `27`
// <DO YOUR WORK HERE>
}
});
Una vez detectado, quiero pasar la información a los componentes. Tengo 3 componentes de los cuales el último componente activo debe reaccionar a la pulsación de la tecla Escape.
Estaba pensando en una especie de registro cuando un componente se activa
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>
)
}
}
y en todos los componentes
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)}/>
)
}
}
Creo que esto funcionará, pero creo que será más como una devolución de llamada. ¿Hay alguna forma mejor de manejar esto?
javascript
reactjs
Neo
fuente
fuente
Respuestas:
Si está buscando un manejo de eventos clave a nivel de documento, vincularlo durante
componentDidMount
es la mejor manera (como lo muestra el ejemplo de codepen de Brad Colthurst ):Tenga en cuenta que debe asegurarse de eliminar el detector de eventos clave al desmontar para evitar posibles errores y pérdidas de memoria.
EDITAR: Si está usando ganchos, puede usar esta
useEffect
estructura para producir un efecto similar:fuente
addEventListener
yremoveEventListener
?focus
. No es relevante parakeydown
, pero solía no ser opcional, por lo que generalmente se especifica para compatibilidad con IE <9.this.escFunction
a una función comofunction() { this.escFunction(event) }
, de lo contrario, se estaba ejecutando al cargar la página sin ninguna "tecla abajo".Querrás escuchar el escape
keyCode
(27) de ReactSyntheticKeyBoardEvent
onKeyDown
:El CodePen de Brad Colthurst publicado en los comentarios de la pregunta es útil para encontrar códigos clave para otras claves.
fuente
onKeyPress
evento cuando la tecla que se presiona es ESC y el foco está adentro<input type="text" />
. En ese escenario, puede usaronKeyDown
yonKeyUp
, ambos disparan, y en el orden correcto.Otra forma de lograr esto en un componente funcional, es usar
useEffect
yuseFunction
, así:En lugar de console.log, puedes usar
useState
para activar algo.fuente
React usa SyntheticKeyboardEvent para envolver el evento del navegador nativo y este evento Synthetic proporciona un atributo clave con nombre ,
que puede usar así:
fuente
e.key
paraEscape
regresa comoEsc
#triggeredPara una solución de gancho React reutilizable
Uso:
fuente