I want to use a keyDown event on a div in React. I do:
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>
)
}
It works fine, but I would like to do it more in React style. I tried
onKeyDown={this.onKeyPressed}
on the component. But it doesn't react. It works on input elements as I recall.
Codepen: http://codepen.io/lafisrap/pen/OmyBYG
How can I do it?
You should use tabIndex attribute to be able to listen onKeyDown event on a div in React. Setting tabIndex="0" should fire your handler.
You need to write it this way
If
onKeyPressed
is not bound tothis
, then try to rewrite it using arrow function or bind it in the componentconstructor
.You're thinking too much in pure Javascript. Get rid of your listeners on those React lifecycle methods and use
event.key
instead ofevent.keyCode
(because this is not a JS event object, it is a React SyntheticEvent). Your entire component could be as simple as this (assuming you haven't bound your methods in a constructor).