2017-04-19 20 views
10

Tôi muốn sử dụng sự kiện keyDown trên div trong React. Tôi làm:sự kiện onKeyDown không hoạt động trên divs trong 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> 
    ) 
    } 

Nó hoạt động tốt, nhưng tôi muốn làm nhiều hơn trong kiểu phản ứng. Tôi đã thử

 onKeyDown={this.onKeyPressed} 

trên thành phần. Nhưng nó không phản ứng. Nó hoạt động trên các yếu tố đầu vào như tôi nhớ lại.

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

Tôi làm cách nào?

Trả lời

19

Bạn nên sử dụng tabIndex thuộc tính để có thể lắng nghe onKeyDown sự kiện trên một div trong phản ứng. Cài đặt tabIndex = "0" sẽ kích hoạt trình xử lý của bạn.

1

Bạn cần phải viết nó theo cách này

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

Nếu onKeyPressed không bị ràng buộc để this, sau đó cố gắng viết lại nó sử dụng chức năng mũi tên hoặc ràng buộc nó trong thành phần constructor.

+0

Rất tiếc. Tôi chắc chắn, tôi chỉ bỏ qua điều này. Nhưng đây không phải là vấn đề. Nó vẫn không hoạt động. – Michael

+0

câu trả lời được cập nhật. Bạn nên nhấp vào div hoặc đưa nó vào tiêu điểm trước khi nhấn bất kỳ phím nào. – Panther

+0

Tôi đã làm. Nó không hoạt động. Tôi đã cập nhật mã ở trên. Nó hoạt động tốt với các lệnh DOM, nhưng không hoạt động theo kiểu React. – Michael

0

Bạn đang suy nghĩ quá nhiều về Javascript thuần túy. Loại bỏ các thính giả của bạn trên các phương pháp vòng đời React đó và sử dụng event.key thay vì event.keyCode (vì đây không phải là đối tượng sự kiện JS, nó là một React SyntheticEvent). Toàn bộ thành phần của bạn có thể đơn giản như thế này (giả sử bạn không ràng buộc các phương thức của bạn trong một hàm tạo).

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

Đó chính xác là cách tôi muốn viết nó. Nhưng địa ngục, nó sẽ không xảy ra. Đây là codepen: http://codepen.io/lafisrap/pen/OmyBYG. Nếu bạn nhận xét dòng 275 thì đầu vào của bàn phím (phím con trỏ) không hoạt động. onKeyDown là dòng 307. – Michael

+0

mã phím Tôi sử dụng cho các phím con trỏ, khi chúng không trả lại ký tự nào. – Michael

+0

Phản ứng không sử dụng đối tượng sự kiện Javascript, do đó không có thuộc tính keyCode. Đối tượng 'event' đó là React [SyntheticEvent] (https://facebook.github.io/react/docs/events.html). – steel

Các vấn đề liên quan