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 j'aimerais le faire plus 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 comme je me souviens.
Comment puis-je le faire?
Réponses:
Vous devez utiliser l' attribut tabIndex pour pouvoir écouter l'
onKeyDown
événement sur un div dans React. Le réglagetabIndex="0"
devrait mettre le feu à votre gestionnaire.la source
tabIndex={-1}
peut également être utilisé si vous travaillez avec un élément qui n'est pas interactif et que vous ne souhaitez pas modifier l'ordre de tabulation du document.Vous devez l'écrire de cette façon
Si
onKeyPressed
n'est pas lié àthis
, essayez de le réécrire à l'aide de la fonction de flèche ou de le lier dans le composantconstructor
.la source
console.log
ne produit rien?Vous pensez trop en Javascript pur. Débarrassez-vous de vos écouteurs sur ces méthodes de cycle de vie React et utilisez à la
event.key
place deevent.keyCode
(car il ne s'agit pas d'un objet événement JS, il s'agit d'un événement synthétique React ). Votre composant entier pourrait être aussi simple que cela (en supposant que vous n'ayez pas lié vos méthodes dans un constructeur).la source
event
objet est un React SyntheticEvent .onClick
accessoire au lieu deonKeyDown
déclencher le gestionnaire.La réponse avec
fonctionne pour moi, veuillez noter que tabIndex nécessite un nombre, pas une chaîne, donc tabIndex = "0" ne fonctionne pas.
la source
L'utilisation de l'
div
astuce avectab_index="0"
outabIndex="-1"
fonctionne, mais chaque fois que l'utilisateur se concentre sur une vue qui n'est pas un élément, vous obtenez un aperçu de la mise au point laide sur l'ensemble du site Web. Cela peut être résolu en définissant le CSS pour le div à utiliseroutline: none
dans le focus.Voici l'implémentation avec des composants stylisés:
et dans la classe App:
la source
Il vous manque la liaison de la méthode dans le constructeur. Voici comment React vous propose de le faire:
Il existe d'autres moyens de le faire, mais ce sera le plus efficace lors de l'exécution.
la source
Vous devez empêcher l'événement par défaut de se déclencher.
la source