2017-04-19 4 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

당신은 반작용의 사업부에 이벤트를 onKeyDown에들을 수 있도록 tabIndex를 속성을 사용해야합니다. tabIndex = "0"으로 설정하면 처리기가 실행됩니다.

1

는 그런 다음, 이런 식 onKeyPressedthis에 바인딩되지 않은 경우

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

쓰기 화살표 기능을 사용하여 다시 작성하거나 구성 요소 constructor에 바인딩을 시도 할 필요가있다.

+0

죄송합니다. 나는 확신했다, 나는 방금 이것을 간과했다. 그러나 이것은 문제가 아닙니다. 아직 작동하지 않습니다. – Michael

+0

업데이트 된 답변 아무 키나 누르기 전에 div를 클릭하거나 초점을 가져와야합니다. – Panther

+0

나는했다. 작동하지 않습니다. 위의 코드를 업데이트했습니다. 그것은 DOM 명령으로는 잘 동작하지만 React 스타일에서는 작동하지 않습니다. – Michael

0

당신은 너무 순수한 자바 스크립트로 생각하고 있습니다. 이러한 라이프 사이클 메소드에서 청취자를 없애고 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

관련 문제