2017-04-19 4 views
10

Je souhaite utiliser un événement keyDown sur un div dans React. Je fais:L'événement onKeyDown ne fonctionne pas sur divs dans React

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 très bien, mais je voudrais 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 si je me souviens bien.

Codepen: http://codepen.io/lafisrap/pen/OmyBYG

Comment puis-je faire?

Répondre

19

Vous devez utiliser tabIndex attribut pour pouvoir écouter onKeyDown événement sur un div dans React. La définition de tabIndex = "0" devrait déclencher votre gestionnaire.

1

Vous devez écrire cette façon

<div 
    className="player" 
    style={{ position: "absolute" }} 
    onKeyDown={this.onKeyPressed} 
    tabIndex="0" 
    > 

Si onKeyPressed est pas lié à this, essayez de le réécrire en utilisant la fonction de flèche ou lier dans le composant constructor.

+0

Désolé. J'étais sûr, j'ai juste négligé le ceci. Mais ce n'est pas le problème. Ça ne marche toujours pas. – Michael

+0

mise à jour de la réponse. Vous devriez soit cliquer sur la div ou l'amener à se concentrer avant d'appuyer sur n'importe quelle touche. – Panther

+0

Je l'ai fait. Ça ne fonctionne pas. J'ai mis à jour le code ci-dessus. Cela fonctionne bien avec les commandes DOM, mais pas dans le style React. – Michael

0

Vous pensez trop au pur Javascript. Débarrassez-vous de vos auditeurs sur ces méthodes de cycle de vie React et utilisez event.key au lieu de event.keyCode (parce que ce n'est pas un objet événement JS, il s'agit d'un Réaction 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> 
) 
} 
+0

C'est exactement comme ça que je voulais l'écrire. Mais bon sang, ça ne va pas. Voici le codepen: http://codepen.io/lafisrap/pen/OmyBYG. Si vous commentez la ligne 275, l'entrée du clavier (touches du curseur) ne fonctionne pas. onKeyDown est à la ligne 307. – Michael

+0

keyCode Je l'utilise pour les touches de curseur, car elles ne renvoient aucun caractère. – Michael

+0

React n'utilise pas d'objets d'événement Javascript, il n'y a donc pas de propriété keyCode. Cet objet 'event' est un React [SyntheticEvent] (https://facebook.github.io/react/docs/events.html). – steel