2017-04-19 23 views
10

ReactのdivでkeyDownイベントを使用したいとします。私は:onKeyDownイベントがリアクションのdivで機能しない

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> 
    ) 
    } 

それはうまく動作しますが、私はリアクションスタイルでもっとやりたいと思います。試しました

 onKeyDown={this.onKeyPressed} 

コンポーネントに。しかし、それは反応しません。これは私が思い出したように入力要素に作用します。

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

私はそれをどのように行うことができますか?

答えて

19

あなたが反応中にdiv要素にイベントをonKeyDownメソッド聞くことができるようにのtabIndex属性を使用する必要があります。 tabIndex = "0"に設定すると、ハンドラが起動されます。

1

あなたはonKeyPressedthisにバインドされていない場合は、矢印の機能を使用して、それを書き換えるまたはコンポーネントconstructorでそれをバインドしようとし、それを書くためにこのよう

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

を必要としています。

+0

申し訳ありません。私は確信していた、私はこれを見逃した。しかし、これは問題ではありません。まだ動作していません。 – Michael

+0

更新された回答。いずれかのキーを押す前に、divをクリックするかフォーカスを合わせる必要があります。 – Panther

+0

しました。動いていない。上記のコードを更新しました。これは、DOMコマンドでうまく動作しますが、リアクションスタイルでは機能しません。 – Michael

0

純粋なJavascriptではあまりにも多くのことを考えています。これらのリアクションライフサイクルメソッドでリスナーを取り除き、event.keyCodeの代わりにevent.keyを使用してください(これはJSイベントオブジェクトではないため、SyntheticEventです)。コンポーネント全体がこのように単純になる可能性があります(コンストラクタでメソッドをバインドしていないことを前提とします)。

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

それは私がそれを書いたかったのです。しかし、地獄、それは行っていない。ここにcodepenはあります:http://codepen.io/lafisrap/pen/OmyBYG。 275行目にコメントすると、キーボードの入力(カーソルキー)が機能しません。 onKeyDownは307行目にあります。 – Michael

+0

keyCodeカーソルキーは文字を返しません。 – Michael

+0

ReactはJavascriptイベントオブジェクトを使用しないため、keyCodeプロパティはありません。その 'event'オブジェクトはReact [SyntheticEvent](https://facebook.github.io/react/docs/events.html)です。 – steel

関連する問題