Je souhaite utiliser un événement keyDown sur un div dans React. Je fais:
componentWillMount() {
document.addEventListener("keydown", this.onKeyPressed.bind(this));
}
componentWillUnmount() {
document.removeEventListener("keydown", this.onKeyPressed.bind(this));
}
onKeyPressed(e) {
console.log(e.keyCode);
}
render() {
let player = this.props.boards.dungeons[this.props.boards.currentBoard].player;
return (
<div
className="player"
style={{ position: "absolute" }}
onKeyDown={this.onKeyPressed} // not working
>
<div className="light-circle">
<div className="image-wrapper">
<img src={IMG_URL+player.img} />
</div>
</div>
</div>
)
}
Cela fonctionne bien, mais je voudrais le faire davantage dans le style React. j'ai essayé
onKeyDown={this.onKeyPressed}
sur le composant. Mais ça ne réagit pas. Cela fonctionne sur les éléments d'entrée, si je me souviens bien.
Codepen: http://codepen.io/lafisrap/pen/OmyBYG
Comment puis-je le faire?
Vous devez utiliser tabIndex attribut pour pouvoir écouter l'événement onKeyDown sur un div dans React. La définition de tabIndex = "0" devrait renvoyer votre gestionnaire.
Vous devez l'écrire de cette façon
<div
className="player"
style={{ position: "absolute" }}
onKeyDown={this.onKeyPressed}
tabIndex="0"
>
Si onKeyPressed
n'est pas lié à this
, essayez de la récrire à l'aide de la fonction de flèche ou reliez-la dans le composant constructor
.
Vous pensez trop en Javascript pur. Débarrassez-vous de vos auditeurs avec ces méthodes du cycle de vie de React et utilisez event.key
au lieu de event.keyCode
(puisqu'il ne s'agit pas d'un objet événement JS, il s'agit d'un React SyntheticEvent ). Votre composant entier pourrait être aussi simple que cela (en supposant que vous n'avez pas lié vos méthodes dans un constructeur).
onKeyPressed(e) {
console.log(e.key);
}
render() {
let player = this.props.boards.dungeons[this.props.boards.currentBoard].player;
return (
<div
className="player"
style={{ position: "absolute" }}
onKeyDown={(e) => this.onKeyPressed(e)}
>
<div className="light-circle">
<div className="image-wrapper">
<img src={IMG_URL+player.img} />
</div>
</div>
</div>
)
}